├── .gitattributes ├── .github └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── SOURCES.md ├── art ├── 221018-14.40.26lrg.mp4 ├── 221111-14.11.25.mp4 ├── 8a.gif ├── Image 2022-11-08 at 7.05.51 PM.png ├── Image 2022-11-11 at 9.19.20 PM.png ├── a.gif ├── a2.gif ├── arena.ai ├── comp2.mp4 ├── gifinprogress.tif ├── layout.png ├── map.txt ├── notes.txt ├── palette.png ├── u4a.gif ├── u4b.gif └── u4c.gif ├── karma.conf.js ├── package-lock.json ├── package.json ├── resources └── public │ ├── _asset │ ├── UniVGA16.ttf │ ├── gif │ │ ├── planet.gif │ │ ├── ripples.gif │ │ ├── scroll.gif │ │ ├── sparkle.gif │ │ ├── takase.gif │ │ └── tan.gif │ ├── logo.png │ └── svg │ │ ├── arena-inv.svg │ │ ├── arena.svg │ │ ├── close.svg │ │ ├── github-inv.svg │ │ ├── github.svg │ │ ├── power-inv.svg │ │ └── power.svg │ ├── _css │ ├── base.css │ └── reset.css │ ├── favicon.ico │ └── index.html ├── shadow-cljs.edn └── src └── kees └── arena_graph ├── config.cljs ├── graphs.cljs ├── logic.cljs ├── main.cljs ├── rf.cljs ├── rf ├── console.cljs └── flavor.cljs └── views.cljs /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Build, sync, invalidate 2 | 3 | # NEEDS: 4 | # Secrets: 5 | # AWS_ACCESS_KEY_ID 6 | # AWS_SECRET_ACCESS_KEY 7 | # AWS_REGION 8 | # AWS_S3_BUCKET 9 | # AWS_CLOUDFRONT_DIST 10 | # UPDATE: 11 | # rm paths 12 | # s3 sync parameters 13 | # invalidation parameters 14 | 15 | on: 16 | workflow_dispatch: 17 | 18 | jobs: 19 | publish: 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - name: Checkout 24 | uses: actions/checkout@main 25 | 26 | - name: Cache (NPM) 27 | uses: actions/cache@main 28 | with: 29 | path: ~/.npm 30 | key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }} 31 | restore-keys: ${{ runner.os }}-node-modules- 32 | - name: Cache (shadow-cljs) 33 | uses: actions/cache@main 34 | with: 35 | path: .shadow-cljs 36 | key: ${{ runner.os }}-shadow-cljs-${{ hashFiles('**/shadow-cljs.edn') }} 37 | restore-keys: ${{ runner.os }}-shadow-cljs- 38 | 39 | - name: Build 40 | run: | 41 | npm i 42 | npm run release 43 | 44 | - name: Purge 45 | run: | 46 | rm -fv resources/public/_js/compiled/manifest.edn 47 | rm -rfv resources/public/_js/compiled/cljs-runtime 48 | 49 | - name: AWS Credentials 50 | uses: aws-actions/configure-aws-credentials@v1 51 | with: 52 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 53 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 54 | aws-region: ${{ secrets.AWS_REGION }} 55 | 56 | - name: Sync 57 | uses: badsyntax/github-action-aws-s3@master 58 | id: sync-html-s3 59 | with: 60 | bucket: ${{ secrets.AWS_S3_BUCKET }} 61 | aws-region: ${{ secrets.AWS_REGION }} 62 | action: 'sync' 63 | src-dir: './resources/public' 64 | prefix: 'projects/g02-graph' 65 | files-glob: '*' 66 | 67 | - name: Invalidate 68 | uses: badsyntax/github-action-aws-cloudfront@master 69 | with: 70 | distribution-id: ${{ secrets.AWS_CLOUDFRONT_DIST }} 71 | aws-region: ${{ secrets.AWS_REGION }} 72 | include-origin-prefix: false 73 | origin-prefix: '' 74 | invalidate-paths: '/projects/g02-graph/*' 75 | default-root-object: 'index.html' 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Autogen files 4 | /.shadow-cljs/ 5 | /.clj-kondo/ 6 | /.lsp/ 7 | /.calva/ 8 | /*-init.clj 9 | /*.log 10 | /.nrepl-port 11 | 12 | # Project files 13 | /node_modules/ 14 | /out/ 15 | /target/ 16 | /resources/public/_js/compiled/ 17 | /dev/auth.cljs 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Kees 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kees/arena-graph 2 | 3 | ![I don't do much!](https://user-images.githubusercontent.com/6820950/189788029-f401bf54-31f8-47c5-9afd-abe829e07637.png) 4 | 5 | ## What: 6 | 7 | The goal of this web app is visualize the [channels](https://support.are.na/help/whats-a-channel) an [are.na](https://www.are.na/) channel connects to, and their subsequent channel connections, in an interactive [undirected graph](https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)#Graph). 8 | 9 | The [d3 force graph layout](https://github.com/d3/d3-force) and [its react bindings](https://github.com/vasturiano/react-force-graph/) are really useful to make graphs that are kinetic, cute, fun, and descriptive, with very low effort using [reagent](https://github.com/reagent-project/reagent) in [CLJS](https://clojurescript.org/). 10 | 11 | ## And 12 | 13 | Going beyond the second order of connections (single parent channel → children → grandchildren) seems too heavy for a public-facing web app using a medium-size social website. I think this is the appropriate scope. 14 | 15 | Contributions are welcome. The UI framework I'm most comfortable with is [re-frame](https://github.com/day8/re-frame), so this whole app is built in clojurescript with re-frame. 16 | 17 | Native language additions are easiest, however, the whole JS/React/Node package ecosystem is at arm's reach and running isolated JS scripts on demand (maybe TS too) is also pretty easy. 18 | 19 | The current build is manually published and may not reflect the most recent changes. You can test the latest with: 20 | 21 | - A IDE supporting Clojure 22 | - A web browser with CORS security policies disabled.
23 | Example: 24 | 25 | ```sh 26 | rm -r /tmp/chro/ # Be careful 27 | open -na Chromium --args --disable-web-security --user-data-dir="/tmp/chro" 28 | ``` 29 | 30 |
31 | 32 | - A clone of this repo 33 | - The commands below 34 | 35 | ## Upcoming: 36 | 37 |
38 | Tasks 39 | 40 | - [x] [re-frame-http-fx](https://github.com/day8/re-frame-http-fx) to better integrate [are.na API](https://dev.are.na/documentation/channels) requests into re-frame handlers ([1](https://day8.github.io/re-frame/EffectfulHandlers/) [2](https://day8.github.io/re-frame/Effects/)) 41 | - [x] Better status output 42 | - [ ] Better division between state, logic, and flavor 43 | - [ ] Redo GET loops 44 | - [x] Separate request flows 45 | - [x] Original channel attributes / 0 order 46 | - [x] Directly connected channels / 1st order 47 | - [x] Mutually connected channels / 2nd order 48 | - [x] Node connectivity 49 | - [x] All 1st order connect to 0 order 50 | - [x] All 2nd order connect to relevant connections(!) not parents 51 | - [x] Request pagination 52 | - [x] Node styling 53 | - [x] Node size within variance by order 54 | - [x] Node random color within variance by order 55 | - [x] Oauth(?) realized it's unnecessary for an initial build 56 | - [x] Add hover info block 57 | - [ ] Flow layout and add visuals 58 | - [ ] UI refine 59 | - [x] Kill nonessential inputs 60 | - [x] Re-theme 61 | - [ ] More advanced button visibility state 62 | - [x] Funny anim block 63 | - [ ] Maximize content in space 64 | - [ ] Better loading / button visibility logic 65 | - [x] Mobile layout fix 66 | 67 |
68 | 69 | (archival) 70 | 71 |
72 | Old todo 73 | 74 | - [x] Channel info 75 | - [x] Restyle 76 | - [x] Add more information 77 | - [x] Progress bar for 1st order % completed callbacks 78 | - [x] Gifs loader 79 | - [x] Fix tangent gif 80 | - [x] Sliding doors 81 | - [x] Make sure sliding doors don’t lag 82 | (I think this is from 10x) 83 | - [x] Input 84 | - [x] Retime buttons 85 | - [x] Sliding door on load 86 | - [x] Skip intro 87 | - [ ] Mobile layout 88 | - [ ] Reflow properly 89 | - [ ] Set graph area dimensions on load based on window size 90 | - [x] Error handling 91 | - [x] Private channel silent fail 92 | - [ ] More descriptive progress logs 93 |
94 | 95 | ## What I'd welcome help with 96 | 97 | - Optimizing the way the app makes series of potentially many API requests 98 | - Further developing the styles of graph nodes and links. Basic react interop in CLJS is very easy but difficult to scale. 99 | - More fun features to interact with the visualization 100 | - Accessibility guidance 101 | 102 | --- 103 | 104 | Run this to work on the project. For now you can include your own token in [rf.cljs](src/kees/arena_graph/rf.cljs). The token is only necessary for private channels. 105 | 106 | ```sh 107 | npm i 108 | npm run watch # Or jack in 109 | open http://localhost:8280 110 | ``` 111 | -------------------------------------------------------------------------------- /SOURCES.md: -------------------------------------------------------------------------------- 1 | # Sources 2 | 3 | Keeping track of what sources used for external assets 4 | 5 | ## Gifs 6 | 7 | ### Completed 8 | 9 | - [Spinning planet](https://www.are.na/block/17786545) 10 | - [Glossy ripples](https://www.are.na/block/1440291) 11 | - [Graph thing](https://www.are.na/block/3721255) 12 | - [Virtual thumb scroll](https://www.are.na/block/537739) 13 | - [Star flicker](https://www.are.na/block/239405) 14 | 15 | ### Unused or incomplete 16 | 17 | - [CPU](https://www.are.na/block/13372663) (via [atenuousrowbetween](https://www.tumblr.com/atenuousrowbetween/96212983604/centralprocessingunitcpu-better-in-dark)) 18 | -------------------------------------------------------------------------------- /art/221018-14.40.26lrg.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/221018-14.40.26lrg.mp4 -------------------------------------------------------------------------------- /art/221111-14.11.25.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/221111-14.11.25.mp4 -------------------------------------------------------------------------------- /art/8a.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/8a.gif -------------------------------------------------------------------------------- /art/Image 2022-11-08 at 7.05.51 PM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/Image 2022-11-08 at 7.05.51 PM.png -------------------------------------------------------------------------------- /art/Image 2022-11-11 at 9.19.20 PM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/Image 2022-11-11 at 9.19.20 PM.png -------------------------------------------------------------------------------- /art/a.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/a.gif -------------------------------------------------------------------------------- /art/a2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/a2.gif -------------------------------------------------------------------------------- /art/arena.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/arena.ai -------------------------------------------------------------------------------- /art/comp2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/comp2.mp4 -------------------------------------------------------------------------------- /art/gifinprogress.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/gifinprogress.tif -------------------------------------------------------------------------------- /art/layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/layout.png -------------------------------------------------------------------------------- /art/map.txt: -------------------------------------------------------------------------------- 1 | #180906 2 | ;bg 3 | 4 | #F6CA18 5 | ; main 6 | 7 | ;#fcdf5d 8 | ;main lighter 9 | 10 | #9BF1E1 11 | 12 | #7FF7EF 13 | #7FE2B7 14 | #F7F54C -------------------------------------------------------------------------------- /art/notes.txt: -------------------------------------------------------------------------------- 1 | #F6CA18 main color 2 | #180906 bg 3 | #fcdf5d lighter main color 4 | 5 | --change-color "#BBBBBB" "#180906" \ 6 | --change-color "#FFFFFF" "#F6CA18" \ 7 | --change-color "#F493F6" "#fcdf5d" \ 8 | --change-color "#8EF7FB" "#fcdf5d" \ 9 | --change-color "#94382E" "#9BF1E1" \ 10 | --change-color "#4C8AF7" "#7FF7EF" \ 11 | --change-color "#F88D48" "#7FE2B7" \ 12 | --change-color "#F7F54C" "#F7F54C" \ 13 | 14 | --change-color "#" "#" \ 15 | 16 | --change-color "#000000" "#180906" \ 17 | --change-color "#140e02" "#180906" \ 18 | --change-color "#1a1202" "#180906" \ 19 | --change-color "#4a3306" "#f6ca18" \ 20 | --change-color "#80590a" "#f6ca18" \ 21 | --change-color "#b37c0e" "#f6c709" \ 22 | --change-color "#e7a012" "#fcdf5d" \ 23 | --change-color "#efac27" "#fcdf5d" \ 24 | --change-color "#f1b743" "#FCE683" \ 25 | --change-color "#f3c05a" "#fadd6b" \ 26 | --change-color "#f5ca74" "#fbe89d" \ 27 | --change-color "#fefaf2" "#fdf4ce" \ -------------------------------------------------------------------------------- /art/palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/palette.png -------------------------------------------------------------------------------- /art/u4a.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4a.gif -------------------------------------------------------------------------------- /art/u4b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4b.gif -------------------------------------------------------------------------------- /art/u4c.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4c.gif -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | module.exports = function (config) { 2 | var junitOutputDir = process.env.CIRCLE_TEST_REPORTS || "target/junit" 3 | 4 | config.set({ 5 | browsers: ['ChromeHeadless'], 6 | basePath: 'target', 7 | files: ['karma-test.js'], 8 | frameworks: ['cljs-test'], 9 | plugins: [ 10 | 'karma-cljs-test', 11 | 'karma-chrome-launcher', 12 | 'karma-junit-reporter' 13 | ], 14 | colors: true, 15 | logLevel: config.LOG_INFO, 16 | client: { 17 | args: ['shadow.test.karma.init'] 18 | }, 19 | 20 | // the default configuration 21 | junitReporter: { 22 | outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml 23 | outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile 24 | suite: '' // suite will become the package name attribute in xml testsuite element 25 | } 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arena-graph", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "arena-graph", 8 | "dependencies": { 9 | "highlight.js": "11.5.1", 10 | "react": "17.0.2", 11 | "react-dom": "17.0.2", 12 | "react-force-graph-2d": "^1.23.11" 13 | }, 14 | "devDependencies": { 15 | "shadow-cljs": "2.20.1" 16 | } 17 | }, 18 | "node_modules/@tweenjs/tween.js": { 19 | "version": "18.6.4", 20 | "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", 21 | "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==" 22 | }, 23 | "node_modules/accessor-fn": { 24 | "version": "1.3.2", 25 | "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.3.2.tgz", 26 | "integrity": "sha512-W4/Lj/gry8AHy+IC7Havr7fNbphHDzVAiZd5h10g8LRRz6ZKla3A1/lkFqoV1jh13R0eJLGWjDBlRGK36fcWiw==" 27 | }, 28 | "node_modules/asn1.js": { 29 | "version": "5.4.1", 30 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 31 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 32 | "dev": true, 33 | "dependencies": { 34 | "bn.js": "^4.0.0", 35 | "inherits": "^2.0.1", 36 | "minimalistic-assert": "^1.0.0", 37 | "safer-buffer": "^2.1.0" 38 | } 39 | }, 40 | "node_modules/asn1.js/node_modules/bn.js": { 41 | "version": "4.12.0", 42 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 43 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 44 | "dev": true 45 | }, 46 | "node_modules/assert": { 47 | "version": "1.5.0", 48 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 49 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 50 | "dev": true, 51 | "dependencies": { 52 | "object-assign": "^4.1.1", 53 | "util": "0.10.3" 54 | } 55 | }, 56 | "node_modules/assert/node_modules/inherits": { 57 | "version": "2.0.1", 58 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 59 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", 60 | "dev": true 61 | }, 62 | "node_modules/assert/node_modules/util": { 63 | "version": "0.10.3", 64 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 65 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", 66 | "dev": true, 67 | "dependencies": { 68 | "inherits": "2.0.1" 69 | } 70 | }, 71 | "node_modules/base64-js": { 72 | "version": "1.5.1", 73 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 74 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 75 | "dev": true, 76 | "funding": [ 77 | { 78 | "type": "github", 79 | "url": "https://github.com/sponsors/feross" 80 | }, 81 | { 82 | "type": "patreon", 83 | "url": "https://www.patreon.com/feross" 84 | }, 85 | { 86 | "type": "consulting", 87 | "url": "https://feross.org/support" 88 | } 89 | ] 90 | }, 91 | "node_modules/bezier-js": { 92 | "version": "6.1.0", 93 | "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.0.tgz", 94 | "integrity": "sha512-oc8fkHqG0R+dQuNiXVbPMB0cc8iDqkLAjbA2gq26QmV8tZqW9GGI7iNEX1ioRWlZperQS7v5BX03+9FLVWZbSw==", 95 | "funding": { 96 | "type": "individual", 97 | "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" 98 | } 99 | }, 100 | "node_modules/bn.js": { 101 | "version": "5.2.1", 102 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 103 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", 104 | "dev": true 105 | }, 106 | "node_modules/brorand": { 107 | "version": "1.1.0", 108 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 109 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", 110 | "dev": true 111 | }, 112 | "node_modules/browserify-aes": { 113 | "version": "1.2.0", 114 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 115 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 116 | "dev": true, 117 | "dependencies": { 118 | "buffer-xor": "^1.0.3", 119 | "cipher-base": "^1.0.0", 120 | "create-hash": "^1.1.0", 121 | "evp_bytestokey": "^1.0.3", 122 | "inherits": "^2.0.1", 123 | "safe-buffer": "^5.0.1" 124 | } 125 | }, 126 | "node_modules/browserify-cipher": { 127 | "version": "1.0.1", 128 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 129 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 130 | "dev": true, 131 | "dependencies": { 132 | "browserify-aes": "^1.0.4", 133 | "browserify-des": "^1.0.0", 134 | "evp_bytestokey": "^1.0.0" 135 | } 136 | }, 137 | "node_modules/browserify-des": { 138 | "version": "1.0.2", 139 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 140 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 141 | "dev": true, 142 | "dependencies": { 143 | "cipher-base": "^1.0.1", 144 | "des.js": "^1.0.0", 145 | "inherits": "^2.0.1", 146 | "safe-buffer": "^5.1.2" 147 | } 148 | }, 149 | "node_modules/browserify-rsa": { 150 | "version": "4.1.0", 151 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 152 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 153 | "dev": true, 154 | "dependencies": { 155 | "bn.js": "^5.0.0", 156 | "randombytes": "^2.0.1" 157 | } 158 | }, 159 | "node_modules/browserify-sign": { 160 | "version": "4.2.1", 161 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 162 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 163 | "dev": true, 164 | "dependencies": { 165 | "bn.js": "^5.1.1", 166 | "browserify-rsa": "^4.0.1", 167 | "create-hash": "^1.2.0", 168 | "create-hmac": "^1.1.7", 169 | "elliptic": "^6.5.3", 170 | "inherits": "^2.0.4", 171 | "parse-asn1": "^5.1.5", 172 | "readable-stream": "^3.6.0", 173 | "safe-buffer": "^5.2.0" 174 | } 175 | }, 176 | "node_modules/browserify-sign/node_modules/readable-stream": { 177 | "version": "3.6.0", 178 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 179 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 180 | "dev": true, 181 | "dependencies": { 182 | "inherits": "^2.0.3", 183 | "string_decoder": "^1.1.1", 184 | "util-deprecate": "^1.0.1" 185 | }, 186 | "engines": { 187 | "node": ">= 6" 188 | } 189 | }, 190 | "node_modules/browserify-zlib": { 191 | "version": "0.2.0", 192 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 193 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 194 | "dev": true, 195 | "dependencies": { 196 | "pako": "~1.0.5" 197 | } 198 | }, 199 | "node_modules/buffer": { 200 | "version": "4.9.2", 201 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 202 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 203 | "dev": true, 204 | "dependencies": { 205 | "base64-js": "^1.0.2", 206 | "ieee754": "^1.1.4", 207 | "isarray": "^1.0.0" 208 | } 209 | }, 210 | "node_modules/buffer-xor": { 211 | "version": "1.0.3", 212 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 213 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", 214 | "dev": true 215 | }, 216 | "node_modules/builtin-status-codes": { 217 | "version": "3.0.0", 218 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 219 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", 220 | "dev": true 221 | }, 222 | "node_modules/canvas-color-tracker": { 223 | "version": "1.1.6", 224 | "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.1.6.tgz", 225 | "integrity": "sha512-LpKiona7TwN0rpLgGcdvAw/HVV9HGCSSyOoSJkLyUP+VZmTX2uAnunGVoKrEHQ/7i+lyu6HfazdHV93vLrjK5Q==", 226 | "dependencies": { 227 | "tinycolor2": "^1.4.2" 228 | } 229 | }, 230 | "node_modules/cipher-base": { 231 | "version": "1.0.4", 232 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 233 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 234 | "dev": true, 235 | "dependencies": { 236 | "inherits": "^2.0.1", 237 | "safe-buffer": "^5.0.1" 238 | } 239 | }, 240 | "node_modules/console-browserify": { 241 | "version": "1.2.0", 242 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 243 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 244 | "dev": true 245 | }, 246 | "node_modules/constants-browserify": { 247 | "version": "1.0.0", 248 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 249 | "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", 250 | "dev": true 251 | }, 252 | "node_modules/core-util-is": { 253 | "version": "1.0.3", 254 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 255 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 256 | "dev": true 257 | }, 258 | "node_modules/create-ecdh": { 259 | "version": "4.0.4", 260 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 261 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 262 | "dev": true, 263 | "dependencies": { 264 | "bn.js": "^4.1.0", 265 | "elliptic": "^6.5.3" 266 | } 267 | }, 268 | "node_modules/create-ecdh/node_modules/bn.js": { 269 | "version": "4.12.0", 270 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 271 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 272 | "dev": true 273 | }, 274 | "node_modules/create-hash": { 275 | "version": "1.2.0", 276 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 277 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 278 | "dev": true, 279 | "dependencies": { 280 | "cipher-base": "^1.0.1", 281 | "inherits": "^2.0.1", 282 | "md5.js": "^1.3.4", 283 | "ripemd160": "^2.0.1", 284 | "sha.js": "^2.4.0" 285 | } 286 | }, 287 | "node_modules/create-hmac": { 288 | "version": "1.1.7", 289 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 290 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 291 | "dev": true, 292 | "dependencies": { 293 | "cipher-base": "^1.0.3", 294 | "create-hash": "^1.1.0", 295 | "inherits": "^2.0.1", 296 | "ripemd160": "^2.0.0", 297 | "safe-buffer": "^5.0.1", 298 | "sha.js": "^2.4.8" 299 | } 300 | }, 301 | "node_modules/crypto-browserify": { 302 | "version": "3.12.0", 303 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 304 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 305 | "dev": true, 306 | "dependencies": { 307 | "browserify-cipher": "^1.0.0", 308 | "browserify-sign": "^4.0.0", 309 | "create-ecdh": "^4.0.0", 310 | "create-hash": "^1.1.0", 311 | "create-hmac": "^1.1.0", 312 | "diffie-hellman": "^5.0.0", 313 | "inherits": "^2.0.1", 314 | "pbkdf2": "^3.0.3", 315 | "public-encrypt": "^4.0.0", 316 | "randombytes": "^2.0.0", 317 | "randomfill": "^1.0.3" 318 | }, 319 | "engines": { 320 | "node": "*" 321 | } 322 | }, 323 | "node_modules/d3-array": { 324 | "version": "3.2.0", 325 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", 326 | "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", 327 | "dependencies": { 328 | "internmap": "1 - 2" 329 | }, 330 | "engines": { 331 | "node": ">=12" 332 | } 333 | }, 334 | "node_modules/d3-binarytree": { 335 | "version": "0.2.2", 336 | "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-0.2.2.tgz", 337 | "integrity": "sha512-TmgSEKWO4lSjX26Rk77hbTdiF3TQ1v5LqL+cmSz6/5RiSxmq6+e6qHE6X/KwrsIESekhEReH63X5yM8dvXaT7A==" 338 | }, 339 | "node_modules/d3-color": { 340 | "version": "3.1.0", 341 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", 342 | "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", 343 | "engines": { 344 | "node": ">=12" 345 | } 346 | }, 347 | "node_modules/d3-dispatch": { 348 | "version": "3.0.1", 349 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", 350 | "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", 351 | "engines": { 352 | "node": ">=12" 353 | } 354 | }, 355 | "node_modules/d3-drag": { 356 | "version": "3.0.0", 357 | "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", 358 | "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", 359 | "dependencies": { 360 | "d3-dispatch": "1 - 3", 361 | "d3-selection": "3" 362 | }, 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/d3-ease": { 368 | "version": "3.0.1", 369 | "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", 370 | "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", 371 | "engines": { 372 | "node": ">=12" 373 | } 374 | }, 375 | "node_modules/d3-force-3d": { 376 | "version": "3.0.3", 377 | "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.3.tgz", 378 | "integrity": "sha512-8HGTbw6y35UYManGCPU4+b9/PGgnyjzRq80DRsp7zFsRl0leVz2pzwx18dwkPe4rDxTOEpM4BuWQ2krbVaGQQA==", 379 | "dependencies": { 380 | "d3-binarytree": "^0.2.0", 381 | "d3-dispatch": "1 - 3", 382 | "d3-octree": "^0.2.0", 383 | "d3-quadtree": "1 - 3", 384 | "d3-timer": "1 - 3" 385 | }, 386 | "engines": { 387 | "node": ">=12" 388 | } 389 | }, 390 | "node_modules/d3-format": { 391 | "version": "3.1.0", 392 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", 393 | "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", 394 | "engines": { 395 | "node": ">=12" 396 | } 397 | }, 398 | "node_modules/d3-interpolate": { 399 | "version": "3.0.1", 400 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", 401 | "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", 402 | "dependencies": { 403 | "d3-color": "1 - 3" 404 | }, 405 | "engines": { 406 | "node": ">=12" 407 | } 408 | }, 409 | "node_modules/d3-octree": { 410 | "version": "0.2.2", 411 | "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-0.2.2.tgz", 412 | "integrity": "sha512-ysk9uSPAhZVb0Gq4GXzghl/Yqxu80dHrq55I53qaIMdGB65+0UfO84sr4Fci2JHumcgh6H4WE0r8LwxPagkE+g==" 413 | }, 414 | "node_modules/d3-quadtree": { 415 | "version": "3.0.1", 416 | "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", 417 | "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", 418 | "engines": { 419 | "node": ">=12" 420 | } 421 | }, 422 | "node_modules/d3-scale": { 423 | "version": "4.0.2", 424 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", 425 | "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", 426 | "dependencies": { 427 | "d3-array": "2.10.0 - 3", 428 | "d3-format": "1 - 3", 429 | "d3-interpolate": "1.2.0 - 3", 430 | "d3-time": "2.1.1 - 3", 431 | "d3-time-format": "2 - 4" 432 | }, 433 | "engines": { 434 | "node": ">=12" 435 | } 436 | }, 437 | "node_modules/d3-scale-chromatic": { 438 | "version": "3.0.0", 439 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", 440 | "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", 441 | "dependencies": { 442 | "d3-color": "1 - 3", 443 | "d3-interpolate": "1 - 3" 444 | }, 445 | "engines": { 446 | "node": ">=12" 447 | } 448 | }, 449 | "node_modules/d3-selection": { 450 | "version": "3.0.0", 451 | "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", 452 | "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", 453 | "engines": { 454 | "node": ">=12" 455 | } 456 | }, 457 | "node_modules/d3-time": { 458 | "version": "3.0.0", 459 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", 460 | "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", 461 | "dependencies": { 462 | "d3-array": "2 - 3" 463 | }, 464 | "engines": { 465 | "node": ">=12" 466 | } 467 | }, 468 | "node_modules/d3-time-format": { 469 | "version": "4.1.0", 470 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", 471 | "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", 472 | "dependencies": { 473 | "d3-time": "1 - 3" 474 | }, 475 | "engines": { 476 | "node": ">=12" 477 | } 478 | }, 479 | "node_modules/d3-timer": { 480 | "version": "3.0.1", 481 | "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", 482 | "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", 483 | "engines": { 484 | "node": ">=12" 485 | } 486 | }, 487 | "node_modules/d3-transition": { 488 | "version": "3.0.1", 489 | "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", 490 | "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", 491 | "dependencies": { 492 | "d3-color": "1 - 3", 493 | "d3-dispatch": "1 - 3", 494 | "d3-ease": "1 - 3", 495 | "d3-interpolate": "1 - 3", 496 | "d3-timer": "1 - 3" 497 | }, 498 | "engines": { 499 | "node": ">=12" 500 | }, 501 | "peerDependencies": { 502 | "d3-selection": "2 - 3" 503 | } 504 | }, 505 | "node_modules/d3-zoom": { 506 | "version": "3.0.0", 507 | "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", 508 | "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", 509 | "dependencies": { 510 | "d3-dispatch": "1 - 3", 511 | "d3-drag": "2 - 3", 512 | "d3-interpolate": "1 - 3", 513 | "d3-selection": "2 - 3", 514 | "d3-transition": "2 - 3" 515 | }, 516 | "engines": { 517 | "node": ">=12" 518 | } 519 | }, 520 | "node_modules/debounce": { 521 | "version": "1.2.1", 522 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", 523 | "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" 524 | }, 525 | "node_modules/des.js": { 526 | "version": "1.0.1", 527 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 528 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 529 | "dev": true, 530 | "dependencies": { 531 | "inherits": "^2.0.1", 532 | "minimalistic-assert": "^1.0.0" 533 | } 534 | }, 535 | "node_modules/diffie-hellman": { 536 | "version": "5.0.3", 537 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 538 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 539 | "dev": true, 540 | "dependencies": { 541 | "bn.js": "^4.1.0", 542 | "miller-rabin": "^4.0.0", 543 | "randombytes": "^2.0.0" 544 | } 545 | }, 546 | "node_modules/diffie-hellman/node_modules/bn.js": { 547 | "version": "4.12.0", 548 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 549 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 550 | "dev": true 551 | }, 552 | "node_modules/domain-browser": { 553 | "version": "1.2.0", 554 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 555 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 556 | "dev": true, 557 | "engines": { 558 | "node": ">=0.4", 559 | "npm": ">=1.2" 560 | } 561 | }, 562 | "node_modules/elliptic": { 563 | "version": "6.5.4", 564 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 565 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 566 | "dev": true, 567 | "dependencies": { 568 | "bn.js": "^4.11.9", 569 | "brorand": "^1.1.0", 570 | "hash.js": "^1.0.0", 571 | "hmac-drbg": "^1.0.1", 572 | "inherits": "^2.0.4", 573 | "minimalistic-assert": "^1.0.1", 574 | "minimalistic-crypto-utils": "^1.0.1" 575 | } 576 | }, 577 | "node_modules/elliptic/node_modules/bn.js": { 578 | "version": "4.12.0", 579 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 580 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 581 | "dev": true 582 | }, 583 | "node_modules/events": { 584 | "version": "3.3.0", 585 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 586 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 587 | "dev": true, 588 | "engines": { 589 | "node": ">=0.8.x" 590 | } 591 | }, 592 | "node_modules/evp_bytestokey": { 593 | "version": "1.0.3", 594 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 595 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 596 | "dev": true, 597 | "dependencies": { 598 | "md5.js": "^1.3.4", 599 | "safe-buffer": "^5.1.1" 600 | } 601 | }, 602 | "node_modules/force-graph": { 603 | "version": "1.42.16", 604 | "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.42.16.tgz", 605 | "integrity": "sha512-ypgtQHOZCPDTB1nVB5k1CpEdaqjCzuLpNKd9msuoLwisBQtXE1V11PDLIza7Y06C3mPAHc+dl49GyQi8V1SR5w==", 606 | "dependencies": { 607 | "@tweenjs/tween.js": "18", 608 | "accessor-fn": "1", 609 | "bezier-js": "3 - 6", 610 | "canvas-color-tracker": "1", 611 | "d3-array": "1 - 3", 612 | "d3-drag": "2 - 3", 613 | "d3-force-3d": "2 - 3", 614 | "d3-scale": "1 - 4", 615 | "d3-scale-chromatic": "1 - 3", 616 | "d3-selection": "2 - 3", 617 | "d3-zoom": "2 - 3", 618 | "index-array-by": "1", 619 | "kapsule": "^1.13", 620 | "lodash.throttle": "4" 621 | } 622 | }, 623 | "node_modules/fromentries": { 624 | "version": "1.3.2", 625 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", 626 | "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", 627 | "funding": [ 628 | { 629 | "type": "github", 630 | "url": "https://github.com/sponsors/feross" 631 | }, 632 | { 633 | "type": "patreon", 634 | "url": "https://www.patreon.com/feross" 635 | }, 636 | { 637 | "type": "consulting", 638 | "url": "https://feross.org/support" 639 | } 640 | ] 641 | }, 642 | "node_modules/hash-base": { 643 | "version": "3.1.0", 644 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 645 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 646 | "dev": true, 647 | "dependencies": { 648 | "inherits": "^2.0.4", 649 | "readable-stream": "^3.6.0", 650 | "safe-buffer": "^5.2.0" 651 | }, 652 | "engines": { 653 | "node": ">=4" 654 | } 655 | }, 656 | "node_modules/hash-base/node_modules/readable-stream": { 657 | "version": "3.6.0", 658 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 659 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 660 | "dev": true, 661 | "dependencies": { 662 | "inherits": "^2.0.3", 663 | "string_decoder": "^1.1.1", 664 | "util-deprecate": "^1.0.1" 665 | }, 666 | "engines": { 667 | "node": ">= 6" 668 | } 669 | }, 670 | "node_modules/hash.js": { 671 | "version": "1.1.7", 672 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 673 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 674 | "dev": true, 675 | "dependencies": { 676 | "inherits": "^2.0.3", 677 | "minimalistic-assert": "^1.0.1" 678 | } 679 | }, 680 | "node_modules/highlight.js": { 681 | "version": "11.5.1", 682 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", 683 | "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==", 684 | "engines": { 685 | "node": ">=12.0.0" 686 | } 687 | }, 688 | "node_modules/hmac-drbg": { 689 | "version": "1.0.1", 690 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 691 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", 692 | "dev": true, 693 | "dependencies": { 694 | "hash.js": "^1.0.3", 695 | "minimalistic-assert": "^1.0.0", 696 | "minimalistic-crypto-utils": "^1.0.1" 697 | } 698 | }, 699 | "node_modules/https-browserify": { 700 | "version": "1.0.0", 701 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 702 | "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", 703 | "dev": true 704 | }, 705 | "node_modules/ieee754": { 706 | "version": "1.2.1", 707 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 708 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 709 | "dev": true, 710 | "funding": [ 711 | { 712 | "type": "github", 713 | "url": "https://github.com/sponsors/feross" 714 | }, 715 | { 716 | "type": "patreon", 717 | "url": "https://www.patreon.com/feross" 718 | }, 719 | { 720 | "type": "consulting", 721 | "url": "https://feross.org/support" 722 | } 723 | ] 724 | }, 725 | "node_modules/index-array-by": { 726 | "version": "1.3.3", 727 | "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.3.3.tgz", 728 | "integrity": "sha512-dpqV1sX+hx4s0RqAT97ypk9xzcAXJ0XK27p3bTgPy8bjbJAX6Kf7RU3pPXgmg9hhO7f5/WxO354v2f/A0/fz3Q==" 729 | }, 730 | "node_modules/inherits": { 731 | "version": "2.0.4", 732 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 733 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 734 | "dev": true 735 | }, 736 | "node_modules/internmap": { 737 | "version": "2.0.3", 738 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", 739 | "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", 740 | "engines": { 741 | "node": ">=12" 742 | } 743 | }, 744 | "node_modules/isarray": { 745 | "version": "1.0.0", 746 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 747 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 748 | "dev": true 749 | }, 750 | "node_modules/isexe": { 751 | "version": "2.0.0", 752 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 753 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 754 | "dev": true 755 | }, 756 | "node_modules/jerrypick": { 757 | "version": "1.0.5", 758 | "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.0.5.tgz", 759 | "integrity": "sha512-95dIyL2QXqevDDJ70rmiqKLsTi+riZftLQo708tSFR/O5pQOf6VscDhjnN8mkNQwqnQmGhw+6dfZ5d4bmH/yww==" 760 | }, 761 | "node_modules/js-tokens": { 762 | "version": "4.0.0", 763 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 764 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 765 | }, 766 | "node_modules/kapsule": { 767 | "version": "1.13.8", 768 | "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.13.8.tgz", 769 | "integrity": "sha512-Y1lLt1htHNofIM5kxS5OdEqDm7WFqHF4hm6DrrvNEKIJugfQrxDBycV41QI5FpnBGHqyBD99VpTB5ARnlufP6w==", 770 | "dependencies": { 771 | "debounce": "^1.2.1" 772 | } 773 | }, 774 | "node_modules/lodash.throttle": { 775 | "version": "4.1.1", 776 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 777 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" 778 | }, 779 | "node_modules/loose-envify": { 780 | "version": "1.4.0", 781 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 782 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 783 | "dependencies": { 784 | "js-tokens": "^3.0.0 || ^4.0.0" 785 | }, 786 | "bin": { 787 | "loose-envify": "cli.js" 788 | } 789 | }, 790 | "node_modules/md5.js": { 791 | "version": "1.3.5", 792 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 793 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 794 | "dev": true, 795 | "dependencies": { 796 | "hash-base": "^3.0.0", 797 | "inherits": "^2.0.1", 798 | "safe-buffer": "^5.1.2" 799 | } 800 | }, 801 | "node_modules/miller-rabin": { 802 | "version": "4.0.1", 803 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 804 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 805 | "dev": true, 806 | "dependencies": { 807 | "bn.js": "^4.0.0", 808 | "brorand": "^1.0.1" 809 | }, 810 | "bin": { 811 | "miller-rabin": "bin/miller-rabin" 812 | } 813 | }, 814 | "node_modules/miller-rabin/node_modules/bn.js": { 815 | "version": "4.12.0", 816 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 817 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 818 | "dev": true 819 | }, 820 | "node_modules/minimalistic-assert": { 821 | "version": "1.0.1", 822 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 823 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 824 | "dev": true 825 | }, 826 | "node_modules/minimalistic-crypto-utils": { 827 | "version": "1.0.1", 828 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 829 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", 830 | "dev": true 831 | }, 832 | "node_modules/node-libs-browser": { 833 | "version": "2.2.1", 834 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 835 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 836 | "dev": true, 837 | "dependencies": { 838 | "assert": "^1.1.1", 839 | "browserify-zlib": "^0.2.0", 840 | "buffer": "^4.3.0", 841 | "console-browserify": "^1.1.0", 842 | "constants-browserify": "^1.0.0", 843 | "crypto-browserify": "^3.11.0", 844 | "domain-browser": "^1.1.1", 845 | "events": "^3.0.0", 846 | "https-browserify": "^1.0.0", 847 | "os-browserify": "^0.3.0", 848 | "path-browserify": "0.0.1", 849 | "process": "^0.11.10", 850 | "punycode": "^1.2.4", 851 | "querystring-es3": "^0.2.0", 852 | "readable-stream": "^2.3.3", 853 | "stream-browserify": "^2.0.1", 854 | "stream-http": "^2.7.2", 855 | "string_decoder": "^1.0.0", 856 | "timers-browserify": "^2.0.4", 857 | "tty-browserify": "0.0.0", 858 | "url": "^0.11.0", 859 | "util": "^0.11.0", 860 | "vm-browserify": "^1.0.1" 861 | } 862 | }, 863 | "node_modules/object-assign": { 864 | "version": "4.1.1", 865 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 866 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 867 | "engines": { 868 | "node": ">=0.10.0" 869 | } 870 | }, 871 | "node_modules/os-browserify": { 872 | "version": "0.3.0", 873 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 874 | "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", 875 | "dev": true 876 | }, 877 | "node_modules/pako": { 878 | "version": "1.0.11", 879 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 880 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 881 | "dev": true 882 | }, 883 | "node_modules/parse-asn1": { 884 | "version": "5.1.6", 885 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 886 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 887 | "dev": true, 888 | "dependencies": { 889 | "asn1.js": "^5.2.0", 890 | "browserify-aes": "^1.0.0", 891 | "evp_bytestokey": "^1.0.0", 892 | "pbkdf2": "^3.0.3", 893 | "safe-buffer": "^5.1.1" 894 | } 895 | }, 896 | "node_modules/path-browserify": { 897 | "version": "0.0.1", 898 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 899 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 900 | "dev": true 901 | }, 902 | "node_modules/pbkdf2": { 903 | "version": "3.1.2", 904 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 905 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 906 | "dev": true, 907 | "dependencies": { 908 | "create-hash": "^1.1.2", 909 | "create-hmac": "^1.1.4", 910 | "ripemd160": "^2.0.1", 911 | "safe-buffer": "^5.0.1", 912 | "sha.js": "^2.4.8" 913 | }, 914 | "engines": { 915 | "node": ">=0.12" 916 | } 917 | }, 918 | "node_modules/process": { 919 | "version": "0.11.10", 920 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 921 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 922 | "dev": true, 923 | "engines": { 924 | "node": ">= 0.6.0" 925 | } 926 | }, 927 | "node_modules/process-nextick-args": { 928 | "version": "2.0.1", 929 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 930 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 931 | "dev": true 932 | }, 933 | "node_modules/prop-types": { 934 | "version": "15.8.1", 935 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 936 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 937 | "dependencies": { 938 | "loose-envify": "^1.4.0", 939 | "object-assign": "^4.1.1", 940 | "react-is": "^16.13.1" 941 | } 942 | }, 943 | "node_modules/public-encrypt": { 944 | "version": "4.0.3", 945 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 946 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 947 | "dev": true, 948 | "dependencies": { 949 | "bn.js": "^4.1.0", 950 | "browserify-rsa": "^4.0.0", 951 | "create-hash": "^1.1.0", 952 | "parse-asn1": "^5.0.0", 953 | "randombytes": "^2.0.1", 954 | "safe-buffer": "^5.1.2" 955 | } 956 | }, 957 | "node_modules/public-encrypt/node_modules/bn.js": { 958 | "version": "4.12.0", 959 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 960 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 961 | "dev": true 962 | }, 963 | "node_modules/punycode": { 964 | "version": "1.4.1", 965 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 966 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", 967 | "dev": true 968 | }, 969 | "node_modules/querystring": { 970 | "version": "0.2.0", 971 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 972 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 973 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 974 | "dev": true, 975 | "engines": { 976 | "node": ">=0.4.x" 977 | } 978 | }, 979 | "node_modules/querystring-es3": { 980 | "version": "0.2.1", 981 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 982 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", 983 | "dev": true, 984 | "engines": { 985 | "node": ">=0.4.x" 986 | } 987 | }, 988 | "node_modules/randombytes": { 989 | "version": "2.1.0", 990 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 991 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 992 | "dev": true, 993 | "dependencies": { 994 | "safe-buffer": "^5.1.0" 995 | } 996 | }, 997 | "node_modules/randomfill": { 998 | "version": "1.0.4", 999 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1000 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "randombytes": "^2.0.5", 1004 | "safe-buffer": "^5.1.0" 1005 | } 1006 | }, 1007 | "node_modules/react": { 1008 | "version": "17.0.2", 1009 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 1010 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 1011 | "dependencies": { 1012 | "loose-envify": "^1.1.0", 1013 | "object-assign": "^4.1.1" 1014 | }, 1015 | "engines": { 1016 | "node": ">=0.10.0" 1017 | } 1018 | }, 1019 | "node_modules/react-dom": { 1020 | "version": "17.0.2", 1021 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 1022 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 1023 | "dependencies": { 1024 | "loose-envify": "^1.1.0", 1025 | "object-assign": "^4.1.1", 1026 | "scheduler": "^0.20.2" 1027 | }, 1028 | "peerDependencies": { 1029 | "react": "17.0.2" 1030 | } 1031 | }, 1032 | "node_modules/react-force-graph-2d": { 1033 | "version": "1.23.13", 1034 | "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.23.13.tgz", 1035 | "integrity": "sha512-mdw9r5Ob4yCYaWHSqFmO9lUtZq4ERZSBo+CIO7CD7d13PNrjNI/lVIBCsR/elj6f1AzQ9vqyrAUIsE+5BlaLkw==", 1036 | "dependencies": { 1037 | "force-graph": "^1.42", 1038 | "prop-types": "^15.8", 1039 | "react-kapsule": "^2.2" 1040 | }, 1041 | "peerDependencies": { 1042 | "react": "*" 1043 | } 1044 | }, 1045 | "node_modules/react-is": { 1046 | "version": "16.13.1", 1047 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1048 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1049 | }, 1050 | "node_modules/react-kapsule": { 1051 | "version": "2.2.6", 1052 | "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.2.6.tgz", 1053 | "integrity": "sha512-OUfvKeXSwpwVcGhyUWK6XaStEAA/KWFvlRAo/maS+GWhp7X0mSMbuZ/5jBACXhTFNGqWHf5yyt+LURiWA77HfA==", 1054 | "dependencies": { 1055 | "fromentries": "^1.3.2", 1056 | "jerrypick": "^1.0.5" 1057 | }, 1058 | "peerDependencies": { 1059 | "react": ">=16.13.1" 1060 | } 1061 | }, 1062 | "node_modules/readable-stream": { 1063 | "version": "2.3.7", 1064 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1065 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1066 | "dev": true, 1067 | "dependencies": { 1068 | "core-util-is": "~1.0.0", 1069 | "inherits": "~2.0.3", 1070 | "isarray": "~1.0.0", 1071 | "process-nextick-args": "~2.0.0", 1072 | "safe-buffer": "~5.1.1", 1073 | "string_decoder": "~1.1.1", 1074 | "util-deprecate": "~1.0.1" 1075 | } 1076 | }, 1077 | "node_modules/readable-stream/node_modules/safe-buffer": { 1078 | "version": "5.1.2", 1079 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1080 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1081 | "dev": true 1082 | }, 1083 | "node_modules/readable-stream/node_modules/string_decoder": { 1084 | "version": "1.1.1", 1085 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1086 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1087 | "dev": true, 1088 | "dependencies": { 1089 | "safe-buffer": "~5.1.0" 1090 | } 1091 | }, 1092 | "node_modules/readline-sync": { 1093 | "version": "1.4.10", 1094 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 1095 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 1096 | "dev": true, 1097 | "engines": { 1098 | "node": ">= 0.8.0" 1099 | } 1100 | }, 1101 | "node_modules/ripemd160": { 1102 | "version": "2.0.2", 1103 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1104 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "hash-base": "^3.0.0", 1108 | "inherits": "^2.0.1" 1109 | } 1110 | }, 1111 | "node_modules/safe-buffer": { 1112 | "version": "5.2.1", 1113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1114 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1115 | "dev": true, 1116 | "funding": [ 1117 | { 1118 | "type": "github", 1119 | "url": "https://github.com/sponsors/feross" 1120 | }, 1121 | { 1122 | "type": "patreon", 1123 | "url": "https://www.patreon.com/feross" 1124 | }, 1125 | { 1126 | "type": "consulting", 1127 | "url": "https://feross.org/support" 1128 | } 1129 | ] 1130 | }, 1131 | "node_modules/safer-buffer": { 1132 | "version": "2.1.2", 1133 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1134 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1135 | "dev": true 1136 | }, 1137 | "node_modules/scheduler": { 1138 | "version": "0.20.2", 1139 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 1140 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 1141 | "dependencies": { 1142 | "loose-envify": "^1.1.0", 1143 | "object-assign": "^4.1.1" 1144 | } 1145 | }, 1146 | "node_modules/setimmediate": { 1147 | "version": "1.0.5", 1148 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1149 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", 1150 | "dev": true 1151 | }, 1152 | "node_modules/sha.js": { 1153 | "version": "2.4.11", 1154 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1155 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1156 | "dev": true, 1157 | "dependencies": { 1158 | "inherits": "^2.0.1", 1159 | "safe-buffer": "^5.0.1" 1160 | }, 1161 | "bin": { 1162 | "sha.js": "bin.js" 1163 | } 1164 | }, 1165 | "node_modules/shadow-cljs": { 1166 | "version": "2.20.1", 1167 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.20.1.tgz", 1168 | "integrity": "sha512-hzx3noRw200I4H9f1b1WX61chRUOuGNZCiDkuM/4s+6dxKseS01FFScqOoe7UXwJFff/omoU9rGzh4R9oXtD+A==", 1169 | "dev": true, 1170 | "dependencies": { 1171 | "node-libs-browser": "^2.2.1", 1172 | "readline-sync": "^1.4.7", 1173 | "shadow-cljs-jar": "1.3.2", 1174 | "source-map-support": "^0.4.15", 1175 | "which": "^1.3.1", 1176 | "ws": "^7.4.6" 1177 | }, 1178 | "bin": { 1179 | "shadow-cljs": "cli/runner.js" 1180 | }, 1181 | "engines": { 1182 | "node": ">=6.0.0" 1183 | } 1184 | }, 1185 | "node_modules/shadow-cljs-jar": { 1186 | "version": "1.3.2", 1187 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz", 1188 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==", 1189 | "dev": true 1190 | }, 1191 | "node_modules/source-map": { 1192 | "version": "0.5.7", 1193 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1194 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 1195 | "dev": true, 1196 | "engines": { 1197 | "node": ">=0.10.0" 1198 | } 1199 | }, 1200 | "node_modules/source-map-support": { 1201 | "version": "0.4.18", 1202 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1203 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1204 | "dev": true, 1205 | "dependencies": { 1206 | "source-map": "^0.5.6" 1207 | } 1208 | }, 1209 | "node_modules/stream-browserify": { 1210 | "version": "2.0.2", 1211 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1212 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1213 | "dev": true, 1214 | "dependencies": { 1215 | "inherits": "~2.0.1", 1216 | "readable-stream": "^2.0.2" 1217 | } 1218 | }, 1219 | "node_modules/stream-http": { 1220 | "version": "2.8.3", 1221 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1222 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1223 | "dev": true, 1224 | "dependencies": { 1225 | "builtin-status-codes": "^3.0.0", 1226 | "inherits": "^2.0.1", 1227 | "readable-stream": "^2.3.6", 1228 | "to-arraybuffer": "^1.0.0", 1229 | "xtend": "^4.0.0" 1230 | } 1231 | }, 1232 | "node_modules/string_decoder": { 1233 | "version": "1.3.0", 1234 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1235 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1236 | "dev": true, 1237 | "dependencies": { 1238 | "safe-buffer": "~5.2.0" 1239 | } 1240 | }, 1241 | "node_modules/timers-browserify": { 1242 | "version": "2.0.12", 1243 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 1244 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 1245 | "dev": true, 1246 | "dependencies": { 1247 | "setimmediate": "^1.0.4" 1248 | }, 1249 | "engines": { 1250 | "node": ">=0.6.0" 1251 | } 1252 | }, 1253 | "node_modules/tinycolor2": { 1254 | "version": "1.4.2", 1255 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", 1256 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", 1257 | "engines": { 1258 | "node": "*" 1259 | } 1260 | }, 1261 | "node_modules/to-arraybuffer": { 1262 | "version": "1.0.1", 1263 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1264 | "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", 1265 | "dev": true 1266 | }, 1267 | "node_modules/tty-browserify": { 1268 | "version": "0.0.0", 1269 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 1270 | "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", 1271 | "dev": true 1272 | }, 1273 | "node_modules/url": { 1274 | "version": "0.11.0", 1275 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1276 | "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", 1277 | "dev": true, 1278 | "dependencies": { 1279 | "punycode": "1.3.2", 1280 | "querystring": "0.2.0" 1281 | } 1282 | }, 1283 | "node_modules/url/node_modules/punycode": { 1284 | "version": "1.3.2", 1285 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1286 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", 1287 | "dev": true 1288 | }, 1289 | "node_modules/util": { 1290 | "version": "0.11.1", 1291 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 1292 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 1293 | "dev": true, 1294 | "dependencies": { 1295 | "inherits": "2.0.3" 1296 | } 1297 | }, 1298 | "node_modules/util-deprecate": { 1299 | "version": "1.0.2", 1300 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1301 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1302 | "dev": true 1303 | }, 1304 | "node_modules/util/node_modules/inherits": { 1305 | "version": "2.0.3", 1306 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1307 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1308 | "dev": true 1309 | }, 1310 | "node_modules/vm-browserify": { 1311 | "version": "1.1.2", 1312 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 1313 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 1314 | "dev": true 1315 | }, 1316 | "node_modules/which": { 1317 | "version": "1.3.1", 1318 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1319 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1320 | "dev": true, 1321 | "dependencies": { 1322 | "isexe": "^2.0.0" 1323 | }, 1324 | "bin": { 1325 | "which": "bin/which" 1326 | } 1327 | }, 1328 | "node_modules/ws": { 1329 | "version": "7.5.9", 1330 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 1331 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 1332 | "dev": true, 1333 | "engines": { 1334 | "node": ">=8.3.0" 1335 | }, 1336 | "peerDependencies": { 1337 | "bufferutil": "^4.0.1", 1338 | "utf-8-validate": "^5.0.2" 1339 | }, 1340 | "peerDependenciesMeta": { 1341 | "bufferutil": { 1342 | "optional": true 1343 | }, 1344 | "utf-8-validate": { 1345 | "optional": true 1346 | } 1347 | } 1348 | }, 1349 | "node_modules/xtend": { 1350 | "version": "4.0.2", 1351 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1352 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1353 | "dev": true, 1354 | "engines": { 1355 | "node": ">=0.4" 1356 | } 1357 | } 1358 | }, 1359 | "dependencies": { 1360 | "@tweenjs/tween.js": { 1361 | "version": "18.6.4", 1362 | "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", 1363 | "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==" 1364 | }, 1365 | "accessor-fn": { 1366 | "version": "1.3.2", 1367 | "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.3.2.tgz", 1368 | "integrity": "sha512-W4/Lj/gry8AHy+IC7Havr7fNbphHDzVAiZd5h10g8LRRz6ZKla3A1/lkFqoV1jh13R0eJLGWjDBlRGK36fcWiw==" 1369 | }, 1370 | "asn1.js": { 1371 | "version": "5.4.1", 1372 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 1373 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 1374 | "dev": true, 1375 | "requires": { 1376 | "bn.js": "^4.0.0", 1377 | "inherits": "^2.0.1", 1378 | "minimalistic-assert": "^1.0.0", 1379 | "safer-buffer": "^2.1.0" 1380 | }, 1381 | "dependencies": { 1382 | "bn.js": { 1383 | "version": "4.12.0", 1384 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1385 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1386 | "dev": true 1387 | } 1388 | } 1389 | }, 1390 | "assert": { 1391 | "version": "1.5.0", 1392 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 1393 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 1394 | "dev": true, 1395 | "requires": { 1396 | "object-assign": "^4.1.1", 1397 | "util": "0.10.3" 1398 | }, 1399 | "dependencies": { 1400 | "inherits": { 1401 | "version": "2.0.1", 1402 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 1403 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", 1404 | "dev": true 1405 | }, 1406 | "util": { 1407 | "version": "0.10.3", 1408 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 1409 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", 1410 | "dev": true, 1411 | "requires": { 1412 | "inherits": "2.0.1" 1413 | } 1414 | } 1415 | } 1416 | }, 1417 | "base64-js": { 1418 | "version": "1.5.1", 1419 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1420 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1421 | "dev": true 1422 | }, 1423 | "bezier-js": { 1424 | "version": "6.1.0", 1425 | "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.0.tgz", 1426 | "integrity": "sha512-oc8fkHqG0R+dQuNiXVbPMB0cc8iDqkLAjbA2gq26QmV8tZqW9GGI7iNEX1ioRWlZperQS7v5BX03+9FLVWZbSw==" 1427 | }, 1428 | "bn.js": { 1429 | "version": "5.2.1", 1430 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 1431 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", 1432 | "dev": true 1433 | }, 1434 | "brorand": { 1435 | "version": "1.1.0", 1436 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 1437 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", 1438 | "dev": true 1439 | }, 1440 | "browserify-aes": { 1441 | "version": "1.2.0", 1442 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 1443 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 1444 | "dev": true, 1445 | "requires": { 1446 | "buffer-xor": "^1.0.3", 1447 | "cipher-base": "^1.0.0", 1448 | "create-hash": "^1.1.0", 1449 | "evp_bytestokey": "^1.0.3", 1450 | "inherits": "^2.0.1", 1451 | "safe-buffer": "^5.0.1" 1452 | } 1453 | }, 1454 | "browserify-cipher": { 1455 | "version": "1.0.1", 1456 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 1457 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 1458 | "dev": true, 1459 | "requires": { 1460 | "browserify-aes": "^1.0.4", 1461 | "browserify-des": "^1.0.0", 1462 | "evp_bytestokey": "^1.0.0" 1463 | } 1464 | }, 1465 | "browserify-des": { 1466 | "version": "1.0.2", 1467 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 1468 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 1469 | "dev": true, 1470 | "requires": { 1471 | "cipher-base": "^1.0.1", 1472 | "des.js": "^1.0.0", 1473 | "inherits": "^2.0.1", 1474 | "safe-buffer": "^5.1.2" 1475 | } 1476 | }, 1477 | "browserify-rsa": { 1478 | "version": "4.1.0", 1479 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 1480 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 1481 | "dev": true, 1482 | "requires": { 1483 | "bn.js": "^5.0.0", 1484 | "randombytes": "^2.0.1" 1485 | } 1486 | }, 1487 | "browserify-sign": { 1488 | "version": "4.2.1", 1489 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 1490 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 1491 | "dev": true, 1492 | "requires": { 1493 | "bn.js": "^5.1.1", 1494 | "browserify-rsa": "^4.0.1", 1495 | "create-hash": "^1.2.0", 1496 | "create-hmac": "^1.1.7", 1497 | "elliptic": "^6.5.3", 1498 | "inherits": "^2.0.4", 1499 | "parse-asn1": "^5.1.5", 1500 | "readable-stream": "^3.6.0", 1501 | "safe-buffer": "^5.2.0" 1502 | }, 1503 | "dependencies": { 1504 | "readable-stream": { 1505 | "version": "3.6.0", 1506 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1507 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1508 | "dev": true, 1509 | "requires": { 1510 | "inherits": "^2.0.3", 1511 | "string_decoder": "^1.1.1", 1512 | "util-deprecate": "^1.0.1" 1513 | } 1514 | } 1515 | } 1516 | }, 1517 | "browserify-zlib": { 1518 | "version": "0.2.0", 1519 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 1520 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 1521 | "dev": true, 1522 | "requires": { 1523 | "pako": "~1.0.5" 1524 | } 1525 | }, 1526 | "buffer": { 1527 | "version": "4.9.2", 1528 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1529 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1530 | "dev": true, 1531 | "requires": { 1532 | "base64-js": "^1.0.2", 1533 | "ieee754": "^1.1.4", 1534 | "isarray": "^1.0.0" 1535 | } 1536 | }, 1537 | "buffer-xor": { 1538 | "version": "1.0.3", 1539 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 1540 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", 1541 | "dev": true 1542 | }, 1543 | "builtin-status-codes": { 1544 | "version": "3.0.0", 1545 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 1546 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", 1547 | "dev": true 1548 | }, 1549 | "canvas-color-tracker": { 1550 | "version": "1.1.6", 1551 | "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.1.6.tgz", 1552 | "integrity": "sha512-LpKiona7TwN0rpLgGcdvAw/HVV9HGCSSyOoSJkLyUP+VZmTX2uAnunGVoKrEHQ/7i+lyu6HfazdHV93vLrjK5Q==", 1553 | "requires": { 1554 | "tinycolor2": "^1.4.2" 1555 | } 1556 | }, 1557 | "cipher-base": { 1558 | "version": "1.0.4", 1559 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 1560 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 1561 | "dev": true, 1562 | "requires": { 1563 | "inherits": "^2.0.1", 1564 | "safe-buffer": "^5.0.1" 1565 | } 1566 | }, 1567 | "console-browserify": { 1568 | "version": "1.2.0", 1569 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 1570 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 1571 | "dev": true 1572 | }, 1573 | "constants-browserify": { 1574 | "version": "1.0.0", 1575 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 1576 | "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", 1577 | "dev": true 1578 | }, 1579 | "core-util-is": { 1580 | "version": "1.0.3", 1581 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1582 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 1583 | "dev": true 1584 | }, 1585 | "create-ecdh": { 1586 | "version": "4.0.4", 1587 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 1588 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 1589 | "dev": true, 1590 | "requires": { 1591 | "bn.js": "^4.1.0", 1592 | "elliptic": "^6.5.3" 1593 | }, 1594 | "dependencies": { 1595 | "bn.js": { 1596 | "version": "4.12.0", 1597 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1598 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1599 | "dev": true 1600 | } 1601 | } 1602 | }, 1603 | "create-hash": { 1604 | "version": "1.2.0", 1605 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 1606 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 1607 | "dev": true, 1608 | "requires": { 1609 | "cipher-base": "^1.0.1", 1610 | "inherits": "^2.0.1", 1611 | "md5.js": "^1.3.4", 1612 | "ripemd160": "^2.0.1", 1613 | "sha.js": "^2.4.0" 1614 | } 1615 | }, 1616 | "create-hmac": { 1617 | "version": "1.1.7", 1618 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 1619 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 1620 | "dev": true, 1621 | "requires": { 1622 | "cipher-base": "^1.0.3", 1623 | "create-hash": "^1.1.0", 1624 | "inherits": "^2.0.1", 1625 | "ripemd160": "^2.0.0", 1626 | "safe-buffer": "^5.0.1", 1627 | "sha.js": "^2.4.8" 1628 | } 1629 | }, 1630 | "crypto-browserify": { 1631 | "version": "3.12.0", 1632 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 1633 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 1634 | "dev": true, 1635 | "requires": { 1636 | "browserify-cipher": "^1.0.0", 1637 | "browserify-sign": "^4.0.0", 1638 | "create-ecdh": "^4.0.0", 1639 | "create-hash": "^1.1.0", 1640 | "create-hmac": "^1.1.0", 1641 | "diffie-hellman": "^5.0.0", 1642 | "inherits": "^2.0.1", 1643 | "pbkdf2": "^3.0.3", 1644 | "public-encrypt": "^4.0.0", 1645 | "randombytes": "^2.0.0", 1646 | "randomfill": "^1.0.3" 1647 | } 1648 | }, 1649 | "d3-array": { 1650 | "version": "3.2.0", 1651 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", 1652 | "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", 1653 | "requires": { 1654 | "internmap": "1 - 2" 1655 | } 1656 | }, 1657 | "d3-binarytree": { 1658 | "version": "0.2.2", 1659 | "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-0.2.2.tgz", 1660 | "integrity": "sha512-TmgSEKWO4lSjX26Rk77hbTdiF3TQ1v5LqL+cmSz6/5RiSxmq6+e6qHE6X/KwrsIESekhEReH63X5yM8dvXaT7A==" 1661 | }, 1662 | "d3-color": { 1663 | "version": "3.1.0", 1664 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", 1665 | "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" 1666 | }, 1667 | "d3-dispatch": { 1668 | "version": "3.0.1", 1669 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", 1670 | "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" 1671 | }, 1672 | "d3-drag": { 1673 | "version": "3.0.0", 1674 | "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", 1675 | "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", 1676 | "requires": { 1677 | "d3-dispatch": "1 - 3", 1678 | "d3-selection": "3" 1679 | } 1680 | }, 1681 | "d3-ease": { 1682 | "version": "3.0.1", 1683 | "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", 1684 | "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" 1685 | }, 1686 | "d3-force-3d": { 1687 | "version": "3.0.3", 1688 | "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.3.tgz", 1689 | "integrity": "sha512-8HGTbw6y35UYManGCPU4+b9/PGgnyjzRq80DRsp7zFsRl0leVz2pzwx18dwkPe4rDxTOEpM4BuWQ2krbVaGQQA==", 1690 | "requires": { 1691 | "d3-binarytree": "^0.2.0", 1692 | "d3-dispatch": "1 - 3", 1693 | "d3-octree": "^0.2.0", 1694 | "d3-quadtree": "1 - 3", 1695 | "d3-timer": "1 - 3" 1696 | } 1697 | }, 1698 | "d3-format": { 1699 | "version": "3.1.0", 1700 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", 1701 | "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" 1702 | }, 1703 | "d3-interpolate": { 1704 | "version": "3.0.1", 1705 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", 1706 | "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", 1707 | "requires": { 1708 | "d3-color": "1 - 3" 1709 | } 1710 | }, 1711 | "d3-octree": { 1712 | "version": "0.2.2", 1713 | "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-0.2.2.tgz", 1714 | "integrity": "sha512-ysk9uSPAhZVb0Gq4GXzghl/Yqxu80dHrq55I53qaIMdGB65+0UfO84sr4Fci2JHumcgh6H4WE0r8LwxPagkE+g==" 1715 | }, 1716 | "d3-quadtree": { 1717 | "version": "3.0.1", 1718 | "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", 1719 | "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" 1720 | }, 1721 | "d3-scale": { 1722 | "version": "4.0.2", 1723 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", 1724 | "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", 1725 | "requires": { 1726 | "d3-array": "2.10.0 - 3", 1727 | "d3-format": "1 - 3", 1728 | "d3-interpolate": "1.2.0 - 3", 1729 | "d3-time": "2.1.1 - 3", 1730 | "d3-time-format": "2 - 4" 1731 | } 1732 | }, 1733 | "d3-scale-chromatic": { 1734 | "version": "3.0.0", 1735 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", 1736 | "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", 1737 | "requires": { 1738 | "d3-color": "1 - 3", 1739 | "d3-interpolate": "1 - 3" 1740 | } 1741 | }, 1742 | "d3-selection": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", 1745 | "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" 1746 | }, 1747 | "d3-time": { 1748 | "version": "3.0.0", 1749 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", 1750 | "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", 1751 | "requires": { 1752 | "d3-array": "2 - 3" 1753 | } 1754 | }, 1755 | "d3-time-format": { 1756 | "version": "4.1.0", 1757 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", 1758 | "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", 1759 | "requires": { 1760 | "d3-time": "1 - 3" 1761 | } 1762 | }, 1763 | "d3-timer": { 1764 | "version": "3.0.1", 1765 | "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", 1766 | "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" 1767 | }, 1768 | "d3-transition": { 1769 | "version": "3.0.1", 1770 | "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", 1771 | "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", 1772 | "requires": { 1773 | "d3-color": "1 - 3", 1774 | "d3-dispatch": "1 - 3", 1775 | "d3-ease": "1 - 3", 1776 | "d3-interpolate": "1 - 3", 1777 | "d3-timer": "1 - 3" 1778 | } 1779 | }, 1780 | "d3-zoom": { 1781 | "version": "3.0.0", 1782 | "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", 1783 | "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", 1784 | "requires": { 1785 | "d3-dispatch": "1 - 3", 1786 | "d3-drag": "2 - 3", 1787 | "d3-interpolate": "1 - 3", 1788 | "d3-selection": "2 - 3", 1789 | "d3-transition": "2 - 3" 1790 | } 1791 | }, 1792 | "debounce": { 1793 | "version": "1.2.1", 1794 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", 1795 | "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" 1796 | }, 1797 | "des.js": { 1798 | "version": "1.0.1", 1799 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 1800 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 1801 | "dev": true, 1802 | "requires": { 1803 | "inherits": "^2.0.1", 1804 | "minimalistic-assert": "^1.0.0" 1805 | } 1806 | }, 1807 | "diffie-hellman": { 1808 | "version": "5.0.3", 1809 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 1810 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 1811 | "dev": true, 1812 | "requires": { 1813 | "bn.js": "^4.1.0", 1814 | "miller-rabin": "^4.0.0", 1815 | "randombytes": "^2.0.0" 1816 | }, 1817 | "dependencies": { 1818 | "bn.js": { 1819 | "version": "4.12.0", 1820 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1821 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1822 | "dev": true 1823 | } 1824 | } 1825 | }, 1826 | "domain-browser": { 1827 | "version": "1.2.0", 1828 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 1829 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 1830 | "dev": true 1831 | }, 1832 | "elliptic": { 1833 | "version": "6.5.4", 1834 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 1835 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 1836 | "dev": true, 1837 | "requires": { 1838 | "bn.js": "^4.11.9", 1839 | "brorand": "^1.1.0", 1840 | "hash.js": "^1.0.0", 1841 | "hmac-drbg": "^1.0.1", 1842 | "inherits": "^2.0.4", 1843 | "minimalistic-assert": "^1.0.1", 1844 | "minimalistic-crypto-utils": "^1.0.1" 1845 | }, 1846 | "dependencies": { 1847 | "bn.js": { 1848 | "version": "4.12.0", 1849 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1850 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1851 | "dev": true 1852 | } 1853 | } 1854 | }, 1855 | "events": { 1856 | "version": "3.3.0", 1857 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1858 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1859 | "dev": true 1860 | }, 1861 | "evp_bytestokey": { 1862 | "version": "1.0.3", 1863 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 1864 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 1865 | "dev": true, 1866 | "requires": { 1867 | "md5.js": "^1.3.4", 1868 | "safe-buffer": "^5.1.1" 1869 | } 1870 | }, 1871 | "force-graph": { 1872 | "version": "1.42.16", 1873 | "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.42.16.tgz", 1874 | "integrity": "sha512-ypgtQHOZCPDTB1nVB5k1CpEdaqjCzuLpNKd9msuoLwisBQtXE1V11PDLIza7Y06C3mPAHc+dl49GyQi8V1SR5w==", 1875 | "requires": { 1876 | "@tweenjs/tween.js": "18", 1877 | "accessor-fn": "1", 1878 | "bezier-js": "3 - 6", 1879 | "canvas-color-tracker": "1", 1880 | "d3-array": "1 - 3", 1881 | "d3-drag": "2 - 3", 1882 | "d3-force-3d": "2 - 3", 1883 | "d3-scale": "1 - 4", 1884 | "d3-scale-chromatic": "1 - 3", 1885 | "d3-selection": "2 - 3", 1886 | "d3-zoom": "2 - 3", 1887 | "index-array-by": "1", 1888 | "kapsule": "^1.13", 1889 | "lodash.throttle": "4" 1890 | } 1891 | }, 1892 | "fromentries": { 1893 | "version": "1.3.2", 1894 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", 1895 | "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==" 1896 | }, 1897 | "hash-base": { 1898 | "version": "3.1.0", 1899 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 1900 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 1901 | "dev": true, 1902 | "requires": { 1903 | "inherits": "^2.0.4", 1904 | "readable-stream": "^3.6.0", 1905 | "safe-buffer": "^5.2.0" 1906 | }, 1907 | "dependencies": { 1908 | "readable-stream": { 1909 | "version": "3.6.0", 1910 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1911 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1912 | "dev": true, 1913 | "requires": { 1914 | "inherits": "^2.0.3", 1915 | "string_decoder": "^1.1.1", 1916 | "util-deprecate": "^1.0.1" 1917 | } 1918 | } 1919 | } 1920 | }, 1921 | "hash.js": { 1922 | "version": "1.1.7", 1923 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1924 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1925 | "dev": true, 1926 | "requires": { 1927 | "inherits": "^2.0.3", 1928 | "minimalistic-assert": "^1.0.1" 1929 | } 1930 | }, 1931 | "highlight.js": { 1932 | "version": "11.5.1", 1933 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", 1934 | "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==" 1935 | }, 1936 | "hmac-drbg": { 1937 | "version": "1.0.1", 1938 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1939 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", 1940 | "dev": true, 1941 | "requires": { 1942 | "hash.js": "^1.0.3", 1943 | "minimalistic-assert": "^1.0.0", 1944 | "minimalistic-crypto-utils": "^1.0.1" 1945 | } 1946 | }, 1947 | "https-browserify": { 1948 | "version": "1.0.0", 1949 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 1950 | "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", 1951 | "dev": true 1952 | }, 1953 | "ieee754": { 1954 | "version": "1.2.1", 1955 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1956 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1957 | "dev": true 1958 | }, 1959 | "index-array-by": { 1960 | "version": "1.3.3", 1961 | "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.3.3.tgz", 1962 | "integrity": "sha512-dpqV1sX+hx4s0RqAT97ypk9xzcAXJ0XK27p3bTgPy8bjbJAX6Kf7RU3pPXgmg9hhO7f5/WxO354v2f/A0/fz3Q==" 1963 | }, 1964 | "inherits": { 1965 | "version": "2.0.4", 1966 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1967 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1968 | "dev": true 1969 | }, 1970 | "internmap": { 1971 | "version": "2.0.3", 1972 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", 1973 | "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" 1974 | }, 1975 | "isarray": { 1976 | "version": "1.0.0", 1977 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1978 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1979 | "dev": true 1980 | }, 1981 | "isexe": { 1982 | "version": "2.0.0", 1983 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1984 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1985 | "dev": true 1986 | }, 1987 | "jerrypick": { 1988 | "version": "1.0.5", 1989 | "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.0.5.tgz", 1990 | "integrity": "sha512-95dIyL2QXqevDDJ70rmiqKLsTi+riZftLQo708tSFR/O5pQOf6VscDhjnN8mkNQwqnQmGhw+6dfZ5d4bmH/yww==" 1991 | }, 1992 | "js-tokens": { 1993 | "version": "4.0.0", 1994 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1995 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1996 | }, 1997 | "kapsule": { 1998 | "version": "1.13.8", 1999 | "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.13.8.tgz", 2000 | "integrity": "sha512-Y1lLt1htHNofIM5kxS5OdEqDm7WFqHF4hm6DrrvNEKIJugfQrxDBycV41QI5FpnBGHqyBD99VpTB5ARnlufP6w==", 2001 | "requires": { 2002 | "debounce": "^1.2.1" 2003 | } 2004 | }, 2005 | "lodash.throttle": { 2006 | "version": "4.1.1", 2007 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 2008 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" 2009 | }, 2010 | "loose-envify": { 2011 | "version": "1.4.0", 2012 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2013 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2014 | "requires": { 2015 | "js-tokens": "^3.0.0 || ^4.0.0" 2016 | } 2017 | }, 2018 | "md5.js": { 2019 | "version": "1.3.5", 2020 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 2021 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 2022 | "dev": true, 2023 | "requires": { 2024 | "hash-base": "^3.0.0", 2025 | "inherits": "^2.0.1", 2026 | "safe-buffer": "^5.1.2" 2027 | } 2028 | }, 2029 | "miller-rabin": { 2030 | "version": "4.0.1", 2031 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 2032 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 2033 | "dev": true, 2034 | "requires": { 2035 | "bn.js": "^4.0.0", 2036 | "brorand": "^1.0.1" 2037 | }, 2038 | "dependencies": { 2039 | "bn.js": { 2040 | "version": "4.12.0", 2041 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 2042 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 2043 | "dev": true 2044 | } 2045 | } 2046 | }, 2047 | "minimalistic-assert": { 2048 | "version": "1.0.1", 2049 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 2050 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 2051 | "dev": true 2052 | }, 2053 | "minimalistic-crypto-utils": { 2054 | "version": "1.0.1", 2055 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 2056 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", 2057 | "dev": true 2058 | }, 2059 | "node-libs-browser": { 2060 | "version": "2.2.1", 2061 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 2062 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 2063 | "dev": true, 2064 | "requires": { 2065 | "assert": "^1.1.1", 2066 | "browserify-zlib": "^0.2.0", 2067 | "buffer": "^4.3.0", 2068 | "console-browserify": "^1.1.0", 2069 | "constants-browserify": "^1.0.0", 2070 | "crypto-browserify": "^3.11.0", 2071 | "domain-browser": "^1.1.1", 2072 | "events": "^3.0.0", 2073 | "https-browserify": "^1.0.0", 2074 | "os-browserify": "^0.3.0", 2075 | "path-browserify": "0.0.1", 2076 | "process": "^0.11.10", 2077 | "punycode": "^1.2.4", 2078 | "querystring-es3": "^0.2.0", 2079 | "readable-stream": "^2.3.3", 2080 | "stream-browserify": "^2.0.1", 2081 | "stream-http": "^2.7.2", 2082 | "string_decoder": "^1.0.0", 2083 | "timers-browserify": "^2.0.4", 2084 | "tty-browserify": "0.0.0", 2085 | "url": "^0.11.0", 2086 | "util": "^0.11.0", 2087 | "vm-browserify": "^1.0.1" 2088 | } 2089 | }, 2090 | "object-assign": { 2091 | "version": "4.1.1", 2092 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2093 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 2094 | }, 2095 | "os-browserify": { 2096 | "version": "0.3.0", 2097 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 2098 | "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", 2099 | "dev": true 2100 | }, 2101 | "pako": { 2102 | "version": "1.0.11", 2103 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2104 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 2105 | "dev": true 2106 | }, 2107 | "parse-asn1": { 2108 | "version": "5.1.6", 2109 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 2110 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 2111 | "dev": true, 2112 | "requires": { 2113 | "asn1.js": "^5.2.0", 2114 | "browserify-aes": "^1.0.0", 2115 | "evp_bytestokey": "^1.0.0", 2116 | "pbkdf2": "^3.0.3", 2117 | "safe-buffer": "^5.1.1" 2118 | } 2119 | }, 2120 | "path-browserify": { 2121 | "version": "0.0.1", 2122 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 2123 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 2124 | "dev": true 2125 | }, 2126 | "pbkdf2": { 2127 | "version": "3.1.2", 2128 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 2129 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 2130 | "dev": true, 2131 | "requires": { 2132 | "create-hash": "^1.1.2", 2133 | "create-hmac": "^1.1.4", 2134 | "ripemd160": "^2.0.1", 2135 | "safe-buffer": "^5.0.1", 2136 | "sha.js": "^2.4.8" 2137 | } 2138 | }, 2139 | "process": { 2140 | "version": "0.11.10", 2141 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2142 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 2143 | "dev": true 2144 | }, 2145 | "process-nextick-args": { 2146 | "version": "2.0.1", 2147 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2148 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2149 | "dev": true 2150 | }, 2151 | "prop-types": { 2152 | "version": "15.8.1", 2153 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2154 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2155 | "requires": { 2156 | "loose-envify": "^1.4.0", 2157 | "object-assign": "^4.1.1", 2158 | "react-is": "^16.13.1" 2159 | } 2160 | }, 2161 | "public-encrypt": { 2162 | "version": "4.0.3", 2163 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 2164 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 2165 | "dev": true, 2166 | "requires": { 2167 | "bn.js": "^4.1.0", 2168 | "browserify-rsa": "^4.0.0", 2169 | "create-hash": "^1.1.0", 2170 | "parse-asn1": "^5.0.0", 2171 | "randombytes": "^2.0.1", 2172 | "safe-buffer": "^5.1.2" 2173 | }, 2174 | "dependencies": { 2175 | "bn.js": { 2176 | "version": "4.12.0", 2177 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 2178 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 2179 | "dev": true 2180 | } 2181 | } 2182 | }, 2183 | "punycode": { 2184 | "version": "1.4.1", 2185 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2186 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", 2187 | "dev": true 2188 | }, 2189 | "querystring": { 2190 | "version": "0.2.0", 2191 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2192 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 2193 | "dev": true 2194 | }, 2195 | "querystring-es3": { 2196 | "version": "0.2.1", 2197 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 2198 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", 2199 | "dev": true 2200 | }, 2201 | "randombytes": { 2202 | "version": "2.1.0", 2203 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2204 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2205 | "dev": true, 2206 | "requires": { 2207 | "safe-buffer": "^5.1.0" 2208 | } 2209 | }, 2210 | "randomfill": { 2211 | "version": "1.0.4", 2212 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 2213 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 2214 | "dev": true, 2215 | "requires": { 2216 | "randombytes": "^2.0.5", 2217 | "safe-buffer": "^5.1.0" 2218 | } 2219 | }, 2220 | "react": { 2221 | "version": "17.0.2", 2222 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 2223 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 2224 | "requires": { 2225 | "loose-envify": "^1.1.0", 2226 | "object-assign": "^4.1.1" 2227 | } 2228 | }, 2229 | "react-dom": { 2230 | "version": "17.0.2", 2231 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 2232 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 2233 | "requires": { 2234 | "loose-envify": "^1.1.0", 2235 | "object-assign": "^4.1.1", 2236 | "scheduler": "^0.20.2" 2237 | } 2238 | }, 2239 | "react-force-graph-2d": { 2240 | "version": "1.23.13", 2241 | "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.23.13.tgz", 2242 | "integrity": "sha512-mdw9r5Ob4yCYaWHSqFmO9lUtZq4ERZSBo+CIO7CD7d13PNrjNI/lVIBCsR/elj6f1AzQ9vqyrAUIsE+5BlaLkw==", 2243 | "requires": { 2244 | "force-graph": "^1.42", 2245 | "prop-types": "^15.8", 2246 | "react-kapsule": "^2.2" 2247 | } 2248 | }, 2249 | "react-is": { 2250 | "version": "16.13.1", 2251 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2252 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2253 | }, 2254 | "react-kapsule": { 2255 | "version": "2.2.6", 2256 | "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.2.6.tgz", 2257 | "integrity": "sha512-OUfvKeXSwpwVcGhyUWK6XaStEAA/KWFvlRAo/maS+GWhp7X0mSMbuZ/5jBACXhTFNGqWHf5yyt+LURiWA77HfA==", 2258 | "requires": { 2259 | "fromentries": "^1.3.2", 2260 | "jerrypick": "^1.0.5" 2261 | } 2262 | }, 2263 | "readable-stream": { 2264 | "version": "2.3.7", 2265 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2266 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2267 | "dev": true, 2268 | "requires": { 2269 | "core-util-is": "~1.0.0", 2270 | "inherits": "~2.0.3", 2271 | "isarray": "~1.0.0", 2272 | "process-nextick-args": "~2.0.0", 2273 | "safe-buffer": "~5.1.1", 2274 | "string_decoder": "~1.1.1", 2275 | "util-deprecate": "~1.0.1" 2276 | }, 2277 | "dependencies": { 2278 | "safe-buffer": { 2279 | "version": "5.1.2", 2280 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2281 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2282 | "dev": true 2283 | }, 2284 | "string_decoder": { 2285 | "version": "1.1.1", 2286 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2287 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2288 | "dev": true, 2289 | "requires": { 2290 | "safe-buffer": "~5.1.0" 2291 | } 2292 | } 2293 | } 2294 | }, 2295 | "readline-sync": { 2296 | "version": "1.4.10", 2297 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 2298 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 2299 | "dev": true 2300 | }, 2301 | "ripemd160": { 2302 | "version": "2.0.2", 2303 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 2304 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 2305 | "dev": true, 2306 | "requires": { 2307 | "hash-base": "^3.0.0", 2308 | "inherits": "^2.0.1" 2309 | } 2310 | }, 2311 | "safe-buffer": { 2312 | "version": "5.2.1", 2313 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2314 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2315 | "dev": true 2316 | }, 2317 | "safer-buffer": { 2318 | "version": "2.1.2", 2319 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2320 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2321 | "dev": true 2322 | }, 2323 | "scheduler": { 2324 | "version": "0.20.2", 2325 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 2326 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 2327 | "requires": { 2328 | "loose-envify": "^1.1.0", 2329 | "object-assign": "^4.1.1" 2330 | } 2331 | }, 2332 | "setimmediate": { 2333 | "version": "1.0.5", 2334 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2335 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", 2336 | "dev": true 2337 | }, 2338 | "sha.js": { 2339 | "version": "2.4.11", 2340 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 2341 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 2342 | "dev": true, 2343 | "requires": { 2344 | "inherits": "^2.0.1", 2345 | "safe-buffer": "^5.0.1" 2346 | } 2347 | }, 2348 | "shadow-cljs": { 2349 | "version": "2.20.1", 2350 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.20.1.tgz", 2351 | "integrity": "sha512-hzx3noRw200I4H9f1b1WX61chRUOuGNZCiDkuM/4s+6dxKseS01FFScqOoe7UXwJFff/omoU9rGzh4R9oXtD+A==", 2352 | "dev": true, 2353 | "requires": { 2354 | "node-libs-browser": "^2.2.1", 2355 | "readline-sync": "^1.4.7", 2356 | "shadow-cljs-jar": "1.3.2", 2357 | "source-map-support": "^0.4.15", 2358 | "which": "^1.3.1", 2359 | "ws": "^7.4.6" 2360 | } 2361 | }, 2362 | "shadow-cljs-jar": { 2363 | "version": "1.3.2", 2364 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz", 2365 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==", 2366 | "dev": true 2367 | }, 2368 | "source-map": { 2369 | "version": "0.5.7", 2370 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2371 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 2372 | "dev": true 2373 | }, 2374 | "source-map-support": { 2375 | "version": "0.4.18", 2376 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 2377 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 2378 | "dev": true, 2379 | "requires": { 2380 | "source-map": "^0.5.6" 2381 | } 2382 | }, 2383 | "stream-browserify": { 2384 | "version": "2.0.2", 2385 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 2386 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 2387 | "dev": true, 2388 | "requires": { 2389 | "inherits": "~2.0.1", 2390 | "readable-stream": "^2.0.2" 2391 | } 2392 | }, 2393 | "stream-http": { 2394 | "version": "2.8.3", 2395 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 2396 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 2397 | "dev": true, 2398 | "requires": { 2399 | "builtin-status-codes": "^3.0.0", 2400 | "inherits": "^2.0.1", 2401 | "readable-stream": "^2.3.6", 2402 | "to-arraybuffer": "^1.0.0", 2403 | "xtend": "^4.0.0" 2404 | } 2405 | }, 2406 | "string_decoder": { 2407 | "version": "1.3.0", 2408 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2409 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2410 | "dev": true, 2411 | "requires": { 2412 | "safe-buffer": "~5.2.0" 2413 | } 2414 | }, 2415 | "timers-browserify": { 2416 | "version": "2.0.12", 2417 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 2418 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 2419 | "dev": true, 2420 | "requires": { 2421 | "setimmediate": "^1.0.4" 2422 | } 2423 | }, 2424 | "tinycolor2": { 2425 | "version": "1.4.2", 2426 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", 2427 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" 2428 | }, 2429 | "to-arraybuffer": { 2430 | "version": "1.0.1", 2431 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 2432 | "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", 2433 | "dev": true 2434 | }, 2435 | "tty-browserify": { 2436 | "version": "0.0.0", 2437 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 2438 | "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", 2439 | "dev": true 2440 | }, 2441 | "url": { 2442 | "version": "0.11.0", 2443 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2444 | "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", 2445 | "dev": true, 2446 | "requires": { 2447 | "punycode": "1.3.2", 2448 | "querystring": "0.2.0" 2449 | }, 2450 | "dependencies": { 2451 | "punycode": { 2452 | "version": "1.3.2", 2453 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2454 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", 2455 | "dev": true 2456 | } 2457 | } 2458 | }, 2459 | "util": { 2460 | "version": "0.11.1", 2461 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 2462 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 2463 | "dev": true, 2464 | "requires": { 2465 | "inherits": "2.0.3" 2466 | }, 2467 | "dependencies": { 2468 | "inherits": { 2469 | "version": "2.0.3", 2470 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2471 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 2472 | "dev": true 2473 | } 2474 | } 2475 | }, 2476 | "util-deprecate": { 2477 | "version": "1.0.2", 2478 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2479 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2480 | "dev": true 2481 | }, 2482 | "vm-browserify": { 2483 | "version": "1.1.2", 2484 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 2485 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 2486 | "dev": true 2487 | }, 2488 | "which": { 2489 | "version": "1.3.1", 2490 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2491 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2492 | "dev": true, 2493 | "requires": { 2494 | "isexe": "^2.0.0" 2495 | } 2496 | }, 2497 | "ws": { 2498 | "version": "7.5.9", 2499 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 2500 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 2501 | "dev": true, 2502 | "requires": {} 2503 | }, 2504 | "xtend": { 2505 | "version": "4.0.2", 2506 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2507 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2508 | "dev": true 2509 | } 2510 | } 2511 | } 2512 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arena-graph", 3 | "scripts": { 4 | "ancient": "clojure -Sdeps '{:deps {com.github.liquidz/antq {:mvn/version \"RELEASE\"}}}' -m antq.core", 5 | "watch": "npx shadow-cljs watch app browser-test karma-test", 6 | "release": "npx shadow-cljs release app", 7 | "build-report": "npx shadow-cljs run shadow.cljs.build-report app target/build-report.html" 8 | }, 9 | "dependencies": { 10 | "highlight.js": "11.5.1", 11 | "react": "17.0.2", 12 | "react-dom": "17.0.2", 13 | "react-force-graph-2d": "^1.23.11" 14 | }, 15 | "devDependencies": { 16 | "shadow-cljs": "2.20.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/public/_asset/UniVGA16.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/UniVGA16.ttf -------------------------------------------------------------------------------- /resources/public/_asset/gif/planet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/planet.gif -------------------------------------------------------------------------------- /resources/public/_asset/gif/ripples.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/ripples.gif -------------------------------------------------------------------------------- /resources/public/_asset/gif/scroll.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/scroll.gif -------------------------------------------------------------------------------- /resources/public/_asset/gif/sparkle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/sparkle.gif -------------------------------------------------------------------------------- /resources/public/_asset/gif/takase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/takase.gif -------------------------------------------------------------------------------- /resources/public/_asset/gif/tan.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/tan.gif -------------------------------------------------------------------------------- /resources/public/_asset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/logo.png -------------------------------------------------------------------------------- /resources/public/_asset/svg/arena-inv.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/arena.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/github-inv.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/power-inv.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_asset/svg/power.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/public/_css/base.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "VGA"; 3 | src: url("../_asset/UniVGA16.ttf"); 4 | } 5 | 6 | :root { 7 | --ui: #F6CA18; 8 | --bg: #180906; 9 | } 10 | 11 | /* ========== SETUP ========================================================= */ 12 | /* Reset headings */ 13 | h1, h2, h3, h4, h5, h6 { 14 | font-weight: normal; 15 | line-height: normal; 16 | font-size: initial; 17 | margin-block: 0 0; 18 | margin-inline: 0 0; 19 | display: initial; 20 | } 21 | 22 | /* Reset list */ 23 | ul { 24 | list-style-type: none; 25 | margin-block: 0 0; 26 | padding-inline: 0 0; 27 | } 28 | 29 | /* Remove form styles */ 30 | input, button { 31 | all: unset; 32 | } 33 | 34 | .displayed { 35 | display: initial !important; 36 | } 37 | 38 | .visible { 39 | visibility: visible !important; 40 | } 41 | 42 | /* ========== PAGE-WIDE CHANGES ============================================= */ 43 | html { 44 | background-color: var(--bg); 45 | color: var(--ui); 46 | font-family: "VGA", monospace; 47 | image-rendering: pixelated; 48 | } 49 | 50 | body { 51 | display: grid; 52 | height: 100vh; 53 | place-content: center; 54 | padding: 0 1rem; 55 | } 56 | 57 | h1 { 58 | font-size: 1.2rem; 59 | } 60 | 61 | /* ========== SECTION ELEMENTS ============================================== */ 62 | main { 63 | display: flex; 64 | flex-flow: column nowrap; 65 | border: 3px solid var(--ui); 66 | } 67 | 68 | header { 69 | padding: 0.2rem 0.25rem 0.2rem 1.3rem; 70 | background-color: var(--ui); 71 | color: var(--bg); 72 | display: flex; 73 | flex-flow: row nowrap; 74 | justify-content: space-between; 75 | } 76 | 77 | /* ========== MAIN UI ======================================================= */ 78 | #container { 79 | display: flex; 80 | flex-flow: row wrap-reverse; 81 | align-content: center; 82 | justify-content: center; 83 | background: var(--ui); 84 | } 85 | 86 | #canvas-container { 87 | display: grid; 88 | grid-template-rows: 1fr; 89 | overflow: hidden; 90 | } 91 | 92 | #canvas-cover { 93 | grid-area: 1 / 1; 94 | z-index: 2; 95 | background-color: var(--ui); 96 | transform: translateY(-100%); 97 | transition: transform 0.35s ease-in; 98 | padding: 0.2rem; 99 | } 100 | #canvas-cover > div { 101 | width: 100%; 102 | height: 100%; 103 | display: grid; 104 | place-content: center; 105 | border: 1px solid var(--bg); 106 | } 107 | 108 | .canvas-covered { 109 | transform: translateY(0) !important; 110 | } 111 | 112 | #canvas { 113 | grid-area: 1 / 1; 114 | border: 1px solid var(--ui); 115 | background: var(--bg); 116 | } 117 | 118 | nav { 119 | display: flex; 120 | flex-flow: row nowrap; 121 | gap: 0.3rem; 122 | } 123 | 124 | nav span { 125 | background-color: var(--ui); 126 | max-height: 20px; 127 | } 128 | 129 | .nav-button { 130 | display: block; 131 | background-size: contain; 132 | cursor: pointer; 133 | padding: 1px; 134 | border-radius: 2px; 135 | } 136 | .nav-button div { 137 | padding: 2px; 138 | width: 16px; 139 | height: 16px; 140 | border-radius: 2px; 141 | } 142 | .nav-button:hover { 143 | outline: 1px solid var(--bg); 144 | } 145 | .nav-button:active { 146 | outline: unset; 147 | background-color: var(--bg); 148 | } 149 | #close { 150 | background-image: url("../_asset/svg/power-inv.svg"); 151 | } 152 | #github { 153 | background-image: url("../_asset/svg/github-inv.svg"); 154 | } 155 | #arena { 156 | background-image: url("../_asset/svg/arena-inv.svg"); 157 | } 158 | 159 | #close:active { 160 | background-image: url("../_asset/svg/power.svg"); 161 | } 162 | #github:active { 163 | background-image: url("../_asset/svg/github.svg"); 164 | } 165 | #arena:active { 166 | background-image: url("../_asset/svg/arena.svg"); 167 | } 168 | 169 | /* ========== CONSOLE ======================================================= */ 170 | #console { 171 | grid-area: 1 / 1; 172 | } 173 | 174 | #console ul { 175 | display: flex; 176 | flex-flow: column-reverse nowrap; 177 | height: 7rem; 178 | padding-top: 0.5rem; 179 | border: 1px solid var(--ui); 180 | overflow: scroll; 181 | gap: 0.1rem; 182 | line-height: 1.1; 183 | } 184 | 185 | #console li { 186 | display: flex; 187 | flex-flow: row nowrap; 188 | padding: 0.1rem 0.3rem 0; 189 | gap: 0.5rem; 190 | } 191 | 192 | #typing { 193 | display: none; 194 | animation: blink 0.8s step-start infinite; 195 | font-size: 1.1rem; 196 | line-height: 1.1rem; 197 | margin-bottom: 0.2rem; 198 | } 199 | 200 | @keyframes blink { 201 | 0% { 202 | opacity: 0; 203 | } 204 | 50% { 205 | opacity: 0; 206 | } 207 | } 208 | 209 | #console aside { 210 | filter: brightness(0.6) saturate(0.55); 211 | } 212 | 213 | #console .error { 214 | background: var(--ui); 215 | color: var(--bg); 216 | } 217 | 218 | #console .info aside { 219 | filter: none; 220 | } 221 | #console .info { 222 | filter: brightness(0.6) saturate(0.55); 223 | } 224 | 225 | /* ========== CONTROLS ====================================================== */ 226 | #input-container { 227 | display: grid; 228 | grid-template-rows: 1fr; 229 | overflow: hidden; 230 | } 231 | 232 | #controls { 233 | grid-area: 1 / 1; 234 | border: 2px solid var(--ui); 235 | } 236 | 237 | #controls span::before { 238 | content: ">"; 239 | margin: 0 0.3rem 0 0.5rem; 240 | } 241 | #controls span { 242 | display: flex; 243 | flex-flow: row nowrap; 244 | font-size: 1.1rem; 245 | } 246 | 247 | #controls span input { 248 | flex: 1; 249 | margin-right: 0.75rem; 250 | } 251 | 252 | #controls button { 253 | padding: 0.15rem 0.15rem 0.15rem 0.3rem; 254 | margin-right: -1px; 255 | background: var(--ui); 256 | color: var(--bg); 257 | outline: 2px solid var(--ui); 258 | font-size: 1.6rem; 259 | line-height: 1.1rem; 260 | } 261 | #controls button:hover { 262 | background: var(--bg); 263 | color: var(--ui); 264 | cursor: pointer; 265 | } 266 | 267 | #controls-cover { 268 | z-index: 2; 269 | background: var(--ui); 270 | grid-area: 1 / 1; 271 | } 272 | 273 | .controls-cover-revealed { 274 | transition: transform 0.25s ease-in; 275 | transform: translateY(100%); 276 | } 277 | 278 | /* ========== CHANNEL INFORMATION =========================================== */ 279 | #channel-info-container { 280 | visibility: hidden; 281 | z-index: 2; 282 | grid-area: 1 / 1; 283 | display: flex; 284 | flex-flow: column nowrap; 285 | background: var(--bg); 286 | border: 1px solid var(--ui); 287 | max-width: 100%; 288 | } 289 | 290 | #channel-info { 291 | margin: 0.75rem; 292 | padding: 0 0.5rem; 293 | flex-grow: 1; 294 | max-width: 100%; 295 | background-color: var(--bg); 296 | display: flex; 297 | flex-flow: column nowrap; 298 | gap: 0; 299 | justify-content: center; 300 | } 301 | 302 | #channel-info .item { 303 | display: flex; 304 | flex-flow: row nowrap; 305 | gap: .25rem; 306 | white-space: nowrap; 307 | text-overflow: ellipsis; 308 | line-height: 1.35rem; 309 | } 310 | 311 | /* ========== EXTRANEOUS SIDEBAR ============================================ */ 312 | #under { 313 | display: grid; 314 | height: 7rem; 315 | grid-template-rows: 1fr; 316 | overflow: hidden; 317 | outline: 1px solid var(--ui); 318 | } 319 | 320 | #sidebar { 321 | display: flex; 322 | flex-wrap: nowrap; 323 | gap: 1px; 324 | border: 1px solid var(--ui); 325 | background: var(--bg); 326 | } 327 | 328 | #loader-container { 329 | display: grid; 330 | overflow: hidden; 331 | grid-template-columns: repeat(2, 50%); 332 | grid-template-rows: 1fr; 333 | gap: 1px; 334 | outline: 1px solid var(--ui); 335 | } 336 | 337 | #loader-cover-left { 338 | transition: transform 0.5s; 339 | z-index: 2; 340 | grid-area: 1 / 1 / 1 / 1; 341 | background: var(--ui); 342 | } 343 | .loader-cover-left-revealed { 344 | transition: transform 0.5s; 345 | transform: translateX(-100%) !important; 346 | } 347 | #loader-cover-right { 348 | transition: transform 0.5s; 349 | z-index: 2; 350 | grid-area: 1 / 2 / 1 / 2; 351 | background-color: var(--ui); 352 | } 353 | .loader-cover-right-revealed { 354 | transition: transform 0.5s; 355 | transform: translateX(100%) !important; 356 | } 357 | 358 | #loader { 359 | grid-area: 1 / 1 / 1 / 2; 360 | background-color: var(--bg); 361 | background-size: contain; 362 | } 363 | 364 | #loader.active { 365 | background-image: url("../_asset/gif/3.gif") !important; 366 | } 367 | 368 | #progress-outer-container { 369 | display: grid; 370 | grid-template-columns: 1fr; 371 | grid-template-rows: 1fr; 372 | flex-grow: 1; 373 | align-content: stretch; 374 | } 375 | 376 | #progress-background-lines { 377 | grid-area: 1 / 1 / 1 / 1; 378 | display: flex; 379 | flex-wrap: nowrap; 380 | gap: 1px; 381 | background: var(--ui); 382 | } 383 | 384 | #progress-background-lines .sep { 385 | flex-grow: 1; 386 | background: var(--bg); 387 | } 388 | 389 | #progress-bar-container { 390 | grid-area: 1 / 1 / 1 / 1; 391 | z-index: 2; 392 | display: flex; 393 | flex-wrap: nowrap; 394 | justify-content: center; 395 | align-items: center; 396 | gap: 18%; 397 | } 398 | 399 | .progress-bar { 400 | height: 90%; 401 | display: flex; 402 | flex-basis: 28%; 403 | flex-wrap: nowrap; 404 | background: var(--bg); 405 | outline: 1px solid var(--ui); 406 | } 407 | 408 | .progress-bar-filler { 409 | margin: 2px; 410 | background: var(--ui); 411 | transition: flex-basis 0.35s ease-in-out; 412 | } 413 | -------------------------------------------------------------------------------- /resources/public/_css/reset.css: -------------------------------------------------------------------------------- 1 | /* CSS reset */ 2 | *, *::before, *::after {box-sizing: border-box;} 3 | * {margin: 0;} 4 | html {height: 100%;} 5 | body {line-height: 1.5; -webkit-font-smoothing: antialiased;} 6 | img, picture, video, canvas, svg {display: block; max-width: 100%;} 7 | input, button, textarea, select {font: inherit;} 8 | p, h1, h2, h3, h4, h5, h6 {overflow-wrap: break-word;} 9 | #root, #__next {isolation: isolate;} 10 | -------------------------------------------------------------------------------- /resources/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/favicon.ico -------------------------------------------------------------------------------- /resources/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Amoeba 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:nrepl {:port 8777} 2 | :source-paths ["src" "test"] 3 | 4 | :dependencies 5 | [[binaryage/devtools "1.0.6"] 6 | [cljs-ajax "0.8.4"] 7 | [reagent "1.1.1"] 8 | [re-frame "1.3.0"] 9 | [day8.re-frame/http-fx "0.2.4"] 10 | [day8.re-frame/tracing "0.6.2"] 11 | [day8.re-frame/re-frame-10x "1.5.0"]] 12 | 13 | :dev-http 14 | {8280 "resources/public" 15 | 8290 "target/browser-test"} 16 | 17 | :builds 18 | {:app 19 | {:target :browser 20 | :output-dir "resources/public/_js/compiled" 21 | :asset-path "/_js/compiled" 22 | :modules {:app {:init-fn kees.arena-graph.main/init}} 23 | :devtools {:preloads [day8.re-frame-10x.preload 24 | shadow.remote.runtime.cljs.browser]} 25 | :dev {:compiler-options 26 | {:closure-defines 27 | {re-frame.trace.trace-enabled? true 28 | day8.re-frame.tracing.trace-enabled? true}}} 29 | :release {:build-options 30 | {:ns-aliases 31 | {day8.re-frame.tracing day8.re-frame.tracing-stubs}}}}}} 32 | -------------------------------------------------------------------------------- /src/kees/arena_graph/config.cljs: -------------------------------------------------------------------------------- 1 | (ns kees.arena-graph.config) 2 | 3 | (def debug? 4 | ^boolean goog.DEBUG) 5 | -------------------------------------------------------------------------------- /src/kees/arena_graph/graphs.cljs: -------------------------------------------------------------------------------- 1 | (ns kees.arena-graph.graphs 2 | (:require ["react-force-graph-2d" :as ForceGraph2D] 3 | [kees.arena-graph.rf :as rf :refer [evt]])) 4 | 5 | #_{:clj-kondo/ignore [:unused-binding]} 6 | (defn element 7 | [data] 8 | (let [{:keys [width height]} ( ForceGraph2D 11 | {:graphData data 12 | :width width 13 | :height height 14 | :minZoom 0.2 15 | :maxZoom 7.5 16 | :d3VelocityDecay 0.5 17 | :nodeVal :size 18 | #_#_:nodeLabel :title 19 | :nodeColor :color 20 | :onNodeClick #(>evt [::rf/graph-node->visit %1]) 21 | :onNodeHover #(>evt [::rf/hover-node %1]) 22 | :onNodeDrag #(>evt [::rf/hover-node %1]) 23 | :onNodeDragEnd #(>evt [::rf/hover-node nil]) 24 | :linkWidth 1}]))) 25 | -------------------------------------------------------------------------------- /src/kees/arena_graph/logic.cljs: -------------------------------------------------------------------------------- 1 | (ns kees.arena-graph.logic 2 | "Miscellaneous helper functions" 3 | (:require [clojure.string :as s])) 4 | 5 | (def ^:private ui-var 6 | (-> js/document.body 7 | js/window.getComputedStyle 8 | (.getPropertyValue "--ui") 9 | s/trim)) 10 | 11 | (defn- gen-hex 12 | "Supply three 2-tuples of [base variation] where base + variation <= 256" 13 | [& variance-tuples] 14 | (let [hex (fn [[n v]] (.toString (+ n (rand-int v)) 16)) 15 | pad (fn [n] (str (when (= 1 (count n)) "0") n))] 16 | (->> variance-tuples 17 | (map (comp pad hex)) 18 | (into ["#"]) 19 | (reduce str)))) 20 | 21 | (defmulti hex 22 | "Returns a hex color string" 23 | identity) 24 | (defmethod hex :default [_] "#FFFFFF") 25 | 26 | ;; In use 27 | (defmethod hex :static-var-ui [_] ui-var) 28 | (defmethod hex :gold-light [_] (gen-hex [0xFC 0] [0xD4 20] [0x48 40])) 29 | (defmethod hex :aqua [_] (gen-hex [0x8C 30] [0xD2 30] [0xBE 30])) 30 | 31 | ;; Misc 32 | (defmethod hex :gold [_] (gen-hex [0xDE 20] [0xCE 34] [0x32 20])) 33 | (defmethod hex :acid [_] (gen-hex [0x8B 70] [0xF2 14] [0 20])) 34 | (defmethod hex :green-murky [_] (gen-hex [0xAB 30] [0xC3 20] [0 10])) 35 | (defmethod hex :lavender [_] (gen-hex [0xC8 20] [0xB4 35] [0xC8 25])) 36 | 37 | (defn hex-map 38 | "Returns a hash-map supplying a random color in specified hue range" 39 | [color-key] 40 | {:color (hex color-key)}) 41 | 42 | (defn size-variant 43 | "Return a hash-map of :size to a float within [b,b+v)" 44 | [base variant] 45 | {:size (+ base (* variant (rand)))}) 46 | 47 | ;; Vector of 2-tuples [a b] where a is chance out of 1 that gif b is chosen. 48 | ;; Sum of numbers must be < 1 49 | (def ^:private gif-chances 50 | (sort 51 | [[0.02 "takase.gif"] 52 | [0.05 "sparkle.gif"] 53 | [0.1 "scroll.gif"] 54 | [0.1 "ripples.gif"] 55 | [0.25 "planet.gif"]])) 56 | 57 | ;; 1 - the sum of gif-chances is the probability of the default gif playing. 58 | (def ^:private default-gif 59 | "tan.gif") 60 | 61 | (defn which-gif 62 | [] 63 | (let [n (rand)] 64 | (loop [chances gif-chances 65 | acc 0] 66 | (let [[[probability filename] & remaining] chances 67 | acc (+ acc probability)] 68 | (cond 69 | (empty? chances) default-gif 70 | (< n acc) filename 71 | :else (recur remaining acc)))))) 72 | 73 | (defn into-by-key 74 | "Combines two vectors of maps, skipping repeated values of key k" 75 | [v1 v2 k] 76 | (let [key-compare (fn [acc el] 77 | (if (some #{(k el)} (map k acc)) 78 | acc 79 | (conj acc el)))] 80 | (reduce key-compare v1 v2))) 81 | -------------------------------------------------------------------------------- /src/kees/arena_graph/main.cljs: -------------------------------------------------------------------------------- 1 | #_{:clj-kondo/ignore [:unused-referred-var]} 2 | (ns kees.arena-graph.main 3 | (:require 4 | [reagent.dom :as rdom] 5 | [re-frame.core :as re-frame] 6 | [kees.arena-graph.rf :as rf :refer [evt >evt-now]] 7 | [kees.arena-graph.views :as views] 8 | [kees.arena-graph.config :as config])) 9 | 10 | (defn dev-setup [] 11 | (when config/debug? 12 | (println "dev mode"))) 13 | 14 | (defn ^:dev/after-load mount-root [] 15 | (re-frame/clear-subscription-cache!) 16 | (let [root (.getElementById js/document "app")] 17 | (rdom/unmount-component-at-node root) 18 | (rdom/render [views/main] root))) 19 | 20 | #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} 21 | (defn init [] 22 | (>evt-now [::rf/boot]) 23 | (dev-setup) 24 | (mount-root)) 25 | -------------------------------------------------------------------------------- /src/kees/arena_graph/rf.cljs: -------------------------------------------------------------------------------- 1 | (ns kees.arena-graph.rf 2 | (:require [ajax.core :refer [json-request-format json-response-format]] 3 | [clojure.string :as s] 4 | [re-frame.core :as re-frame :refer [reg-event-db reg-event-fx reg-sub reg-fx reg-cofx inject-cofx path]] 5 | [day8.re-frame.http-fx] 6 | [kees.arena-graph.logic :as logic] 7 | [kees.arena-graph.rf.console :as console] 8 | [kees.arena-graph.rf.flavor :as flavor])) 9 | 10 | ;; ========== SETUP ============================================================ 11 | (def evt re-frame/dispatch) 13 | (def >evt-now re-frame/dispatch-sync) 14 | (defn assoc [k v] (>evt [::assoc k v])) 16 | (defn >GET [opts] (>evt [::GET opts])) 17 | 18 | ;; Source!: https://clojureverse.org/t/9104/9 19 | (def ^:private url-query-params 20 | (let [query-arr (-> js/window 21 | .-location 22 | .-href 23 | js/URL. 24 | .-searchParams 25 | js/URLSearchParams. 26 | js/Array.from) 27 | f (fn [m [k v]] 28 | (update m (keyword k) (fn [cur] 29 | (cond 30 | (nil? cur) v 31 | (vector? cur) (conj cur v) 32 | :else [cur v]))))] 33 | (reduce f {} query-arr))) 34 | 35 | (reg-cofx 36 | :screen-width 37 | (fn [cofx] 38 | (let [width (.-innerWidth js/window)] 39 | (-> cofx 40 | (assoc :screen-width width) 41 | (assoc :vertical-layout? (<= width 666)))))) 42 | 43 | (def ^:private falsy-strs 44 | ["n" "no" "none" "false" "skip" "hide"]) 45 | (def ^:private skip-intro? 46 | (some #{(:intro url-query-params)} falsy-strs)) 47 | 48 | (def global-per 50) 49 | 50 | (def empty-graph 51 | {:nodes [] 52 | :links []}) 53 | 54 | (def default-progress 55 | {:current 0 56 | :total 0 57 | :channel-total 0 58 | :channel-current 0}) 59 | 60 | (def default-db 61 | {:graph-data empty-graph 62 | :thumb {} 63 | :hovered-node nil 64 | :console [] 65 | :version 2 66 | :skip-intro? skip-intro? 67 | :canvas-covered? false 68 | :initialized? false ; whether the app has finished its startup and intro 69 | :working? false ; whether to display "create" button / allow creation 70 | :active? false ; whether to display gif panel 71 | :progress default-progress 72 | #_#_ :palette-color :aqua ; for testing 73 | :style {:o1-color :gold-light 74 | :o2-color :aqua} 75 | :flavor {:completed-explanation-seen false}}) 76 | 77 | (def ^:private location "https://api.are.na/v2/") 78 | (def ^:private auth "") 79 | 80 | (def node-keys 81 | [:id :slug :title :owner_slug :base_class :user :length]) 82 | 83 | (reg-fx :tap (fn [data] (tap> data))) 84 | (reg-fx :error (fn [resp] (.error js/console "ERROR:" (clj->js resp)))) 85 | (reg-fx :browse (fn [url] (.open js/window url))) 86 | (reg-fx :blur (fn [] (.blur (.-activeElement js/document)))) 87 | 88 | ;; Provide a map with, at minimum, :path and :on-success kvs 89 | ; :path is a vector of the URI path components to be appended to the API URL 90 | ; :on-success is a namespaced kw for an event handler that accepts the response 91 | (reg-event-fx 92 | ::GET 93 | (fn [_ [_ {:keys [path] :as opts}]] 94 | (let [uri (->> path 95 | (mapv (comp #(s/replace % "^/|/$" "") str)) 96 | (interpose "/") 97 | (apply str location)) 98 | vwrap #(if (vector? %) % [%]) 99 | req-keys [:params :on-success :on-failure] 100 | supplied (-> opts 101 | (select-keys req-keys) 102 | (update :on-success vwrap) 103 | (update :on-failure vwrap)) 104 | default-opts {:method :get 105 | :timeout 15000 106 | :format (json-request-format) 107 | :response-format (json-response-format {:keywords? true}) 108 | :on-failure [::console/log :error "Oh no! Something went wrong."]} 109 | request (-> (merge default-opts supplied {:uri uri}) 110 | (assoc-in [:headers :authorization] auth))] 111 | {:fx [[:http-xhrio request]]}))) 112 | 113 | (reg-event-fx 114 | ::o1-GET-loop 115 | (fn [{:keys [db]} [_ pages remaining accumulation completion-evt & resp]] 116 | (let [channel (get-in db [:thumb :id]) 117 | current (dec remaining) 118 | accumulation (into accumulation (get (first resp) :contents))] 119 | (if (< remaining 1) 120 | {:fx [[:dispatch (conj completion-evt accumulation)]]} 121 | {:db (-> db 122 | (assoc-in [:progress :channel-current] (- pages current)) 123 | (assoc-in [:progress :channel-total] pages)) 124 | :fx [(when (< 1 pages) 125 | [:dispatch [::console/log :info "Requesting page" (- pages current) "of" pages]]) 126 | [:dispatch-later 127 | {:ms 500 128 | :dispatch [::GET 129 | {:path ["channels" channel "contents"] 130 | :params {:page (- pages current) 131 | :per global-per} 132 | :on-success [::o1-GET-loop 133 | pages 134 | current 135 | accumulation 136 | completion-evt] 137 | :on-failure [::console/log :error ":( Something went wrong"]}]}]]})))) 138 | 139 | (reg-event-fx 140 | ::o2-GET-node-loop 141 | (fn [_ [_ 142 | {:keys [id pages remaining accumulation completion-evt] 143 | :or {accumulation []}} 144 | & resp]] 145 | (let [current (dec remaining) 146 | accumulation (into accumulation (:contents (first resp)))] 147 | (if (< remaining 1) 148 | {:fx [[:dispatch (conj completion-evt accumulation)]]} 149 | (let [next-args {:id id 150 | :pages pages 151 | :remaining current 152 | :accumulation accumulation 153 | :completion-evt completion-evt}] 154 | {:fx [(when (< 1 pages) 155 | [:dispatch [::console/log :info "Requesting page" (- pages current) "of" pages]]) 156 | [:dispatch-later 157 | {:ms 750 158 | :dispatch [::GET 159 | {:path ["channels" id "contents"] 160 | :params {:page (- pages current) 161 | :per global-per} 162 | :on-success [::o2-GET-node-loop next-args] 163 | :on-failure [::GET-error next-args]}]}]]}))))) 164 | 165 | (reg-event-fx 166 | ::GET-error 167 | (fn [_ [_ next-args resp]] 168 | (let [{:keys [response]} resp] 169 | {:fx [[::flavor/request-error (:code response)] 170 | [:dispatch-later 171 | {:ms 2000 172 | :dispatch [::o2-GET-node-loop (update next-args :remaining dec)]}]]}))) 173 | 174 | ;; ========== EFFECTS ========================================================== 175 | (reg-event-fx 176 | ::boot 177 | [(inject-cofx :screen-width)] 178 | (fn [cofx _] 179 | (let [skip? (:skip-intro? default-db) 180 | layout (select-keys cofx [:screen-width :vertical-layout?])] 181 | {:db (merge default-db layout) 182 | :fx [[:dispatch [::flavor/intro skip?]]]}))) 183 | 184 | #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} 185 | (reg-event-fx 186 | ::tap 187 | (fn [_ [_ data]] 188 | {:fx [[:tap data]]})) 189 | 190 | (reg-event-db 191 | ::assoc 192 | (fn [db [_ k v]] 193 | (assoc db k v))) 194 | 195 | (reg-event-db 196 | ::set-busy 197 | (fn [db [_ bool]] 198 | (-> db 199 | (assoc :working? bool) 200 | (assoc :active? bool)))) 201 | 202 | (reg-event-db 203 | ::toggle-canvas-cover 204 | (fn [db _] 205 | (update db :canvas-covered? not))) 206 | 207 | (reg-event-fx 208 | ::select-channel-success 209 | (fn [{:keys [db]} [_ response]] 210 | {:db (assoc db :thumb response) 211 | :fx [[:dispatch-later 212 | [{:ms 500 213 | :dispatch [::console/delayed-log :guide 750 "Great! Looks like a valid channel."]} 214 | {:ms 1750 215 | :dispatch [::set-busy false]}]]]})) 216 | 217 | (reg-event-fx 218 | ::select-channel-failure 219 | (fn [_ [_ response]] 220 | (let [code (-> response :response :code)] 221 | {:fx [[:dispatch [::flavor/generic-error code]]]}))) 222 | 223 | (reg-event-fx 224 | ::select-channel 225 | (fn [{:keys [db]} [_ query]] 226 | (if-let [slug (re-find #"[-_a-z0-9]+$" query)] 227 | {:db (assoc db :working? true) 228 | :fx [[:blur nil] 229 | [:dispatch [::console/log :info "Changing channel to:" slug]] 230 | [:dispatch [::GET {:path ["channels" slug "thumb"] 231 | :on-success [::select-channel-success] 232 | :on-failure [::select-channel-failure]}]]]} 233 | {:fx [[:dispatch [::console/log :error "Are you sure that channel name is valid?"]]]}))) 234 | 235 | ;; Format a web URL for either channels or blocks and visit them in the browser 236 | (reg-event-fx 237 | ::graph-node->visit 238 | (fn [_ [_ m]] 239 | (let [{:keys [base_class owner_slug slug id]} (js->clj m :keywordize-keys true) 240 | path (if (= "Channel" base_class) 241 | [owner_slug slug] 242 | ["block" id]) 243 | url (apply str "https://are.na/" (interpose "/" path))] 244 | {:fx [[:browse url]]}))) 245 | 246 | (reg-event-fx 247 | ::hover-node 248 | (fn [{:keys [db]} [_ node]] 249 | (let [node-map (js->clj node :keywordize-keys true)] 250 | {:db (assoc db :hovered-node node-map) 251 | :fx (if node-map 252 | [[::console/show ["channel-info-container" "visible"]]] 253 | [[::console/hide ["channel-info-container" "visible"]]])}))) 254 | 255 | ;; Call with a thumb request 256 | (reg-event-db 257 | ::o0-populate 258 | [(path :graph-data)] 259 | (fn [data [_ thumb]] 260 | (let [node (-> thumb 261 | (select-keys node-keys) 262 | (merge (logic/size-variant 3.5 1) 263 | (logic/hex-map :static-var-ui) 264 | {:order 0}))] 265 | (update data :nodes conj node)))) 266 | 267 | ;; Call with a seq of channel maps 268 | (reg-event-db 269 | ::o1-populate 270 | [(path :graph-data)] 271 | (fn [data [_ channels]] 272 | (let [nodes (mapv 273 | #(-> (select-keys % node-keys) 274 | (merge (logic/size-variant 0.75 1) 275 | (logic/hex-map :gold-light) 276 | {:order 1})) 277 | channels)] 278 | (update data :nodes into nodes)))) 279 | 280 | (reg-event-db 281 | ::connect 282 | [(path :graph-data)] 283 | (fn [data [_ arg-map]] 284 | (let [{:keys [id channels color]} arg-map 285 | links (mapv 286 | #(hash-map :source (:id %) 287 | :target id 288 | :color (logic/hex color)) 289 | channels)] 290 | (update data :links into links)))) 291 | 292 | (reg-event-db 293 | ::o2-populate 294 | [(path :graph-data)] 295 | (fn [data [_ arg-map]] 296 | (let [{:keys [channels color]} arg-map 297 | nodes (mapv 298 | #(-> (select-keys % node-keys) 299 | (merge (logic/size-variant 0.5 0.5) 300 | (logic/hex-map color) 301 | {:order 2})) 302 | channels)] 303 | (update data :nodes logic/into-by-key nodes :id)))) 304 | 305 | ;; Block or continue initialization of graph crawl 306 | (reg-event-fx 307 | ::order-up 308 | (fn [{:keys [db]} _] 309 | (let [id (get-in db [:thumb :id]) 310 | id-unknown [[:dispatch [::console/log :error "I'm not finding the id of the channel."]]] 311 | in-progress [[:dispatch [::console/log :error "I'm already working on a graph! Be patient!"]]] 312 | continue [[:dispatch [::console/delayed-log :guide 500 "Okay, I'm getting to work"]] 313 | [:dispatch [::assoc :graph-data empty-graph]] 314 | [:blur nil] 315 | [:dispatch [::set-busy true]] 316 | [:dispatch [::assoc :progress default-progress]] 317 | [:dispatch [::o0-order-up id]]]] 318 | {:fx (cond 319 | (not id) id-unknown 320 | (:working? db) in-progress 321 | :else continue)}))) 322 | 323 | (reg-event-fx 324 | ::o0-order-up 325 | (fn [{:keys [db]} [_ id]] 326 | (let [thumb (:thumb db) 327 | length (:length thumb) 328 | pages (Math/ceil (/ length global-per))] 329 | {:fx [[:dispatch [::o0-populate thumb]] 330 | [:dispatch-later 331 | [{:ms 500 332 | :dispatch [::flavor/size-shaming pages]} 333 | {:ms 2000 334 | :dispatch [::o1-GET-loop 335 | pages pages [] [::o1-order-up id]]}]]]}))) 336 | 337 | (reg-event-fx 338 | ::o1-order-up 339 | (fn [{:keys [db]} [_ id contents]] 340 | (let [color (get-in db [:style :o1-color]) 341 | channels (filterv #(= (:base_class %) "Channel") contents)] 342 | (if (not-empty channels) 343 | {:fx [[:dispatch [::o1-populate channels]] 344 | [:dispatch [::connect {:id id 345 | :channels channels 346 | :color color}]] 347 | [:dispatch [::o2-order-loop (count channels) channels]]]} 348 | {:fx [[:dispatch [::flavor/no-channels]] 349 | [:dispatch [::set-busy false]]]})))) 350 | 351 | (reg-event-fx 352 | ::o2-order-loop 353 | (fn [{:keys [db]} [_ total remaining-channels]] 354 | (let [[active & remaining] remaining-channels 355 | {:keys [length id slug]} active 356 | pages (Math/ceil (/ length global-per)) 357 | current-num (- total (count remaining-channels) -1) 358 | processing-str (str "Processing channel " 359 | current-num " of " total 360 | ": " slug)] 361 | {:db (-> db 362 | (assoc-in [:progress :current] current-num) 363 | (assoc-in [:progress :total] total)) 364 | :fx [[:dispatch [::console/log :guide processing-str]] 365 | [:dispatch [::o2-GET-node-loop 366 | {:id id 367 | :pages pages 368 | :remaining pages 369 | :completion-evt [::o2-order-up total id remaining]}]]]}))) 370 | 371 | (reg-event-fx 372 | ::o2-order-up 373 | (fn [{:keys [db]} [_ total id remaining contents]] 374 | (let [color (get-in db [:style :o2-color]) 375 | channels (filterv #(= (:base_class %) "Channel") contents)] 376 | {:fx [[:dispatch [::o2-populate {:channels channels 377 | :color color}]] 378 | [:dispatch [::connect {:id id 379 | :channels channels 380 | :color color}]] 381 | (if remaining 382 | [:dispatch [::o2-order-loop total remaining]] 383 | [:dispatch [::complete]])]}))) 384 | 385 | ;; Display flavor and return app to prepared state 386 | (reg-event-fx 387 | ::complete 388 | (fn [{:keys [db]} _] 389 | {:fx [(if (get-in db [:flavor :completed-explanation-seen]) 390 | [:dispatch [::console/delayed-log :guide 1000 "Complete!"]] 391 | [:dispatch [::flavor/completed-explanation]]) 392 | [:dispatch [::set-busy false]]]})) 393 | 394 | ;; ========== SUBSCRIPTIONS ==================================================== 395 | ;; Use via the shortcut > message 18 | (interpose \space) 19 | (into [:span]))]) 20 | 21 | ;; #console-anchor is an empty fake el to target when scrolling to bottom 22 | (defn element 23 | [] 24 | (let [messages @(re-frame/subscribe [::messages])] 25 | [:div#console 26 | (into 27 | [:ul [:li#console-anchor [:span#typing "..."]]] 28 | messages)])) 29 | 30 | ;; ========== LOGIC ============================================================ 31 | (reg-fx 32 | :scroll 33 | (fn [id] 34 | (let [el (js/document.getElementById id)] 35 | (.scrollIntoView el #js{:top (.-offsetHeight id)})))) 36 | 37 | ;; Toggling display of an element (that's invisible by default) 38 | ;; Set display: none on original element if using class "display" 39 | ;; Set visibility: hidden on original element if using class "visible" 40 | (reg-fx 41 | ::show 42 | (fn [[id tmp-class]] 43 | (-> id js/document.getElementById .-classList (.add tmp-class)))) 44 | (reg-fx 45 | ::hide 46 | (fn [[id tmp-class]] 47 | (-> id js/document.getElementById .-classList (.remove tmp-class)))) 48 | ;; Believe an fx-wrapping event is necessary for delayed dispatch 49 | (reg-event-fx 50 | ::hide 51 | (fn [_ [_ [id tmp-class]]] 52 | {:fx [[::hide [id tmp-class]]]})) 53 | 54 | (reg-fx 55 | :restart-anim 56 | (fn [id] 57 | (let [el (js/document.getElementById id)] 58 | (set! (.. el -style -animationName) "none") 59 | (js/window.requestAnimationFrame 60 | #(set! (.. el -style -animationName) ""))))) 61 | 62 | ;; Display a little typing icon in the console for ms 63 | (reg-event-fx 64 | ::typing 65 | (fn [_ [_ ms]] 66 | {:fx [[::show ["typing" "displayed"]] 67 | [:restart-anim "typing"] 68 | [:scroll "console-anchor"] 69 | [:dispatch-later {:ms ms :dispatch [::hide ["typing" "displayed"]]}]]})) 70 | 71 | ;; Log a message to the console DOM element (not browser console) 72 | (reg-event-fx 73 | ::log 74 | (fn [{:keys [db]} [_ type & message]] 75 | {:db (update db :console (partial cons (li type message))) 76 | :fx [[:scroll "console-anchor"]]})) 77 | 78 | ;; Display a typing message for ms and log something immediately after 79 | (reg-event-fx 80 | ::delayed-log 81 | (fn [_ [_ type ms & message]] 82 | {:fx [[:dispatch [::typing ms]] 83 | [:dispatch-later {:ms ms :dispatch (into [::log type] message)}]]})) 84 | 85 | ;; New sub instead of db 15 | (assoc :working? bool) 16 | (assoc :active? bool)))) 17 | ;; Hm... 18 | 19 | ;; ========== GENERIC FLAVOR TEXT ============================================== 20 | (reg-event-fx 21 | ::intro 22 | (fn [_ [_ skip?]] 23 | (if skip? 24 | {:fx [[:dispatch [::set-initialized]] 25 | [:dispatch [::console/log :guide "Go!"]]]} 26 | (let [intro "I'll map out connections on the website are.na. Add a channel's URL to get started."] 27 | {:fx [[:dispatch-later 28 | [{:ms 1500 29 | :dispatch [::console/delayed-log :guide 900 "Hi!"]} 30 | {:ms 3250 31 | :dispatch [::console/delayed-log :guide 2250 intro]} 32 | {:ms 7000 33 | :dispatch [::set-initialized]}]]]})))) 34 | 35 | ;; A subtle nudge about what size of channel may work better. 36 | (reg-event-fx 37 | ::size-shaming 38 | (fn [_ [_ pages]] 39 | (let [extra-large [[:dispatch [::console/delayed-log :guide 500 "You're really gonna do that? That's a giant channel. Well..."]]] 40 | large [[:dispatch [::console/delayed-log :guide 500 "Wow, that's some channel! This will take a little time."]]] 41 | medium [[:dispatch [::console/delayed-log :guide 500 "That's a decent sized channel. I'll start looking now."]]]] 42 | {:fx (cond 43 | (< 22 pages) extra-large 44 | (< 13 pages) large 45 | (< 6 pages) medium 46 | :else [])}))) 47 | 48 | (reg-event-fx 49 | ::completed-explanation 50 | (fn [{:keys [db]} _] 51 | {:db (assoc-in db [:flavor :completed-explanation-seen] true) 52 | :fx [[:dispatch-later 53 | [{:ms 1500 54 | :dispatch [::console/delayed-log :guide 3500 "Alright it's done! Enjoy. On the desktop you can hover over nodes to see what channels they represent."]} 55 | {:ms 7500 56 | :dispatch [::console/delayed-log :guide 3000 "And clicking a node visits its channel if you didn't notice."]}]]]})) 57 | 58 | 59 | ;; ========== EVENT HANDLING =================================================== 60 | (reg-event-fx 61 | ::request-error 62 | (fn [_ [_ code]] 63 | {:fx [[:dispatch [::console/log :error "Something's gone wrong working with this channel!"]] 64 | [:dispatch [::console/log :error "The most recent request returned a" code "code."]] 65 | [:dispatch [::console/delayed-log :guide 1250 "I'll try again and skip the one that's seeming to cause the problem. Unfortunately some nodes and connections might be missed."]]]})) 66 | 67 | (reg-event-fx 68 | ::unauthorized 69 | (fn [_ [_ code]] 70 | {:fx [[:dispatch [::console/log :error "I got a " code "code."]] 71 | [:dispatch [::console/delayed-log :guide 1000 "That means you weren't authorized to make that request. Is the channel private?"]] 72 | [:dispatch-later 73 | [{:ms 2000 74 | :dispatch [::console/delayed-log :guide 1750 "Sorry... I can't take credentials right now. How about something else?"]} 75 | {:ms 3750 76 | :dispatch [::set-busy false]}]]]})) 77 | 78 | (reg-event-fx 79 | ::no-channels 80 | (fn [_ _] 81 | {:fx [[:dispatch [::console/log :error "The channel you chose doesn't contain links to any other channels!"]]]})) 82 | 83 | (reg-event-fx 84 | ::unknown-error 85 | (fn [_ [_ code]] 86 | {:fx [[:dispatch [::console/log :error "Something's really wrong! The request returned a" code "code."]] 87 | [:dispatch-later 88 | [{:ms 350 89 | :dispatch [::console/delayed-log :guide 1150 "I don't know how to deal with this... Ahh..."]} 90 | {:ms 1750 91 | :dispatch [::console/log :guide "Okay I collected myself. Ready to try something else"]} 92 | {:ms 2000 93 | :dispatch [::set-busy false]}]]]})) 94 | 95 | (reg-event-fx 96 | ::generic-error 97 | (fn [_ [_ code]] 98 | (let [action (case code 99 | 401 [:dispatch [::unauthorized code]] 100 | [:dispatch [::unknown-error code]])] 101 | {:fx [action]}))) 102 | -------------------------------------------------------------------------------- /src/kees/arena_graph/views.cljs: -------------------------------------------------------------------------------- 1 | #_{:clj-kondo/ignore [:unused-referred-var]} 2 | (ns kees.arena-graph.views 3 | (:require [reagent.core :as r] 4 | [kees.arena-graph.graphs :as graphs] 5 | [kees.arena-graph.rf.console :as console] 6 | [kees.arena-graph.rf :as rf :refer [evt >assoc >GET]] 7 | [kees.arena-graph.logic :as logic])) 8 | 9 | (defn- graph 10 | "The container for the generated force graph (initially blank)" 11 | [] 12 | [graphs/element (evt [::rf/select-channel @value]) 30 | (reset! value "")) 31 | handle-change (fn [e] 32 | (reset! value (.. e -target -value))) 33 | handle-keypress (fn [e] 34 | (when (= (.-code e) "Enter") 35 | (confirm)))] 36 | (fn [] 37 | [:div#controls>span 38 | [:input 39 | {:on-change handle-change 40 | :on-key-press handle-keypress 41 | :value @value}] 42 | (when (not= "" @value) 43 | [:button 44 | {:on-click confirm 45 | :style {:font-size "2rem"}} 46 | (char 0x2192)]) 47 | (when (and (not (evt [::rf/order-up])} 52 | "create"])]))) 53 | 54 | (defn- controls-cover 55 | [] 56 | (let [initialized? ( (/ current total 0.01) 84 | js/Math.round 85 | (str "%")))) 86 | 87 | (defn progress-bar-filler 88 | [basis flex-direction] 89 | [:div.progress-bar-filler 90 | {:style {:flex-basis basis 91 | :flex-direction flex-direction}}]) 92 | 93 | (defn- progress-bar-1 94 | [] 95 | (let [{:keys [channel-current channel-total]} (a.nav-button {:href "https://github.com/kees-/arena-graph" 172 | :target "_blank"} 173 | [:div#github]] 174 | [:span>a.nav-button {:href "https://www.are.na/block/19423227" 175 | :target "_blank"} 176 | [:div#arena]] 177 | [:span>button.nav-button 178 | {:on-click #(>evt [::rf/toggle-canvas-cover])} 179 | [:div#close]]]) 180 | 181 | #_ 182 | (defn- palette 183 | "Generates an 8x8 color palette to test the acceptable color ranges" 184 | [] 185 | (let [palette-color (assoc :palette-color color)) 207 | panel (into 208 | [:div 209 | {:style {:display "flex" 210 | :flex-flow "column nowrap" 211 | :justify-content "space-around"}}] 212 | (for [color (keys (methods logic/hex)) 213 | :let [color-str (name color)]] 214 | [:button 215 | {:key color 216 | :on-click (partial color-picker color) 217 | :style {:cursor "pointer"}} 218 | color-str]))] 219 | [:div 220 | {:style {:display "flex" 221 | :flex-flow "row nowrap" 222 | :justify-content "center" 223 | :gap "1rem"}} 224 | (into element squares) 225 | panel])) 226 | 227 | (defn main [] 228 | [:main 229 | [:header 230 | [:h1 (