├── .circleci └── config.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin └── pack_and_deploy.sh ├── deps.edn ├── doc └── intro.md ├── package-lock.json ├── package.json ├── pom.xml ├── public └── index.html ├── shadow-cljs.edn ├── src └── re_frame_routing │ ├── coercion.cljs │ ├── core.cljs │ ├── events.cljs │ └── subscriptions.cljs └── test └── re_frame_routing ├── coercion_test.cljs ├── core_test.cljs └── events_test.cljs /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Clojure CircleCI 2.0 configuration file 2 | version: 2 3 | jobs: 4 | build: 5 | docker: 6 | - image: oconn/cljs-build-image:latest 7 | 8 | working_directory: ~/repo 9 | 10 | environment: 11 | # Customize the JVM maximum heap limit 12 | JVM_OPTS: -Xmx3200m 13 | 14 | steps: 15 | - checkout 16 | 17 | - restore_cache: 18 | keys: 19 | - v1-dependencies-{{ checksum "deps.edn" }} 20 | # fallback to using the latest cache if no exact match is found 21 | - v1-dependencies- 22 | 23 | - save_cache: 24 | paths: 25 | - ~/.m2 26 | key: v1-dependencies-{{ checksum "deps.edn" }} 27 | 28 | - run: clojure -Atest 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /classes 3 | /checkouts 4 | pom.xml.asc 5 | *.jar 6 | *.class 7 | /.lein-* 8 | /.nrepl-history 9 | /.nrepl-port 10 | .hgignore 11 | .hg/ 12 | .cpcache 13 | cljs-test-runner-out 14 | .lsp 15 | 16 | node_modules/ 17 | public/js 18 | .shadow-cljs 19 | 20 | 21 | out/ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). 3 | 4 | ## [Unreleased] 5 | ### Changed 6 | - Add a new arity to `make-widget-async` to provide a different widget shape. 7 | 8 | ## [0.1.1] - 2017-10-26 9 | ### Changed 10 | - Documentation on how to make the widgets. 11 | 12 | ### Removed 13 | - `make-widget-sync` - we're all async, all the time. 14 | 15 | ### Fixed 16 | - Fixed widget maker to keep working when daylight savings switches over. 17 | 18 | ## 0.1.0 - 2017-10-26 19 | ### Added 20 | - Files from the new template. 21 | - Widget maker public API - `make-widget-sync`. 22 | 23 | [Unreleased]: https://github.com/your-name/re-frame-request/compare/0.1.1...HEAD 24 | [0.1.1]: https://github.com/your-name/re-frame-request/compare/0.1.0...0.1.1 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC 2 | LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM 3 | CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 4 | 5 | 1. DEFINITIONS 6 | 7 | "Contribution" means: 8 | 9 | a) in the case of the initial Contributor, the initial code and 10 | documentation distributed under this Agreement, and 11 | 12 | b) in the case of each subsequent Contributor: 13 | 14 | i) changes to the Program, and 15 | 16 | ii) additions to the Program; 17 | 18 | where such changes and/or additions to the Program originate from and are 19 | distributed by that particular Contributor. A Contribution 'originates' from 20 | a Contributor if it was added to the Program by such Contributor itself or 21 | anyone acting on such Contributor's behalf. Contributions do not include 22 | additions to the Program which: (i) are separate modules of software 23 | distributed in conjunction with the Program under their own license 24 | agreement, and (ii) are not derivative works of the Program. 25 | 26 | "Contributor" means any person or entity that distributes the Program. 27 | 28 | "Licensed Patents" mean patent claims licensable by a Contributor which are 29 | necessarily infringed by the use or sale of its Contribution alone or when 30 | combined with the Program. 31 | 32 | "Program" means the Contributions distributed in accordance with this 33 | Agreement. 34 | 35 | "Recipient" means anyone who receives the Program under this Agreement, 36 | including all Contributors. 37 | 38 | 2. GRANT OF RIGHTS 39 | 40 | a) Subject to the terms of this Agreement, each Contributor hereby grants 41 | Recipient a non-exclusive, worldwide, royalty-free copyright license to 42 | reproduce, prepare derivative works of, publicly display, publicly perform, 43 | distribute and sublicense the Contribution of such Contributor, if any, and 44 | such derivative works, in source code and object code form. 45 | 46 | b) Subject to the terms of this Agreement, each Contributor hereby grants 47 | Recipient a non-exclusive, worldwide, royalty-free patent license under 48 | Licensed Patents to make, use, sell, offer to sell, import and otherwise 49 | transfer the Contribution of such Contributor, if any, in source code and 50 | object code form. This patent license shall apply to the combination of the 51 | Contribution and the Program if, at the time the Contribution is added by the 52 | Contributor, such addition of the Contribution causes such combination to be 53 | covered by the Licensed Patents. The patent license shall not apply to any 54 | other combinations which include the Contribution. No hardware per se is 55 | licensed hereunder. 56 | 57 | c) Recipient understands that although each Contributor grants the licenses 58 | to its Contributions set forth herein, no assurances are provided by any 59 | Contributor that the Program does not infringe the patent or other 60 | intellectual property rights of any other entity. Each Contributor disclaims 61 | any liability to Recipient for claims brought by any other entity based on 62 | infringement of intellectual property rights or otherwise. As a condition to 63 | exercising the rights and licenses granted hereunder, each Recipient hereby 64 | assumes sole responsibility to secure any other intellectual property rights 65 | needed, if any. For example, if a third party patent license is required to 66 | allow Recipient to distribute the Program, it is Recipient's responsibility 67 | to acquire that license before distributing the Program. 68 | 69 | d) Each Contributor represents that to its knowledge it has sufficient 70 | copyright rights in its Contribution, if any, to grant the copyright license 71 | set forth in this Agreement. 72 | 73 | 3. REQUIREMENTS 74 | 75 | A Contributor may choose to distribute the Program in object code form under 76 | its own license agreement, provided that: 77 | 78 | a) it complies with the terms and conditions of this Agreement; and 79 | 80 | b) its license agreement: 81 | 82 | i) effectively disclaims on behalf of all Contributors all warranties and 83 | conditions, express and implied, including warranties or conditions of title 84 | and non-infringement, and implied warranties or conditions of merchantability 85 | and fitness for a particular purpose; 86 | 87 | ii) effectively excludes on behalf of all Contributors all liability for 88 | damages, including direct, indirect, special, incidental and consequential 89 | damages, such as lost profits; 90 | 91 | iii) states that any provisions which differ from this Agreement are offered 92 | by that Contributor alone and not by any other party; and 93 | 94 | iv) states that source code for the Program is available from such 95 | Contributor, and informs licensees how to obtain it in a reasonable manner on 96 | or through a medium customarily used for software exchange. 97 | 98 | When the Program is made available in source code form: 99 | 100 | a) it must be made available under this Agreement; and 101 | 102 | b) a copy of this Agreement must be included with each copy of the Program. 103 | 104 | Contributors may not remove or alter any copyright notices contained within 105 | the Program. 106 | 107 | Each Contributor must identify itself as the originator of its Contribution, 108 | if any, in a manner that reasonably allows subsequent Recipients to identify 109 | the originator of the Contribution. 110 | 111 | 4. COMMERCIAL DISTRIBUTION 112 | 113 | Commercial distributors of software may accept certain responsibilities with 114 | respect to end users, business partners and the like. While this license is 115 | intended to facilitate the commercial use of the Program, the Contributor who 116 | includes the Program in a commercial product offering should do so in a 117 | manner which does not create potential liability for other Contributors. 118 | Therefore, if a Contributor includes the Program in a commercial product 119 | offering, such Contributor ("Commercial Contributor") hereby agrees to defend 120 | and indemnify every other Contributor ("Indemnified Contributor") against any 121 | losses, damages and costs (collectively "Losses") arising from claims, 122 | lawsuits and other legal actions brought by a third party against the 123 | Indemnified Contributor to the extent caused by the acts or omissions of such 124 | Commercial Contributor in connection with its distribution of the Program in 125 | a commercial product offering. The obligations in this section do not apply 126 | to any claims or Losses relating to any actual or alleged intellectual 127 | property infringement. In order to qualify, an Indemnified Contributor must: 128 | a) promptly notify the Commercial Contributor in writing of such claim, and 129 | b) allow the Commercial Contributor tocontrol, and cooperate with the 130 | Commercial Contributor in, the defense and any related settlement 131 | negotiations. The Indemnified Contributor may participate in any such claim 132 | at its own expense. 133 | 134 | For example, a Contributor might include the Program in a commercial product 135 | offering, Product X. That Contributor is then a Commercial Contributor. If 136 | that Commercial Contributor then makes performance claims, or offers 137 | warranties related to Product X, those performance claims and warranties are 138 | such Commercial Contributor's responsibility alone. Under this section, the 139 | Commercial Contributor would have to defend claims against the other 140 | Contributors related to those performance claims and warranties, and if a 141 | court requires any other Contributor to pay any damages as a result, the 142 | Commercial Contributor must pay those damages. 143 | 144 | 5. NO WARRANTY 145 | 146 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON 147 | AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER 148 | EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR 149 | CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A 150 | PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the 151 | appropriateness of using and distributing the Program and assumes all risks 152 | associated with its exercise of rights under this Agreement , including but 153 | not limited to the risks and costs of program errors, compliance with 154 | applicable laws, damage to or loss of data, programs or equipment, and 155 | unavailability or interruption of operations. 156 | 157 | 6. DISCLAIMER OF LIABILITY 158 | 159 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 160 | CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, 161 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION 162 | LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 163 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 164 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 165 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY 166 | OF SUCH DAMAGES. 167 | 168 | 7. GENERAL 169 | 170 | If any provision of this Agreement is invalid or unenforceable under 171 | applicable law, it shall not affect the validity or enforceability of the 172 | remainder of the terms of this Agreement, and without further action by the 173 | parties hereto, such provision shall be reformed to the minimum extent 174 | necessary to make such provision valid and enforceable. 175 | 176 | If Recipient institutes patent litigation against any entity (including a 177 | cross-claim or counterclaim in a lawsuit) alleging that the Program itself 178 | (excluding combinations of the Program with other software or hardware) 179 | infringes such Recipient's patent(s), then such Recipient's rights granted 180 | under Section 2(b) shall terminate as of the date such litigation is filed. 181 | 182 | All Recipient's rights under this Agreement shall terminate if it fails to 183 | comply with any of the material terms or conditions of this Agreement and 184 | does not cure such failure in a reasonable period of time after becoming 185 | aware of such noncompliance. If all Recipient's rights under this Agreement 186 | terminate, Recipient agrees to cease use and distribution of the Program as 187 | soon as reasonably practicable. However, Recipient's obligations under this 188 | Agreement and any licenses granted by Recipient relating to the Program shall 189 | continue and survive. 190 | 191 | Everyone is permitted to copy and distribute copies of this Agreement, but in 192 | order to avoid inconsistency the Agreement is copyrighted and may only be 193 | modified in the following manner. The Agreement Steward reserves the right to 194 | publish new versions (including revisions) of this Agreement from time to 195 | time. No one other than the Agreement Steward has the right to modify this 196 | Agreement. The Eclipse Foundation is the initial Agreement Steward. The 197 | Eclipse Foundation may assign the responsibility to serve as the Agreement 198 | Steward to a suitable separate entity. Each new version of the Agreement will 199 | be given a distinguishing version number. The Program (including 200 | Contributions) may always be distributed subject to the version of the 201 | Agreement under which it was received. In addition, after a new version of 202 | the Agreement is published, Contributor may elect to distribute the Program 203 | (including its Contributions) under the new version. Except as expressly 204 | stated in Sections 2(a) and 2(b) above, Recipient receives no rights or 205 | licenses to the intellectual property of any Contributor under this 206 | Agreement, whether expressly, by implication, estoppel or otherwise. All 207 | rights in the Program not expressly granted under this Agreement are 208 | reserved. 209 | 210 | This Agreement is governed by the laws of the State of New York and the 211 | intellectual property laws of the United States of America. No party to this 212 | Agreement will bring a legal action under this Agreement more than one year 213 | after the cause of action arose. Each party waives its rights to a jury trial 214 | in any resulting litigation. 215 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # re-frame-routing 2 | 3 | ClojureScript (re-frame) library that manages routing and route state. 4 | 5 | **re-frame-routing** is built on top of [bidi](https://github.com/juxt/bidi) and persists route state to [re-frame's](https://github.com/Day8/re-frame) app state. Registering *re-frame-routing* to an existing re-frame application is ease. 6 | 7 | 8 | ### Step 1: Install 9 | 10 | [![Clojars Project](https://img.shields.io/clojars/v/oconn/re-frame-routing.svg)](https://clojars.org/oconn/re-frame-routing) 11 | 12 | [![CircleCI](https://circleci.com/gh/oconn/re-frame-routing/tree/master.svg?style=shield)](https://circleci.com/gh/oconn/re-frame-routing/tree/master) 13 | 14 | ### Step 2: Import Events 15 | 16 | ```cljs 17 | (ns app.events.core 18 | (:require [re-frame-routing.core :as rfr] 19 | 20 | [app.router.core :as router])) 21 | 22 | (rfr/register-events {:routes router/routes}) 23 | ``` 24 | 25 | ### Step 3: Import Subscriptions 26 | 27 | ```cljs 28 | (ns app.subscriptions.core 29 | (:require [re-frame-routing.core :as rfr])) 30 | 31 | (rfr/register-subscriptions) 32 | ``` 33 | 34 | ## Route Middleware 35 | 36 | *(Note this API is subject to change in future releases)* 37 | 38 | ### Pre Dom Render Loading 39 | 40 | Sometimes it's nice to perform work when a route is loading, maybe even prevent the route's view from displaying until that work is done, or even redirect if a user does not have access to view the route. These are good use cases for route-middleware. 41 | 42 | To add route-middleware to a route, first create the route-middleware function 43 | 44 | ```cljs 45 | (def route-middleware 46 | (rfr/create-route-middleware {:loading-view loading/render})) 47 | ``` 48 | 49 | `loading-view` is a reagent component that will display while your route is loading. 50 | 51 | Now let's say you have a sign-in page, but only unauthenticated users should be able to view it. Here is you sign-in route with no middleware 52 | 53 | ```cljs 54 | (defmethod containers :sign-in [] 55 | [sign-in/render]) 56 | ``` 57 | 58 | And now we add some middleware 59 | 60 | ```cljs 61 | (defmethod containers :sign-in [] 62 | [(route-middleware 63 | sign-in/render 64 | [redirect-authenticated])]) 65 | ``` 66 | 67 | Without diving into `redirect-authenticated` quite yet, let's first look at our `route-middleware` function. It takes in a view component and a vector of middleware functions (executed from left to right). The result after all functions have executed is the view. The view will receive path and query params as arguments. 68 | 69 | Next let's look at `redirect-authenticated` 70 | 71 | ```cljs 72 | (defn redirect-authenticated 73 | "Redirects authenticated users to the authenticated home page" 74 | [{:keys [route-query route-params] :as ctx}] 75 | (let [is-authenticated (re-frame/subscribe [:user/is-authenticated?])] 76 | 77 | (when (true? @is-authenticated) 78 | (re-frame/dispatch [:router/nav-to "/authenticated-home"])) 79 | 80 | (if (true? @is-authenticated) 81 | (assoc ctx :is-loading true) 82 | ctx))) 83 | ``` 84 | 85 | Middleware functions will be passed a context object and are expected to return a context object. To prevent the execution of the next middleware function in the chain, toggle the `is-loading` property on the middleware context object to `true`. 86 | 87 | 88 | ### Route Coercion 89 | 90 | Given data sent to the servers and to the component originates from information synced in the url (path and query params), it's ideal to have a way to share concerns over configuration (coercion and defaults). 91 | The library supports that concern by allowing you to supply an `routes-enirched` tree where leafs can be supplied a configuration instead of a keyword. e.g 92 | 93 | ``` 94 | {:query {:site {:coercion int?} 95 | :role {:coercion int?} 96 | :learner {:coercion #{"least-ready" "most-ready" "highest-mindset" "lowest-mindset"} 97 | :default "least-ready"} 98 | :current-page {:coercion int? 99 | :default 0}}} 100 | ``` 101 | 102 | this will then provide a route-parameters map to the component. e.g 103 | 104 | ``` 105 | {:route-parameters {:role 1 :learner "least-ready" :site 2 :current-page 0}} 106 | ``` 107 | 108 | This functionality is then handled by [spec-tools](https://github.com/metosin/spec-tools). Overall this is a less feature rich version of what's provided by [reitit](https://github.com/metosin/reitit/blob/master/doc/coercion/clojure_spec_coercion.md). 109 | 110 | 111 | ## Development 112 | 113 | Run ` clj -M:shadow-cljs watch app` to and get a watched build. See Shadow cljs docs for more. 114 | 115 | ## License 116 | 117 | Copyright © 2018 Matt O'Connell 118 | 119 | Distributed under the Eclipse Public License. 120 | -------------------------------------------------------------------------------- /bin/pack_and_deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [[ $(git diff --stat) != '' ]]; then 4 | echo "Error: dirty repo" 5 | exit 1 6 | elif [[ $(git rev-parse --show-toplevel) != $(pwd) ]]; then 7 | echo "Error: Not in root directory" 8 | exit 1 9 | elif [ -z "$CLOJARS_USERNAME" ]; then 10 | echo "Error: CLOJARS_USERNAME is empty" 11 | exit 1 12 | elif [ -z "$CLOJARS_PASSWORD" ]; then 13 | echo "Error: CLOJARS_PASSWORD is empty" 14 | exit 1 15 | fi 16 | 17 | # Generate pom file 18 | clojure -Spom 19 | 20 | perl -pi -e "s/HEAD/$(git rev-parse HEAD)/g" pom.xml 21 | 22 | # Generate jar file 23 | rm -f app.jar 24 | clojure -Apack 25 | 26 | # Upload to clojars 27 | clj -Adeploy 28 | 29 | perl -pi -e "s/$(git rev-parse HEAD)/HEAD/g" pom.xml 30 | 31 | # Format pom file 32 | xmllint --format pom.xml > pom.xml-formatted 33 | mv pom.xml-formatted pom.xml 34 | -------------------------------------------------------------------------------- /deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | 3 | :deps {bidi/bidi {:mvn/version "2.1.6"} 4 | com.cemerick/url {:mvn/version "0.1.1"} 5 | kibu/pushy {:mvn/version "0.3.8"} 6 | re-frame/re-frame {:mvn/version "0.10.6"} 7 | metosin/spec-tools {:mvn/version "0.10.5"}} 8 | 9 | :aliases {:test 10 | {:extra-deps {org.clojure/clojurescript {:mvn/version "1.10.520"} 11 | olical/cljs-test-runner {:mvn/version "3.2.0"}} 12 | :extra-paths ["test"] 13 | :main-opts ["-m" "cljs-test-runner.main"]} 14 | 15 | :pack 16 | {:main-opts 17 | ["-m" "mach.pack.alpha.skinny" "--no-libs" "--project-path" "app.jar"] 18 | 19 | :extra-deps 20 | {pack/pack.alpha {:git/url "https://github.com/juxt/pack.alpha.git" 21 | :sha "c70740ffc10805f34836da2160fa1899601fac02"}}} 22 | 23 | :deploy 24 | {:main-opts 25 | ["-m" "deps-deploy.deps-deploy" "deploy" "app.jar"] 26 | 27 | :extra-deps 28 | {deps-deploy {:mvn/version "RELEASE"}}} 29 | 30 | :shadow-cljs 31 | {:extra-deps {thheller/shadow-cljs {:mvn/version "2.15.10"}} 32 | :main-opts ["-m" "shadow.cljs.devtools.cli"]}}} 33 | -------------------------------------------------------------------------------- /doc/intro.md: -------------------------------------------------------------------------------- 1 | # Introduction to re-frame-request 2 | 3 | TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) 4 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "re-frame-routing", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "create-react-class": "^15.7.0", 9 | "react": "^17.0.2", 10 | "react-dom": "^17.0.2", 11 | "shadow-cljs": "^2.15.10" 12 | } 13 | }, 14 | "node_modules/asn1.js": { 15 | "version": "5.4.1", 16 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 17 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 18 | "dependencies": { 19 | "bn.js": "^4.0.0", 20 | "inherits": "^2.0.1", 21 | "minimalistic-assert": "^1.0.0", 22 | "safer-buffer": "^2.1.0" 23 | } 24 | }, 25 | "node_modules/asn1.js/node_modules/bn.js": { 26 | "version": "4.12.0", 27 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 28 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 29 | }, 30 | "node_modules/assert": { 31 | "version": "1.5.0", 32 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 33 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 34 | "dependencies": { 35 | "object-assign": "^4.1.1", 36 | "util": "0.10.3" 37 | } 38 | }, 39 | "node_modules/assert/node_modules/inherits": { 40 | "version": "2.0.1", 41 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 42 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" 43 | }, 44 | "node_modules/assert/node_modules/util": { 45 | "version": "0.10.3", 46 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 47 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 48 | "dependencies": { 49 | "inherits": "2.0.1" 50 | } 51 | }, 52 | "node_modules/base64-js": { 53 | "version": "1.5.1", 54 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 55 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 56 | "funding": [ 57 | { 58 | "type": "github", 59 | "url": "https://github.com/sponsors/feross" 60 | }, 61 | { 62 | "type": "patreon", 63 | "url": "https://www.patreon.com/feross" 64 | }, 65 | { 66 | "type": "consulting", 67 | "url": "https://feross.org/support" 68 | } 69 | ] 70 | }, 71 | "node_modules/bn.js": { 72 | "version": "5.2.0", 73 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 74 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" 75 | }, 76 | "node_modules/brorand": { 77 | "version": "1.1.0", 78 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 79 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 80 | }, 81 | "node_modules/browserify-aes": { 82 | "version": "1.2.0", 83 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 84 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 85 | "dependencies": { 86 | "buffer-xor": "^1.0.3", 87 | "cipher-base": "^1.0.0", 88 | "create-hash": "^1.1.0", 89 | "evp_bytestokey": "^1.0.3", 90 | "inherits": "^2.0.1", 91 | "safe-buffer": "^5.0.1" 92 | } 93 | }, 94 | "node_modules/browserify-cipher": { 95 | "version": "1.0.1", 96 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 97 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 98 | "dependencies": { 99 | "browserify-aes": "^1.0.4", 100 | "browserify-des": "^1.0.0", 101 | "evp_bytestokey": "^1.0.0" 102 | } 103 | }, 104 | "node_modules/browserify-des": { 105 | "version": "1.0.2", 106 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 107 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 108 | "dependencies": { 109 | "cipher-base": "^1.0.1", 110 | "des.js": "^1.0.0", 111 | "inherits": "^2.0.1", 112 | "safe-buffer": "^5.1.2" 113 | } 114 | }, 115 | "node_modules/browserify-rsa": { 116 | "version": "4.1.0", 117 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 118 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 119 | "dependencies": { 120 | "bn.js": "^5.0.0", 121 | "randombytes": "^2.0.1" 122 | } 123 | }, 124 | "node_modules/browserify-sign": { 125 | "version": "4.2.1", 126 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 127 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 128 | "dependencies": { 129 | "bn.js": "^5.1.1", 130 | "browserify-rsa": "^4.0.1", 131 | "create-hash": "^1.2.0", 132 | "create-hmac": "^1.1.7", 133 | "elliptic": "^6.5.3", 134 | "inherits": "^2.0.4", 135 | "parse-asn1": "^5.1.5", 136 | "readable-stream": "^3.6.0", 137 | "safe-buffer": "^5.2.0" 138 | } 139 | }, 140 | "node_modules/browserify-sign/node_modules/readable-stream": { 141 | "version": "3.6.0", 142 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 143 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 144 | "dependencies": { 145 | "inherits": "^2.0.3", 146 | "string_decoder": "^1.1.1", 147 | "util-deprecate": "^1.0.1" 148 | }, 149 | "engines": { 150 | "node": ">= 6" 151 | } 152 | }, 153 | "node_modules/browserify-zlib": { 154 | "version": "0.2.0", 155 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 156 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 157 | "dependencies": { 158 | "pako": "~1.0.5" 159 | } 160 | }, 161 | "node_modules/buffer": { 162 | "version": "4.9.2", 163 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 164 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 165 | "dependencies": { 166 | "base64-js": "^1.0.2", 167 | "ieee754": "^1.1.4", 168 | "isarray": "^1.0.0" 169 | } 170 | }, 171 | "node_modules/buffer-xor": { 172 | "version": "1.0.3", 173 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 174 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 175 | }, 176 | "node_modules/builtin-status-codes": { 177 | "version": "3.0.0", 178 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 179 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 180 | }, 181 | "node_modules/cipher-base": { 182 | "version": "1.0.4", 183 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 184 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 185 | "dependencies": { 186 | "inherits": "^2.0.1", 187 | "safe-buffer": "^5.0.1" 188 | } 189 | }, 190 | "node_modules/console-browserify": { 191 | "version": "1.2.0", 192 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 193 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" 194 | }, 195 | "node_modules/constants-browserify": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 198 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 199 | }, 200 | "node_modules/core-util-is": { 201 | "version": "1.0.3", 202 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 203 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 204 | }, 205 | "node_modules/create-ecdh": { 206 | "version": "4.0.4", 207 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 208 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 209 | "dependencies": { 210 | "bn.js": "^4.1.0", 211 | "elliptic": "^6.5.3" 212 | } 213 | }, 214 | "node_modules/create-ecdh/node_modules/bn.js": { 215 | "version": "4.12.0", 216 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 217 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 218 | }, 219 | "node_modules/create-hash": { 220 | "version": "1.2.0", 221 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 222 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 223 | "dependencies": { 224 | "cipher-base": "^1.0.1", 225 | "inherits": "^2.0.1", 226 | "md5.js": "^1.3.4", 227 | "ripemd160": "^2.0.1", 228 | "sha.js": "^2.4.0" 229 | } 230 | }, 231 | "node_modules/create-hmac": { 232 | "version": "1.1.7", 233 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 234 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 235 | "dependencies": { 236 | "cipher-base": "^1.0.3", 237 | "create-hash": "^1.1.0", 238 | "inherits": "^2.0.1", 239 | "ripemd160": "^2.0.0", 240 | "safe-buffer": "^5.0.1", 241 | "sha.js": "^2.4.8" 242 | } 243 | }, 244 | "node_modules/create-react-class": { 245 | "version": "15.7.0", 246 | "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", 247 | "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", 248 | "dependencies": { 249 | "loose-envify": "^1.3.1", 250 | "object-assign": "^4.1.1" 251 | } 252 | }, 253 | "node_modules/crypto-browserify": { 254 | "version": "3.12.0", 255 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 256 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 257 | "dependencies": { 258 | "browserify-cipher": "^1.0.0", 259 | "browserify-sign": "^4.0.0", 260 | "create-ecdh": "^4.0.0", 261 | "create-hash": "^1.1.0", 262 | "create-hmac": "^1.1.0", 263 | "diffie-hellman": "^5.0.0", 264 | "inherits": "^2.0.1", 265 | "pbkdf2": "^3.0.3", 266 | "public-encrypt": "^4.0.0", 267 | "randombytes": "^2.0.0", 268 | "randomfill": "^1.0.3" 269 | }, 270 | "engines": { 271 | "node": "*" 272 | } 273 | }, 274 | "node_modules/des.js": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 277 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 278 | "dependencies": { 279 | "inherits": "^2.0.1", 280 | "minimalistic-assert": "^1.0.0" 281 | } 282 | }, 283 | "node_modules/diffie-hellman": { 284 | "version": "5.0.3", 285 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 286 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 287 | "dependencies": { 288 | "bn.js": "^4.1.0", 289 | "miller-rabin": "^4.0.0", 290 | "randombytes": "^2.0.0" 291 | } 292 | }, 293 | "node_modules/diffie-hellman/node_modules/bn.js": { 294 | "version": "4.12.0", 295 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 296 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 297 | }, 298 | "node_modules/domain-browser": { 299 | "version": "1.2.0", 300 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 301 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 302 | "engines": { 303 | "node": ">=0.4", 304 | "npm": ">=1.2" 305 | } 306 | }, 307 | "node_modules/elliptic": { 308 | "version": "6.5.4", 309 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 310 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 311 | "dependencies": { 312 | "bn.js": "^4.11.9", 313 | "brorand": "^1.1.0", 314 | "hash.js": "^1.0.0", 315 | "hmac-drbg": "^1.0.1", 316 | "inherits": "^2.0.4", 317 | "minimalistic-assert": "^1.0.1", 318 | "minimalistic-crypto-utils": "^1.0.1" 319 | } 320 | }, 321 | "node_modules/elliptic/node_modules/bn.js": { 322 | "version": "4.12.0", 323 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 324 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 325 | }, 326 | "node_modules/events": { 327 | "version": "3.3.0", 328 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 329 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 330 | "engines": { 331 | "node": ">=0.8.x" 332 | } 333 | }, 334 | "node_modules/evp_bytestokey": { 335 | "version": "1.0.3", 336 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 337 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 338 | "dependencies": { 339 | "md5.js": "^1.3.4", 340 | "safe-buffer": "^5.1.1" 341 | } 342 | }, 343 | "node_modules/hash-base": { 344 | "version": "3.1.0", 345 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 346 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 347 | "dependencies": { 348 | "inherits": "^2.0.4", 349 | "readable-stream": "^3.6.0", 350 | "safe-buffer": "^5.2.0" 351 | }, 352 | "engines": { 353 | "node": ">=4" 354 | } 355 | }, 356 | "node_modules/hash-base/node_modules/readable-stream": { 357 | "version": "3.6.0", 358 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 359 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 360 | "dependencies": { 361 | "inherits": "^2.0.3", 362 | "string_decoder": "^1.1.1", 363 | "util-deprecate": "^1.0.1" 364 | }, 365 | "engines": { 366 | "node": ">= 6" 367 | } 368 | }, 369 | "node_modules/hash.js": { 370 | "version": "1.1.7", 371 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 372 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 373 | "dependencies": { 374 | "inherits": "^2.0.3", 375 | "minimalistic-assert": "^1.0.1" 376 | } 377 | }, 378 | "node_modules/hmac-drbg": { 379 | "version": "1.0.1", 380 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 381 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 382 | "dependencies": { 383 | "hash.js": "^1.0.3", 384 | "minimalistic-assert": "^1.0.0", 385 | "minimalistic-crypto-utils": "^1.0.1" 386 | } 387 | }, 388 | "node_modules/https-browserify": { 389 | "version": "1.0.0", 390 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 391 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 392 | }, 393 | "node_modules/ieee754": { 394 | "version": "1.2.1", 395 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 396 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 397 | "funding": [ 398 | { 399 | "type": "github", 400 | "url": "https://github.com/sponsors/feross" 401 | }, 402 | { 403 | "type": "patreon", 404 | "url": "https://www.patreon.com/feross" 405 | }, 406 | { 407 | "type": "consulting", 408 | "url": "https://feross.org/support" 409 | } 410 | ] 411 | }, 412 | "node_modules/inherits": { 413 | "version": "2.0.4", 414 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 415 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 416 | }, 417 | "node_modules/isarray": { 418 | "version": "1.0.0", 419 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 420 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 421 | }, 422 | "node_modules/isexe": { 423 | "version": "2.0.0", 424 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 425 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 426 | }, 427 | "node_modules/js-tokens": { 428 | "version": "4.0.0", 429 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 430 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 431 | }, 432 | "node_modules/loose-envify": { 433 | "version": "1.4.0", 434 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 435 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 436 | "dependencies": { 437 | "js-tokens": "^3.0.0 || ^4.0.0" 438 | }, 439 | "bin": { 440 | "loose-envify": "cli.js" 441 | } 442 | }, 443 | "node_modules/md5.js": { 444 | "version": "1.3.5", 445 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 446 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 447 | "dependencies": { 448 | "hash-base": "^3.0.0", 449 | "inherits": "^2.0.1", 450 | "safe-buffer": "^5.1.2" 451 | } 452 | }, 453 | "node_modules/miller-rabin": { 454 | "version": "4.0.1", 455 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 456 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 457 | "dependencies": { 458 | "bn.js": "^4.0.0", 459 | "brorand": "^1.0.1" 460 | }, 461 | "bin": { 462 | "miller-rabin": "bin/miller-rabin" 463 | } 464 | }, 465 | "node_modules/miller-rabin/node_modules/bn.js": { 466 | "version": "4.12.0", 467 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 468 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 469 | }, 470 | "node_modules/minimalistic-assert": { 471 | "version": "1.0.1", 472 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 473 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 474 | }, 475 | "node_modules/minimalistic-crypto-utils": { 476 | "version": "1.0.1", 477 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 478 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 479 | }, 480 | "node_modules/node-libs-browser": { 481 | "version": "2.2.1", 482 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 483 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 484 | "dependencies": { 485 | "assert": "^1.1.1", 486 | "browserify-zlib": "^0.2.0", 487 | "buffer": "^4.3.0", 488 | "console-browserify": "^1.1.0", 489 | "constants-browserify": "^1.0.0", 490 | "crypto-browserify": "^3.11.0", 491 | "domain-browser": "^1.1.1", 492 | "events": "^3.0.0", 493 | "https-browserify": "^1.0.0", 494 | "os-browserify": "^0.3.0", 495 | "path-browserify": "0.0.1", 496 | "process": "^0.11.10", 497 | "punycode": "^1.2.4", 498 | "querystring-es3": "^0.2.0", 499 | "readable-stream": "^2.3.3", 500 | "stream-browserify": "^2.0.1", 501 | "stream-http": "^2.7.2", 502 | "string_decoder": "^1.0.0", 503 | "timers-browserify": "^2.0.4", 504 | "tty-browserify": "0.0.0", 505 | "url": "^0.11.0", 506 | "util": "^0.11.0", 507 | "vm-browserify": "^1.0.1" 508 | } 509 | }, 510 | "node_modules/object-assign": { 511 | "version": "4.1.1", 512 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 513 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 514 | "engines": { 515 | "node": ">=0.10.0" 516 | } 517 | }, 518 | "node_modules/os-browserify": { 519 | "version": "0.3.0", 520 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 521 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 522 | }, 523 | "node_modules/pako": { 524 | "version": "1.0.11", 525 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 526 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 527 | }, 528 | "node_modules/parse-asn1": { 529 | "version": "5.1.6", 530 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 531 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 532 | "dependencies": { 533 | "asn1.js": "^5.2.0", 534 | "browserify-aes": "^1.0.0", 535 | "evp_bytestokey": "^1.0.0", 536 | "pbkdf2": "^3.0.3", 537 | "safe-buffer": "^5.1.1" 538 | } 539 | }, 540 | "node_modules/path-browserify": { 541 | "version": "0.0.1", 542 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 543 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" 544 | }, 545 | "node_modules/pbkdf2": { 546 | "version": "3.1.2", 547 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 548 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 549 | "dependencies": { 550 | "create-hash": "^1.1.2", 551 | "create-hmac": "^1.1.4", 552 | "ripemd160": "^2.0.1", 553 | "safe-buffer": "^5.0.1", 554 | "sha.js": "^2.4.8" 555 | }, 556 | "engines": { 557 | "node": ">=0.12" 558 | } 559 | }, 560 | "node_modules/process": { 561 | "version": "0.11.10", 562 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 563 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 564 | "engines": { 565 | "node": ">= 0.6.0" 566 | } 567 | }, 568 | "node_modules/process-nextick-args": { 569 | "version": "2.0.1", 570 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 571 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 572 | }, 573 | "node_modules/public-encrypt": { 574 | "version": "4.0.3", 575 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 576 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 577 | "dependencies": { 578 | "bn.js": "^4.1.0", 579 | "browserify-rsa": "^4.0.0", 580 | "create-hash": "^1.1.0", 581 | "parse-asn1": "^5.0.0", 582 | "randombytes": "^2.0.1", 583 | "safe-buffer": "^5.1.2" 584 | } 585 | }, 586 | "node_modules/public-encrypt/node_modules/bn.js": { 587 | "version": "4.12.0", 588 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 589 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 590 | }, 591 | "node_modules/punycode": { 592 | "version": "1.4.1", 593 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 594 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 595 | }, 596 | "node_modules/querystring": { 597 | "version": "0.2.0", 598 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 599 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 600 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 601 | "engines": { 602 | "node": ">=0.4.x" 603 | } 604 | }, 605 | "node_modules/querystring-es3": { 606 | "version": "0.2.1", 607 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 608 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 609 | "engines": { 610 | "node": ">=0.4.x" 611 | } 612 | }, 613 | "node_modules/randombytes": { 614 | "version": "2.1.0", 615 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 616 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 617 | "dependencies": { 618 | "safe-buffer": "^5.1.0" 619 | } 620 | }, 621 | "node_modules/randomfill": { 622 | "version": "1.0.4", 623 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 624 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 625 | "dependencies": { 626 | "randombytes": "^2.0.5", 627 | "safe-buffer": "^5.1.0" 628 | } 629 | }, 630 | "node_modules/react": { 631 | "version": "17.0.2", 632 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 633 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 634 | "dependencies": { 635 | "loose-envify": "^1.1.0", 636 | "object-assign": "^4.1.1" 637 | }, 638 | "engines": { 639 | "node": ">=0.10.0" 640 | } 641 | }, 642 | "node_modules/react-dom": { 643 | "version": "17.0.2", 644 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 645 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 646 | "dependencies": { 647 | "loose-envify": "^1.1.0", 648 | "object-assign": "^4.1.1", 649 | "scheduler": "^0.20.2" 650 | }, 651 | "peerDependencies": { 652 | "react": "17.0.2" 653 | } 654 | }, 655 | "node_modules/readable-stream": { 656 | "version": "2.3.7", 657 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 658 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 659 | "dependencies": { 660 | "core-util-is": "~1.0.0", 661 | "inherits": "~2.0.3", 662 | "isarray": "~1.0.0", 663 | "process-nextick-args": "~2.0.0", 664 | "safe-buffer": "~5.1.1", 665 | "string_decoder": "~1.1.1", 666 | "util-deprecate": "~1.0.1" 667 | } 668 | }, 669 | "node_modules/readable-stream/node_modules/safe-buffer": { 670 | "version": "5.1.2", 671 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 672 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 673 | }, 674 | "node_modules/readable-stream/node_modules/string_decoder": { 675 | "version": "1.1.1", 676 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 677 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 678 | "dependencies": { 679 | "safe-buffer": "~5.1.0" 680 | } 681 | }, 682 | "node_modules/readline-sync": { 683 | "version": "1.4.10", 684 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 685 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 686 | "engines": { 687 | "node": ">= 0.8.0" 688 | } 689 | }, 690 | "node_modules/ripemd160": { 691 | "version": "2.0.2", 692 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 693 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 694 | "dependencies": { 695 | "hash-base": "^3.0.0", 696 | "inherits": "^2.0.1" 697 | } 698 | }, 699 | "node_modules/safe-buffer": { 700 | "version": "5.2.1", 701 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 702 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 703 | "funding": [ 704 | { 705 | "type": "github", 706 | "url": "https://github.com/sponsors/feross" 707 | }, 708 | { 709 | "type": "patreon", 710 | "url": "https://www.patreon.com/feross" 711 | }, 712 | { 713 | "type": "consulting", 714 | "url": "https://feross.org/support" 715 | } 716 | ] 717 | }, 718 | "node_modules/safer-buffer": { 719 | "version": "2.1.2", 720 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 721 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 722 | }, 723 | "node_modules/scheduler": { 724 | "version": "0.20.2", 725 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 726 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 727 | "dependencies": { 728 | "loose-envify": "^1.1.0", 729 | "object-assign": "^4.1.1" 730 | } 731 | }, 732 | "node_modules/setimmediate": { 733 | "version": "1.0.5", 734 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 735 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 736 | }, 737 | "node_modules/sha.js": { 738 | "version": "2.4.11", 739 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 740 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 741 | "dependencies": { 742 | "inherits": "^2.0.1", 743 | "safe-buffer": "^5.0.1" 744 | }, 745 | "bin": { 746 | "sha.js": "bin.js" 747 | } 748 | }, 749 | "node_modules/shadow-cljs": { 750 | "version": "2.15.10", 751 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.15.10.tgz", 752 | "integrity": "sha512-r02f7pvZefiaATt3k7oAb8PNQKaA67iFoowS88Jaf8IClRQL3plBazkDAUWX5yQd9QfT4WhGr6kP0GTzTidQSg==", 753 | "dependencies": { 754 | "node-libs-browser": "^2.2.1", 755 | "readline-sync": "^1.4.7", 756 | "shadow-cljs-jar": "1.3.2", 757 | "source-map-support": "^0.4.15", 758 | "which": "^1.3.1", 759 | "ws": "^7.4.6" 760 | }, 761 | "bin": { 762 | "shadow-cljs": "cli/runner.js" 763 | }, 764 | "engines": { 765 | "node": ">=6.0.0" 766 | } 767 | }, 768 | "node_modules/shadow-cljs-jar": { 769 | "version": "1.3.2", 770 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz", 771 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==" 772 | }, 773 | "node_modules/source-map": { 774 | "version": "0.5.7", 775 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 776 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 777 | "engines": { 778 | "node": ">=0.10.0" 779 | } 780 | }, 781 | "node_modules/source-map-support": { 782 | "version": "0.4.18", 783 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 784 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 785 | "dependencies": { 786 | "source-map": "^0.5.6" 787 | } 788 | }, 789 | "node_modules/stream-browserify": { 790 | "version": "2.0.2", 791 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 792 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 793 | "dependencies": { 794 | "inherits": "~2.0.1", 795 | "readable-stream": "^2.0.2" 796 | } 797 | }, 798 | "node_modules/stream-http": { 799 | "version": "2.8.3", 800 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 801 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 802 | "dependencies": { 803 | "builtin-status-codes": "^3.0.0", 804 | "inherits": "^2.0.1", 805 | "readable-stream": "^2.3.6", 806 | "to-arraybuffer": "^1.0.0", 807 | "xtend": "^4.0.0" 808 | } 809 | }, 810 | "node_modules/string_decoder": { 811 | "version": "1.3.0", 812 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 813 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 814 | "dependencies": { 815 | "safe-buffer": "~5.2.0" 816 | } 817 | }, 818 | "node_modules/timers-browserify": { 819 | "version": "2.0.12", 820 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 821 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 822 | "dependencies": { 823 | "setimmediate": "^1.0.4" 824 | }, 825 | "engines": { 826 | "node": ">=0.6.0" 827 | } 828 | }, 829 | "node_modules/to-arraybuffer": { 830 | "version": "1.0.1", 831 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 832 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" 833 | }, 834 | "node_modules/tty-browserify": { 835 | "version": "0.0.0", 836 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 837 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" 838 | }, 839 | "node_modules/url": { 840 | "version": "0.11.0", 841 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 842 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 843 | "dependencies": { 844 | "punycode": "1.3.2", 845 | "querystring": "0.2.0" 846 | } 847 | }, 848 | "node_modules/url/node_modules/punycode": { 849 | "version": "1.3.2", 850 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 851 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 852 | }, 853 | "node_modules/util": { 854 | "version": "0.11.1", 855 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 856 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 857 | "dependencies": { 858 | "inherits": "2.0.3" 859 | } 860 | }, 861 | "node_modules/util-deprecate": { 862 | "version": "1.0.2", 863 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 864 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 865 | }, 866 | "node_modules/util/node_modules/inherits": { 867 | "version": "2.0.3", 868 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 869 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 870 | }, 871 | "node_modules/vm-browserify": { 872 | "version": "1.1.2", 873 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 874 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" 875 | }, 876 | "node_modules/which": { 877 | "version": "1.3.1", 878 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 879 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 880 | "dependencies": { 881 | "isexe": "^2.0.0" 882 | }, 883 | "bin": { 884 | "which": "bin/which" 885 | } 886 | }, 887 | "node_modules/ws": { 888 | "version": "7.5.5", 889 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", 890 | "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", 891 | "engines": { 892 | "node": ">=8.3.0" 893 | }, 894 | "peerDependencies": { 895 | "bufferutil": "^4.0.1", 896 | "utf-8-validate": "^5.0.2" 897 | }, 898 | "peerDependenciesMeta": { 899 | "bufferutil": { 900 | "optional": true 901 | }, 902 | "utf-8-validate": { 903 | "optional": true 904 | } 905 | } 906 | }, 907 | "node_modules/xtend": { 908 | "version": "4.0.2", 909 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 910 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 911 | "engines": { 912 | "node": ">=0.4" 913 | } 914 | } 915 | }, 916 | "dependencies": { 917 | "asn1.js": { 918 | "version": "5.4.1", 919 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 920 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 921 | "requires": { 922 | "bn.js": "^4.0.0", 923 | "inherits": "^2.0.1", 924 | "minimalistic-assert": "^1.0.0", 925 | "safer-buffer": "^2.1.0" 926 | }, 927 | "dependencies": { 928 | "bn.js": { 929 | "version": "4.12.0", 930 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 931 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 932 | } 933 | } 934 | }, 935 | "assert": { 936 | "version": "1.5.0", 937 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 938 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 939 | "requires": { 940 | "object-assign": "^4.1.1", 941 | "util": "0.10.3" 942 | }, 943 | "dependencies": { 944 | "inherits": { 945 | "version": "2.0.1", 946 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 947 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" 948 | }, 949 | "util": { 950 | "version": "0.10.3", 951 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 952 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 953 | "requires": { 954 | "inherits": "2.0.1" 955 | } 956 | } 957 | } 958 | }, 959 | "base64-js": { 960 | "version": "1.5.1", 961 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 962 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 963 | }, 964 | "bn.js": { 965 | "version": "5.2.0", 966 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 967 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" 968 | }, 969 | "brorand": { 970 | "version": "1.1.0", 971 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 972 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 973 | }, 974 | "browserify-aes": { 975 | "version": "1.2.0", 976 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 977 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 978 | "requires": { 979 | "buffer-xor": "^1.0.3", 980 | "cipher-base": "^1.0.0", 981 | "create-hash": "^1.1.0", 982 | "evp_bytestokey": "^1.0.3", 983 | "inherits": "^2.0.1", 984 | "safe-buffer": "^5.0.1" 985 | } 986 | }, 987 | "browserify-cipher": { 988 | "version": "1.0.1", 989 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 990 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 991 | "requires": { 992 | "browserify-aes": "^1.0.4", 993 | "browserify-des": "^1.0.0", 994 | "evp_bytestokey": "^1.0.0" 995 | } 996 | }, 997 | "browserify-des": { 998 | "version": "1.0.2", 999 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 1000 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 1001 | "requires": { 1002 | "cipher-base": "^1.0.1", 1003 | "des.js": "^1.0.0", 1004 | "inherits": "^2.0.1", 1005 | "safe-buffer": "^5.1.2" 1006 | } 1007 | }, 1008 | "browserify-rsa": { 1009 | "version": "4.1.0", 1010 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 1011 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 1012 | "requires": { 1013 | "bn.js": "^5.0.0", 1014 | "randombytes": "^2.0.1" 1015 | } 1016 | }, 1017 | "browserify-sign": { 1018 | "version": "4.2.1", 1019 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 1020 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 1021 | "requires": { 1022 | "bn.js": "^5.1.1", 1023 | "browserify-rsa": "^4.0.1", 1024 | "create-hash": "^1.2.0", 1025 | "create-hmac": "^1.1.7", 1026 | "elliptic": "^6.5.3", 1027 | "inherits": "^2.0.4", 1028 | "parse-asn1": "^5.1.5", 1029 | "readable-stream": "^3.6.0", 1030 | "safe-buffer": "^5.2.0" 1031 | }, 1032 | "dependencies": { 1033 | "readable-stream": { 1034 | "version": "3.6.0", 1035 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1036 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1037 | "requires": { 1038 | "inherits": "^2.0.3", 1039 | "string_decoder": "^1.1.1", 1040 | "util-deprecate": "^1.0.1" 1041 | } 1042 | } 1043 | } 1044 | }, 1045 | "browserify-zlib": { 1046 | "version": "0.2.0", 1047 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 1048 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 1049 | "requires": { 1050 | "pako": "~1.0.5" 1051 | } 1052 | }, 1053 | "buffer": { 1054 | "version": "4.9.2", 1055 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1056 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1057 | "requires": { 1058 | "base64-js": "^1.0.2", 1059 | "ieee754": "^1.1.4", 1060 | "isarray": "^1.0.0" 1061 | } 1062 | }, 1063 | "buffer-xor": { 1064 | "version": "1.0.3", 1065 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 1066 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 1067 | }, 1068 | "builtin-status-codes": { 1069 | "version": "3.0.0", 1070 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 1071 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 1072 | }, 1073 | "cipher-base": { 1074 | "version": "1.0.4", 1075 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 1076 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 1077 | "requires": { 1078 | "inherits": "^2.0.1", 1079 | "safe-buffer": "^5.0.1" 1080 | } 1081 | }, 1082 | "console-browserify": { 1083 | "version": "1.2.0", 1084 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 1085 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" 1086 | }, 1087 | "constants-browserify": { 1088 | "version": "1.0.0", 1089 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 1090 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 1091 | }, 1092 | "core-util-is": { 1093 | "version": "1.0.3", 1094 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1095 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1096 | }, 1097 | "create-ecdh": { 1098 | "version": "4.0.4", 1099 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 1100 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 1101 | "requires": { 1102 | "bn.js": "^4.1.0", 1103 | "elliptic": "^6.5.3" 1104 | }, 1105 | "dependencies": { 1106 | "bn.js": { 1107 | "version": "4.12.0", 1108 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1109 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1110 | } 1111 | } 1112 | }, 1113 | "create-hash": { 1114 | "version": "1.2.0", 1115 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 1116 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 1117 | "requires": { 1118 | "cipher-base": "^1.0.1", 1119 | "inherits": "^2.0.1", 1120 | "md5.js": "^1.3.4", 1121 | "ripemd160": "^2.0.1", 1122 | "sha.js": "^2.4.0" 1123 | } 1124 | }, 1125 | "create-hmac": { 1126 | "version": "1.1.7", 1127 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 1128 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 1129 | "requires": { 1130 | "cipher-base": "^1.0.3", 1131 | "create-hash": "^1.1.0", 1132 | "inherits": "^2.0.1", 1133 | "ripemd160": "^2.0.0", 1134 | "safe-buffer": "^5.0.1", 1135 | "sha.js": "^2.4.8" 1136 | } 1137 | }, 1138 | "create-react-class": { 1139 | "version": "15.7.0", 1140 | "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", 1141 | "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", 1142 | "requires": { 1143 | "loose-envify": "^1.3.1", 1144 | "object-assign": "^4.1.1" 1145 | } 1146 | }, 1147 | "crypto-browserify": { 1148 | "version": "3.12.0", 1149 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 1150 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 1151 | "requires": { 1152 | "browserify-cipher": "^1.0.0", 1153 | "browserify-sign": "^4.0.0", 1154 | "create-ecdh": "^4.0.0", 1155 | "create-hash": "^1.1.0", 1156 | "create-hmac": "^1.1.0", 1157 | "diffie-hellman": "^5.0.0", 1158 | "inherits": "^2.0.1", 1159 | "pbkdf2": "^3.0.3", 1160 | "public-encrypt": "^4.0.0", 1161 | "randombytes": "^2.0.0", 1162 | "randomfill": "^1.0.3" 1163 | } 1164 | }, 1165 | "des.js": { 1166 | "version": "1.0.1", 1167 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 1168 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 1169 | "requires": { 1170 | "inherits": "^2.0.1", 1171 | "minimalistic-assert": "^1.0.0" 1172 | } 1173 | }, 1174 | "diffie-hellman": { 1175 | "version": "5.0.3", 1176 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 1177 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 1178 | "requires": { 1179 | "bn.js": "^4.1.0", 1180 | "miller-rabin": "^4.0.0", 1181 | "randombytes": "^2.0.0" 1182 | }, 1183 | "dependencies": { 1184 | "bn.js": { 1185 | "version": "4.12.0", 1186 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1187 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1188 | } 1189 | } 1190 | }, 1191 | "domain-browser": { 1192 | "version": "1.2.0", 1193 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 1194 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" 1195 | }, 1196 | "elliptic": { 1197 | "version": "6.5.4", 1198 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 1199 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 1200 | "requires": { 1201 | "bn.js": "^4.11.9", 1202 | "brorand": "^1.1.0", 1203 | "hash.js": "^1.0.0", 1204 | "hmac-drbg": "^1.0.1", 1205 | "inherits": "^2.0.4", 1206 | "minimalistic-assert": "^1.0.1", 1207 | "minimalistic-crypto-utils": "^1.0.1" 1208 | }, 1209 | "dependencies": { 1210 | "bn.js": { 1211 | "version": "4.12.0", 1212 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1213 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1214 | } 1215 | } 1216 | }, 1217 | "events": { 1218 | "version": "3.3.0", 1219 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1220 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 1221 | }, 1222 | "evp_bytestokey": { 1223 | "version": "1.0.3", 1224 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 1225 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 1226 | "requires": { 1227 | "md5.js": "^1.3.4", 1228 | "safe-buffer": "^5.1.1" 1229 | } 1230 | }, 1231 | "hash-base": { 1232 | "version": "3.1.0", 1233 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 1234 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 1235 | "requires": { 1236 | "inherits": "^2.0.4", 1237 | "readable-stream": "^3.6.0", 1238 | "safe-buffer": "^5.2.0" 1239 | }, 1240 | "dependencies": { 1241 | "readable-stream": { 1242 | "version": "3.6.0", 1243 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1244 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1245 | "requires": { 1246 | "inherits": "^2.0.3", 1247 | "string_decoder": "^1.1.1", 1248 | "util-deprecate": "^1.0.1" 1249 | } 1250 | } 1251 | } 1252 | }, 1253 | "hash.js": { 1254 | "version": "1.1.7", 1255 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1256 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1257 | "requires": { 1258 | "inherits": "^2.0.3", 1259 | "minimalistic-assert": "^1.0.1" 1260 | } 1261 | }, 1262 | "hmac-drbg": { 1263 | "version": "1.0.1", 1264 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1265 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1266 | "requires": { 1267 | "hash.js": "^1.0.3", 1268 | "minimalistic-assert": "^1.0.0", 1269 | "minimalistic-crypto-utils": "^1.0.1" 1270 | } 1271 | }, 1272 | "https-browserify": { 1273 | "version": "1.0.0", 1274 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 1275 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 1276 | }, 1277 | "ieee754": { 1278 | "version": "1.2.1", 1279 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1280 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1281 | }, 1282 | "inherits": { 1283 | "version": "2.0.4", 1284 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1285 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1286 | }, 1287 | "isarray": { 1288 | "version": "1.0.0", 1289 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1290 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1291 | }, 1292 | "isexe": { 1293 | "version": "2.0.0", 1294 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1295 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1296 | }, 1297 | "js-tokens": { 1298 | "version": "4.0.0", 1299 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1300 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1301 | }, 1302 | "loose-envify": { 1303 | "version": "1.4.0", 1304 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1305 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1306 | "requires": { 1307 | "js-tokens": "^3.0.0 || ^4.0.0" 1308 | } 1309 | }, 1310 | "md5.js": { 1311 | "version": "1.3.5", 1312 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1313 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1314 | "requires": { 1315 | "hash-base": "^3.0.0", 1316 | "inherits": "^2.0.1", 1317 | "safe-buffer": "^5.1.2" 1318 | } 1319 | }, 1320 | "miller-rabin": { 1321 | "version": "4.0.1", 1322 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1323 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1324 | "requires": { 1325 | "bn.js": "^4.0.0", 1326 | "brorand": "^1.0.1" 1327 | }, 1328 | "dependencies": { 1329 | "bn.js": { 1330 | "version": "4.12.0", 1331 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1332 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1333 | } 1334 | } 1335 | }, 1336 | "minimalistic-assert": { 1337 | "version": "1.0.1", 1338 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1339 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1340 | }, 1341 | "minimalistic-crypto-utils": { 1342 | "version": "1.0.1", 1343 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1344 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1345 | }, 1346 | "node-libs-browser": { 1347 | "version": "2.2.1", 1348 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 1349 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 1350 | "requires": { 1351 | "assert": "^1.1.1", 1352 | "browserify-zlib": "^0.2.0", 1353 | "buffer": "^4.3.0", 1354 | "console-browserify": "^1.1.0", 1355 | "constants-browserify": "^1.0.0", 1356 | "crypto-browserify": "^3.11.0", 1357 | "domain-browser": "^1.1.1", 1358 | "events": "^3.0.0", 1359 | "https-browserify": "^1.0.0", 1360 | "os-browserify": "^0.3.0", 1361 | "path-browserify": "0.0.1", 1362 | "process": "^0.11.10", 1363 | "punycode": "^1.2.4", 1364 | "querystring-es3": "^0.2.0", 1365 | "readable-stream": "^2.3.3", 1366 | "stream-browserify": "^2.0.1", 1367 | "stream-http": "^2.7.2", 1368 | "string_decoder": "^1.0.0", 1369 | "timers-browserify": "^2.0.4", 1370 | "tty-browserify": "0.0.0", 1371 | "url": "^0.11.0", 1372 | "util": "^0.11.0", 1373 | "vm-browserify": "^1.0.1" 1374 | } 1375 | }, 1376 | "object-assign": { 1377 | "version": "4.1.1", 1378 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1379 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1380 | }, 1381 | "os-browserify": { 1382 | "version": "0.3.0", 1383 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1384 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 1385 | }, 1386 | "pako": { 1387 | "version": "1.0.11", 1388 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1389 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1390 | }, 1391 | "parse-asn1": { 1392 | "version": "5.1.6", 1393 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 1394 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 1395 | "requires": { 1396 | "asn1.js": "^5.2.0", 1397 | "browserify-aes": "^1.0.0", 1398 | "evp_bytestokey": "^1.0.0", 1399 | "pbkdf2": "^3.0.3", 1400 | "safe-buffer": "^5.1.1" 1401 | } 1402 | }, 1403 | "path-browserify": { 1404 | "version": "0.0.1", 1405 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1406 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" 1407 | }, 1408 | "pbkdf2": { 1409 | "version": "3.1.2", 1410 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 1411 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 1412 | "requires": { 1413 | "create-hash": "^1.1.2", 1414 | "create-hmac": "^1.1.4", 1415 | "ripemd160": "^2.0.1", 1416 | "safe-buffer": "^5.0.1", 1417 | "sha.js": "^2.4.8" 1418 | } 1419 | }, 1420 | "process": { 1421 | "version": "0.11.10", 1422 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1423 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 1424 | }, 1425 | "process-nextick-args": { 1426 | "version": "2.0.1", 1427 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1428 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1429 | }, 1430 | "public-encrypt": { 1431 | "version": "4.0.3", 1432 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1433 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1434 | "requires": { 1435 | "bn.js": "^4.1.0", 1436 | "browserify-rsa": "^4.0.0", 1437 | "create-hash": "^1.1.0", 1438 | "parse-asn1": "^5.0.0", 1439 | "randombytes": "^2.0.1", 1440 | "safe-buffer": "^5.1.2" 1441 | }, 1442 | "dependencies": { 1443 | "bn.js": { 1444 | "version": "4.12.0", 1445 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1446 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1447 | } 1448 | } 1449 | }, 1450 | "punycode": { 1451 | "version": "1.4.1", 1452 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1453 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1454 | }, 1455 | "querystring": { 1456 | "version": "0.2.0", 1457 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1458 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 1459 | }, 1460 | "querystring-es3": { 1461 | "version": "0.2.1", 1462 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1463 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" 1464 | }, 1465 | "randombytes": { 1466 | "version": "2.1.0", 1467 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1468 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1469 | "requires": { 1470 | "safe-buffer": "^5.1.0" 1471 | } 1472 | }, 1473 | "randomfill": { 1474 | "version": "1.0.4", 1475 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1476 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1477 | "requires": { 1478 | "randombytes": "^2.0.5", 1479 | "safe-buffer": "^5.1.0" 1480 | } 1481 | }, 1482 | "react": { 1483 | "version": "17.0.2", 1484 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 1485 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 1486 | "requires": { 1487 | "loose-envify": "^1.1.0", 1488 | "object-assign": "^4.1.1" 1489 | } 1490 | }, 1491 | "react-dom": { 1492 | "version": "17.0.2", 1493 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 1494 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 1495 | "requires": { 1496 | "loose-envify": "^1.1.0", 1497 | "object-assign": "^4.1.1", 1498 | "scheduler": "^0.20.2" 1499 | } 1500 | }, 1501 | "readable-stream": { 1502 | "version": "2.3.7", 1503 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1504 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1505 | "requires": { 1506 | "core-util-is": "~1.0.0", 1507 | "inherits": "~2.0.3", 1508 | "isarray": "~1.0.0", 1509 | "process-nextick-args": "~2.0.0", 1510 | "safe-buffer": "~5.1.1", 1511 | "string_decoder": "~1.1.1", 1512 | "util-deprecate": "~1.0.1" 1513 | }, 1514 | "dependencies": { 1515 | "safe-buffer": { 1516 | "version": "5.1.2", 1517 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1518 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1519 | }, 1520 | "string_decoder": { 1521 | "version": "1.1.1", 1522 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1523 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1524 | "requires": { 1525 | "safe-buffer": "~5.1.0" 1526 | } 1527 | } 1528 | } 1529 | }, 1530 | "readline-sync": { 1531 | "version": "1.4.10", 1532 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 1533 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==" 1534 | }, 1535 | "ripemd160": { 1536 | "version": "2.0.2", 1537 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1538 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1539 | "requires": { 1540 | "hash-base": "^3.0.0", 1541 | "inherits": "^2.0.1" 1542 | } 1543 | }, 1544 | "safe-buffer": { 1545 | "version": "5.2.1", 1546 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1547 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1548 | }, 1549 | "safer-buffer": { 1550 | "version": "2.1.2", 1551 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1552 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1553 | }, 1554 | "scheduler": { 1555 | "version": "0.20.2", 1556 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 1557 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 1558 | "requires": { 1559 | "loose-envify": "^1.1.0", 1560 | "object-assign": "^4.1.1" 1561 | } 1562 | }, 1563 | "setimmediate": { 1564 | "version": "1.0.5", 1565 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1566 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1567 | }, 1568 | "sha.js": { 1569 | "version": "2.4.11", 1570 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1571 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1572 | "requires": { 1573 | "inherits": "^2.0.1", 1574 | "safe-buffer": "^5.0.1" 1575 | } 1576 | }, 1577 | "shadow-cljs": { 1578 | "version": "2.15.10", 1579 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.15.10.tgz", 1580 | "integrity": "sha512-r02f7pvZefiaATt3k7oAb8PNQKaA67iFoowS88Jaf8IClRQL3plBazkDAUWX5yQd9QfT4WhGr6kP0GTzTidQSg==", 1581 | "requires": { 1582 | "node-libs-browser": "^2.2.1", 1583 | "readline-sync": "^1.4.7", 1584 | "shadow-cljs-jar": "1.3.2", 1585 | "source-map-support": "^0.4.15", 1586 | "which": "^1.3.1", 1587 | "ws": "^7.4.6" 1588 | } 1589 | }, 1590 | "shadow-cljs-jar": { 1591 | "version": "1.3.2", 1592 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz", 1593 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==" 1594 | }, 1595 | "source-map": { 1596 | "version": "0.5.7", 1597 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1598 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1599 | }, 1600 | "source-map-support": { 1601 | "version": "0.4.18", 1602 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1603 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1604 | "requires": { 1605 | "source-map": "^0.5.6" 1606 | } 1607 | }, 1608 | "stream-browserify": { 1609 | "version": "2.0.2", 1610 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1611 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1612 | "requires": { 1613 | "inherits": "~2.0.1", 1614 | "readable-stream": "^2.0.2" 1615 | } 1616 | }, 1617 | "stream-http": { 1618 | "version": "2.8.3", 1619 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1620 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1621 | "requires": { 1622 | "builtin-status-codes": "^3.0.0", 1623 | "inherits": "^2.0.1", 1624 | "readable-stream": "^2.3.6", 1625 | "to-arraybuffer": "^1.0.0", 1626 | "xtend": "^4.0.0" 1627 | } 1628 | }, 1629 | "string_decoder": { 1630 | "version": "1.3.0", 1631 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1632 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1633 | "requires": { 1634 | "safe-buffer": "~5.2.0" 1635 | } 1636 | }, 1637 | "timers-browserify": { 1638 | "version": "2.0.12", 1639 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 1640 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 1641 | "requires": { 1642 | "setimmediate": "^1.0.4" 1643 | } 1644 | }, 1645 | "to-arraybuffer": { 1646 | "version": "1.0.1", 1647 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1648 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" 1649 | }, 1650 | "tty-browserify": { 1651 | "version": "0.0.0", 1652 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 1653 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" 1654 | }, 1655 | "url": { 1656 | "version": "0.11.0", 1657 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1658 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1659 | "requires": { 1660 | "punycode": "1.3.2", 1661 | "querystring": "0.2.0" 1662 | }, 1663 | "dependencies": { 1664 | "punycode": { 1665 | "version": "1.3.2", 1666 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1667 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1668 | } 1669 | } 1670 | }, 1671 | "util": { 1672 | "version": "0.11.1", 1673 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 1674 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 1675 | "requires": { 1676 | "inherits": "2.0.3" 1677 | }, 1678 | "dependencies": { 1679 | "inherits": { 1680 | "version": "2.0.3", 1681 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1682 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1683 | } 1684 | } 1685 | }, 1686 | "util-deprecate": { 1687 | "version": "1.0.2", 1688 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1689 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1690 | }, 1691 | "vm-browserify": { 1692 | "version": "1.1.2", 1693 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 1694 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" 1695 | }, 1696 | "which": { 1697 | "version": "1.3.1", 1698 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1699 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1700 | "requires": { 1701 | "isexe": "^2.0.0" 1702 | } 1703 | }, 1704 | "ws": { 1705 | "version": "7.5.5", 1706 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", 1707 | "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", 1708 | "requires": {} 1709 | }, 1710 | "xtend": { 1711 | "version": "4.0.2", 1712 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1713 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1714 | } 1715 | } 1716 | } 1717 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "create-react-class": "^15.7.0", 4 | "react": "^17.0.2", 5 | "react-dom": "^17.0.2", 6 | "shadow-cljs": "^2.15.10" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | scm:git:git://github.com/oconn/re-frame-routing.git 5 | scm:git:ssh://git@github.com/oconn/re-frame-routing.git 6 | https://github.com/oconn/re-frame-routing 7 | HEAD 8 | 9 | 4.0.0 10 | oconn 11 | re-frame-routing 12 | 0.1.4 13 | re-frame-routing 14 | 15 | 16 | org.clojure 17 | clojure 18 | 1.10.2 19 | 20 | 21 | com.cemerick 22 | url 23 | 0.1.1 24 | 25 | 26 | metosin 27 | spec-tools 28 | 0.10.5 29 | 30 | 31 | kibu 32 | pushy 33 | 0.3.8 34 | 35 | 36 | re-frame 37 | re-frame 38 | 0.10.6 39 | 40 | 41 | bidi 42 | bidi 43 | 2.1.6 44 | 45 | 46 | 47 | src 48 | 49 | 50 | 51 | clojars 52 | https://repo.clojars.org/ 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | acme frontend 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:deps true 2 | :dev-http {8000 "public"} 3 | :builds {:app {:target :browser 4 | :output-dir "public/js" 5 | :asset-path "js" 6 | :modules {:main {:entries [re-frame-routing.core]}}}}} 7 | -------------------------------------------------------------------------------- /src/re_frame_routing/coercion.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.coercion 2 | (:require 3 | [spec-tools.core :as st] 4 | [cljs.spec.alpha :as s] 5 | [re-frame.core :as re-frame] 6 | [clojure.walk :refer [postwalk keywordize-keys]])) 7 | 8 | (def handler->info (atom {})) 9 | 10 | (defn params+corecion-info->coerced-params 11 | "Applies coercion information to raw parameters with some sensible default logic in case of failure." 12 | [raw-params corecion-info] 13 | (reduce-kv 14 | (fn [coerced-params coercion-param-key {:keys [coercion default] :or {coercion string?}}] 15 | (let [qp-value (coercion-param-key coerced-params ) 16 | coerced-value (st/coerce coercion qp-value st/string-transformer) 17 | new-params (if (some? default) 18 | (assoc coerced-params coercion-param-key default) 19 | coerced-params)] 20 | (cond 21 | (nil? qp-value) new-params 22 | 23 | (not (s/valid? coercion coerced-value)) 24 | (do 25 | (re-frame/dispatch [:router/coercion-error (s/explain-data coercion coerced-value)]) 26 | new-params) 27 | 28 | :else 29 | (assoc coerced-params coercion-param-key coerced-value)))) 30 | raw-params 31 | corecion-info)) 32 | 33 | (defn coerce 34 | [db {:keys [handler route-params route-query]} routes] 35 | ;;NOTE This does a one time walk to gather the necessary information for coercion and cache it for fast lookup. An alternative 36 | ;; approach would be to pass this lookup instead of the enriched routes, but that seems less future proof (e.g adding more enriched features) 37 | (when-not (seq @handler->info) 38 | (postwalk (fn [node] 39 | (if (and (map? node) (:name node)) 40 | (swap! handler->info assoc (:name node) node) 41 | node 42 | )) routes)) 43 | (let [path (params+corecion-info->coerced-params (keywordize-keys route-params) (-> @handler->info handler :parameters :path)) 44 | query (params+corecion-info->coerced-params (keywordize-keys route-query) (-> @handler->info handler :parameters :query))] 45 | (cond-> db 46 | handler (assoc-in [:router :route-parameters :key] handler) 47 | path (assoc-in [:router :route-parameters :path] path) 48 | query (assoc-in [:router :route-parameters :query] query)))) 49 | -------------------------------------------------------------------------------- /src/re_frame_routing/core.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.core 2 | (:require [cljs.spec.alpha :as s] 3 | [re-frame.core :as re-frame] 4 | [re-frame-routing.events :as evts] 5 | [re-frame-routing.subscriptions :as subs])) 6 | 7 | (def initial-state 8 | {:route nil 9 | :route-params nil 10 | :route-query nil 11 | :initialized false}) 12 | 13 | (s/def ::href string?) 14 | (s/def ::display string?) 15 | (s/def ::key keyword?) 16 | (s/def ::initialized boolean?) 17 | (s/def ::route (s/nilable keyword?)) 18 | (s/def ::route-params (s/nilable map?)) 19 | (s/def ::route-query (s/nilable map?)) 20 | (s/def ::route-parameters (s/nilable map?)) 21 | (s/def ::router (s/keys :req-un [::route 22 | ::route-params 23 | ::route-query 24 | ::initialized] 25 | :opt-un [::route-parameters])) 26 | (defn register-events 27 | "Registers re-frame-routing events" 28 | [opts] 29 | (evts/register-events opts)) 30 | 31 | (defn register-subscriptions 32 | "Registers re-frame-routing subscriptions" 33 | [] 34 | (subs/register-subscriptions)) 35 | 36 | (defn register-all 37 | "Registers both re-frame-routing events & subscriptions" 38 | [{:keys [event-options]}] 39 | (register-events event-options) 40 | (register-subscriptions)) 41 | 42 | (defn create-route-middleware 43 | "Route middleware is an itterator that reduces over a sequence of 44 | middleware functions to ensure all required route logic has been 45 | met before mounting the containing view. 46 | 47 | Use cases: Protecting routes 48 | Redirecting routes 49 | Bootstraping data" 50 | [{:keys [loading-view]}] 51 | (fn [container middleware] 52 | (let [route-params (re-frame/subscribe [:router/route-params]) 53 | route-query (re-frame/subscribe [:router/route-query]) 54 | route-key (re-frame/subscribe [:router/route]) 55 | route-parameters (re-frame/subscribe [:router/route-parameters]) 56 | ;; Middleware state can be used for anything, and is the recommended 57 | ;; method for sharing infromation between middleware functions 58 | ;; or track information on global state updates that will trigger 59 | ;; re-renders of the middleware chain. 60 | ;; 61 | ;; Realworld application of using middleware-state: 62 | ;; View relies on data from a server before rendering. Add request 63 | ;; information to middleware state to cause the view to display 64 | ;; a loading indicator before displaying the view. (Works well with 65 | ;; re-frame-request, TODO: example) 66 | middleware-state (atom {})] 67 | (fn [] 68 | (let [{:keys [is-loading container] :as ctx} 69 | (reduce 70 | (fn [{:keys [is-loading] :as middleware-ctx} 71 | middleware-fn] 72 | (if is-loading 73 | middleware-ctx 74 | (middleware-fn middleware-ctx))) 75 | {:is-loading false 76 | :middleware-state @middleware-state 77 | :route-params @route-params 78 | :route-query @route-query 79 | :route-parameters @route-parameters 80 | :container container} 81 | middleware)] 82 | 83 | (reset! middleware-state (:middleware-state ctx)) 84 | 85 | (if (true? is-loading) 86 | [loading-view] 87 | [container @route-params @route-query @route-key])))))) 88 | -------------------------------------------------------------------------------- /src/re_frame_routing/events.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.events 2 | (:require [bidi.bidi :as bidi] 3 | [cemerick.url :refer [url]] 4 | [pushy.core :as pushy] 5 | [re-frame.core :as re-frame] 6 | [re-frame-routing.coercion :as coercion])) 7 | 8 | (defn listen-for-navigation! 9 | "Wraps the history object and begins listening for history events" 10 | [history] 11 | (re-frame/reg-fx 12 | :nav-to 13 | (fn [route] 14 | (pushy/set-token! history route)))) 15 | 16 | (defn get-route-query 17 | [] 18 | (-> js/window 19 | .-location 20 | .-href 21 | url 22 | :query)) 23 | 24 | (defn set-route 25 | [db [_ {:keys [handler route-params] :as params} {:keys [routes-enriched]}]] 26 | (cond-> db 27 | true (assoc-in [:router :route] handler) 28 | true (assoc-in [:router :route-params] route-params) 29 | true (assoc-in [:router :route-query] (get-route-query)) 30 | routes-enriched (coercion/coerce params routes-enriched))) 31 | 32 | (defn nav-to 33 | [{:keys [db]} [_ route]] 34 | {:db db 35 | :nav-to route}) 36 | 37 | (defn initialized 38 | [db _] 39 | (assoc-in db [:router :initialized] true)) 40 | 41 | (defn- pushy-init 42 | [{:keys [routes] :as args}] 43 | (fn [_] 44 | (let [history (pushy/pushy #(re-frame/dispatch [:router/set-route (assoc % :route-query (get-route-query)) args]) 45 | #(bidi/match-route routes %))] 46 | 47 | (listen-for-navigation! history) 48 | 49 | (pushy/start! history) 50 | 51 | (re-frame/dispatch [:router/initialized])))) 52 | 53 | (defn log 54 | [report-error-fn _ [_ error]] 55 | ((or report-error-fn js/console.error) error)) 56 | 57 | ;; Public functions 58 | 59 | (defn register-events 60 | [{:keys [set-route-interceptors 61 | nav-to-interceptors 62 | initialized-interceptors 63 | router-interceptors 64 | routes-error-report-fn] 65 | :or {set-route-interceptors [] 66 | nav-to-interceptors [] 67 | initialized-interceptors [] 68 | router-interceptors []} :as args}] 69 | 70 | (re-frame/reg-event-db 71 | :router/set-route 72 | (into router-interceptors set-route-interceptors) 73 | set-route) 74 | 75 | (re-frame/reg-event-fx 76 | :router/nav-to 77 | (into router-interceptors nav-to-interceptors) 78 | nav-to) 79 | 80 | (re-frame/reg-event-db 81 | :router/initialized 82 | (into router-interceptors initialized-interceptors) 83 | initialized) 84 | 85 | (re-frame/reg-fx 86 | :pushy-init 87 | (pushy-init (select-keys args [:routes :routes-enriched]))) 88 | 89 | (re-frame/reg-event-fx 90 | :router/coercion-error 91 | (into router-interceptors initialized-interceptors) 92 | (partial log routes-error-report-fn))) 93 | 94 | -------------------------------------------------------------------------------- /src/re_frame_routing/subscriptions.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.subscriptions 2 | (:require [re-frame.core :as re-frame])) 3 | 4 | (defn register-subscriptions 5 | "Register re-frame-routing subscriptions" 6 | [] 7 | 8 | (re-frame/reg-sub 9 | :router/core 10 | (fn [{:keys [router]} _] router)) 11 | 12 | (re-frame/reg-sub 13 | :router/route 14 | #(re-frame/subscribe [:router/core]) 15 | (fn [{:keys [route]} _] route)) 16 | 17 | (re-frame/reg-sub 18 | :router/route-params 19 | #(re-frame/subscribe [:router/core]) 20 | (fn [{:keys [route-params]} _] route-params)) 21 | 22 | (re-frame/reg-sub 23 | :router/route-query 24 | #(re-frame/subscribe [:router/core]) 25 | (fn [{:keys [route-query]} _] route-query)) 26 | 27 | (re-frame/reg-sub 28 | :router/route-parameters 29 | #(re-frame/subscribe [:router/core]) 30 | (fn [{:keys [route-parameters]} _] 31 | route-parameters))) 32 | -------------------------------------------------------------------------------- /test/re_frame_routing/coercion_test.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.coercion-test 2 | (:require [cljs.test :refer-macros [deftest testing are]] 3 | [re-frame-routing.coercion :as c] 4 | [clojure.spec.alpha :as s])) 5 | 6 | (deftest coercion-behavior 7 | (testing "and documenting the behavior of the coercion enhancement" 8 | (are [raw-params coercion-info coerced-params] (= (c/params+corecion-info->coerced-params raw-params coercion-info) coerced-params) 9 | nil nil nil 10 | {} {} {} 11 | {:a "1"} {} {:a "1"} 12 | {} {:a {:coercion int?}} {} 13 | {:a "1"} {:a {:coercion int?}} {:a 1} 14 | {:a "1" :b "2"} {:a {:coercion int?} :b {:coercion int?} } {:a 1 :b 2} 15 | {:a "a"} {:a {:coercion int?}} {:a "a"} 16 | {:a "a"} {:a {:coercion int? :default 1}} {:a 1} 17 | {:a "a"} {:a {:coercion (s/and keyword? #{:a})}} {:a :a} 18 | {:a "a"} {:a {:coercion (s/and keyword? #{:b})}} {:a "a"}))) 19 | 20 | -------------------------------------------------------------------------------- /test/re_frame_routing/core_test.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.core-test 2 | (:require [clojure.spec.alpha :as s] 3 | [cljs.test :refer-macros [deftest is testing]] 4 | 5 | [re-frame-routing.core :as rfr])) 6 | 7 | ;; Will log errors if no subscriptions are registered 8 | (rfr/register-subscriptions) 9 | 10 | (deftest create-route-middleware 11 | (let [middleware-fn (rfr/create-route-middleware 12 | {:loading-view [:p "loading..."]}) 13 | 14 | ctx-no-middleware 15 | ((middleware-fn [:div "my-view"] 16 | [])) 17 | 18 | ctx-always-loading 19 | ((middleware-fn [:div "my-view"] 20 | [(fn [ctx] (assoc ctx :is-loading true))]))] 21 | 22 | (testing "Will return the view if context is not in a loading state" 23 | (is (= "my-view" (get-in ctx-no-middleware [0 1])))) 24 | 25 | (testing "Will return the loading view if context is in a loading state" 26 | (is (= "loading..." (get-in ctx-always-loading [0 1])))))) 27 | -------------------------------------------------------------------------------- /test/re_frame_routing/events_test.cljs: -------------------------------------------------------------------------------- 1 | (ns re-frame-routing.events-test 2 | (:require [cljs.test :refer-macros [deftest is testing]] 3 | [re-frame-routing.events :as rfr-event])) 4 | 5 | (def initial-db 6 | {:router {:route :home 7 | :route-params {:user-uuid "123"} 8 | :route-query {} 9 | :initialized false}}) 10 | 11 | ;; Need to mock js/window 12 | #_(deftest set-route 13 | (let [updated-db 14 | (rfr-event/set-route initial-db 15 | [nil 16 | {:handler :new-route 17 | :route-params {:user-uuid "456"}}])] 18 | )) 19 | 20 | (deftest nav-to 21 | (testing "Triggers nav-to fx" 22 | (is (= "/route" (:nav-to (rfr-event/nav-to 23 | {:db initial-db} [nil "/route"])))))) 24 | 25 | (deftest initialized 26 | (testing "Toggles initialized to true" 27 | (is (true? (get-in (rfr-event/initialized initial-db nil) 28 | [:router :initialized]))))) 29 | --------------------------------------------------------------------------------