From 30baa8afa0b342dcdc59e087f5564aca63df8cbd Mon Sep 17 00:00:00 2001 From: MegEngine Date: Thu, 4 Nov 2021 18:24:02 +0800 Subject: [PATCH 01/11] updatte --- Cargo.lock | 2583 -- Cargo.toml | 15 - Dockerfile | 34 - LICENSE | 192 - README.md | 128 - ci/build_doc.sh | 11 - ci/cargo-config | 5 - ci/doc_link_checker.py | 45 - ci/run_pylint_check.sh | 6 - ci/run_test.sh | 9 - docs/FAQ.zh.md | 33 - docs/Makefile | 21 - docs/built-in-applications/cat_finder.md | 1 - .../built-in-applications/electric_bicycle.md | 1 - docs/built-in-applications/images | 1 - docs/conf.py | 70 - docs/download-models.zh.md | 23 - .../01-single-classification-model.zh.md | 172 - .../02-single-det-classify.zh.md | 148 - .../03-batching-and-pipeline-test.zh.md | 81 - .../04-web-visualization.zh.md | 79 - .../appendix-A-graph-definition.zh.md | 189 - .../appendix-B-python-plugin.zh.md | 41 - .../build-from-source.zh.md | 107 - .../build-on-aarch64.zh.md | 103 - .../how-to-build-and-run/build-on-win10.zh.md | 50 - .../build-with-docker.zh.md | 35 - docs/how-to-build-and-run/generate-rtsp.zh.md | 77 - .../run-in-15-minutes.zh.md | 80 - docs/how-to-build-and-run/workflow.png | Bin 30067 -> 0 bytes docs/how-to-contribute.zh.md | 63 - docs/how-to-debug.zh.md | 12 - docs/how-to-pack-python-whl.zh.md | 18 - docs/images/visualize_deployment.jpg | Bin 26358 -> 0 bytes docs/images/visualize_result.jpg | Bin 187143 -> 0 bytes docs/index.rst | 51 - docs/make.bat | 35 - docs/requirements.txt | 4 - docs/structure.png | Bin 59225 -> 0 bytes flow-debugger/Cargo.lock | 1015 - flow-debugger/Cargo.toml | 11 - flow-debugger/debugger-ui/.gitignore | 23 - flow-debugger/debugger-ui/.prettierrc | 3 - flow-debugger/debugger-ui/package-lock.json | 21437 ---------------- flow-debugger/debugger-ui/package.json | 54 - flow-debugger/debugger-ui/public/index.html | 17 - flow-debugger/debugger-ui/public/robots.txt | 2 - flow-debugger/debugger-ui/src/App.css | 39 - flow-debugger/debugger-ui/src/App.js | 75 - flow-debugger/debugger-ui/src/AppHeader.js | 217 - .../debugger-ui/src/AppHeader.module.css | 35 - flow-debugger/debugger-ui/src/app/actor.js | 50 - flow-debugger/debugger-ui/src/app/index.js | 10 - flow-debugger/debugger-ui/src/app/store.js | 59 - .../src/component/button/Button.js | 31 - .../src/component/button/Button.module.css | 105 - .../debugger-ui/src/component/input/Input.js | 16 - .../src/component/input/Input.module.css | 10 - .../line_with_descp/LineWithDescp.js | 42 - .../line_with_descp/LineWithDescp.module.css | 24 - .../component/resizable_area/ResizableArea.js | 73 - .../resizable_area/ResizableArea.module.css | 58 - .../debugger-ui/src/component/tab/Tab.js | 26 - .../src/component/tab/Tab.module.css | 35 - .../debugger-ui/src/event_listener.js | 51 - flow-debugger/debugger-ui/src/index.css | 28 - flow-debugger/debugger-ui/src/index.js | 21 - .../debugger-ui/src/page/chart/Chart.js | 20 - .../src/page/chart/Chart.module.css | 18 - .../debugger-ui/src/page/chart/ChartSlice.js | 63 - .../debugger-ui/src/page/editor/Editor.js | 29 - .../src/page/editor/EditorSlice.js | 34 - .../debugger-ui/src/page/empty/Empty.js | 6 - .../src/page/empty/Empty.module.css | 8 - flow-debugger/debugger-ui/src/page/index.js | 32 - .../debugger-ui/src/page/text/Text.js | 13 - .../debugger-ui/src/page/text/Text.module.css | 13 - .../debugger-ui/src/page/text/TextSlice.js | 19 - .../debugger-ui/src/page/topology/Topology.js | 56 - .../src/page/topology/TopologySlice.js | 41 - .../debugger-ui/src/page/topology/VisGraph.js | 182 - flow-debugger/debugger-ui/src/parser.js | 399 - .../debugger-ui/src/serviceWorker.js | 138 - flow-debugger/debugger-ui/src/types.js | 13 - flow-debugger/debugger-ui/src/websocket.js | 83 - flow-debugger/debugger-ui/yarn.lock | 11687 --------- flow-debugger/src/main.rs | 6 - flow-derive/Cargo.toml | 18 - flow-derive/README.md | 9 - flow-derive/examples/node_derive.rs | 38 - flow-derive/src/actor.rs | 101 - flow-derive/src/internal.rs | 131 - flow-derive/src/lib.rs | 117 - flow-derive/src/lit.rs | 22 - flow-derive/src/node.rs | 159 - flow-derive/src/ports.rs | 117 - flow-derive/src/resource.rs | 29 - flow-derive/src/type_name.rs | 13 - flow-derive/src/utils.rs | 107 - flow-message/Cargo.lock | 390 - flow-message/Cargo.toml | 14 - flow-message/src/cross/cow_list.rs | 63 - flow-message/src/cross/cow_map.rs | 52 - flow-message/src/cross/data/list.rs | 117 - flow-message/src/cross/data/mod.rs | 214 - flow-message/src/cross/data/value.rs | 104 - flow-message/src/cross/list.rs | 35 - flow-message/src/cross/map.rs | 77 - flow-message/src/cross/mod.rs | 127 - flow-message/src/cross/python/cow_list.rs | 90 - flow-message/src/cross/python/cow_map.rs | 48 - flow-message/src/cross/python/iterator.rs | 46 - flow-message/src/cross/python/list.rs | 78 - flow-message/src/cross/python/map.rs | 51 - flow-message/src/cross/python/mod.rs | 143 - flow-message/src/lib.rs | 1 - flow-plugins/Cargo.toml | 29 - flow-plugins/examples/image_input.toml | 13 - flow-plugins/examples/image_server.toml | 15 - flow-plugins/examples/video_input.toml | 31 - flow-plugins/examples/video_server.toml | 31 - flow-plugins/src/image_input.rs | 110 - flow-plugins/src/image_server.rs | 164 - flow-plugins/src/lib.rs | 22 - flow-plugins/src/utils/bare_json.rs | 64 - flow-plugins/src/utils/codec.rs | 104 - flow-plugins/src/utils/either.rs | 58 - flow-plugins/src/utils/error.rs | 39 - flow-plugins/src/utils/image.rs | 150 - flow-plugins/src/utils/mod.rs | 17 - flow-plugins/src/utils/multipart.rs | 101 - flow-plugins/src/video_input.rs | 99 - flow-plugins/src/video_server.rs | 230 - flow-python/.gitattributes | 0 flow-python/examples/cat_finder/README.md | 157 - flow-python/examples/cat_finder/__init__.py | 10 - flow-python/examples/cat_finder/det.py | 84 - .../examples/cat_finder/image_cpu.toml | 54 - .../examples/cat_finder/image_gpu.toml | 54 - .../images/cat_finder_image_result.jpg | Bin 38640 -> 0 bytes .../images/cat_finder_image_select.jpg | Bin 19036 -> 0 bytes .../images/cat_finder_video_select.jpg | Bin 29498 -> 0 bytes .../examples/cat_finder/images/image.png | Bin 17719 -> 0 bytes .../examples/cat_finder/images/video.png | Bin 25728 -> 0 bytes .../examples/cat_finder/redis_proxy.py | 119 - flow-python/examples/cat_finder/reid_image.py | 52 - flow-python/examples/cat_finder/reid_video.py | 47 - flow-python/examples/cat_finder/shaper.py | 89 - flow-python/examples/cat_finder/track.py | 38 - .../examples/cat_finder/video_cpu.toml | 66 - .../examples/cat_finder/video_gpu.toml | 66 - .../examples/cat_finder/video_visualize.toml | 73 - .../examples/cat_finder/visualize/__init__.py | 13 - .../cat_finder/visualize/shaper_visualize.py | 92 - .../cat_finder/visualize/visualize.py | 169 - .../examples/electric_bicycle/README.md | 40 - .../examples/electric_bicycle/__init__.py | 10 - flow-python/examples/electric_bicycle/det.py | 74 - .../electric_bicycle/electric_bicycle.toml | 53 - .../examples/electric_bicycle/redis_proxy.py | 50 - .../examples/electric_bicycle/shaper.py | 67 - .../examples/electric_bicycle/track.py | 35 - flow-python/examples/logical_test/__init__.py | 10 - flow-python/examples/logical_test/buffer.py | 16 - .../examples/logical_test/logical_test.png | Bin 16244 -> 0 bytes .../examples/logical_test/logical_test.toml | 80 - flow-python/examples/logical_test/printer.py | 36 - flow-python/examples/logical_test/process.py | 59 - flow-python/examples/logical_test/source.py | 33 - flow-python/examples/misc/dump_resnet.py | 100 - flow-python/examples/misc/image_client.py | 30 - flow-python/examples/misc/video_client.py | 28 - .../examples/misc/visualize_client/demo.css | 108 - .../examples/misc/visualize_client/index.html | 224 - .../misc/visualize_client/push_video.py | 24 - flow-python/examples/requires.txt | 5 - .../simple_classification/__init__.py | 10 - .../simple_classification/classify.py | 41 - .../simple_classification/image_cpu.toml | 32 - .../simple_classification/image_test.toml | 31 - .../examples/simple_classification/lite.py | 107 - .../simple_classification/synset_words.txt | 1000 - .../examples/simple_det_classify/__init__.py | 10 - .../examples/simple_det_classify/classify.py | 100 - .../examples/simple_det_classify/det.py | 78 - .../examples/simple_det_classify/dump.py | 97 - .../examples/simple_det_classify/lite.py | 106 - .../simple_det_classify/video_cpu.toml | 47 - .../simple_det_classify/video_test.toml | 48 - flow-python/examples/utils.py | 214 - .../warehouse/detection_memd/README.md | 26 - .../warehouse/detection_memd/__init__.py | 12 - .../examples/warehouse/detection_memd/main.py | 86 - .../warehouse/detection_memd/onnx_model.py | 138 - .../warehouse/detection_memd/requirements.txt | 5 - .../warehouse/detection_yolox/README.md | 33 - .../warehouse/detection_yolox/__init__.py | 12 - .../warehouse/detection_yolox/coco_classes.py | 86 - .../warehouse/detection_yolox/lite.py | 213 - .../warehouse/detection_yolox/process.py | 161 - .../warehouse/detection_yolox/visualize.py | 72 - .../warehouse/quality_naive/__init__.py | 12 - .../warehouse/quality_naive/quality.py | 31 - .../warehouse/reid_alignedreid/README.md | 17 - .../warehouse/reid_alignedreid/__init__.py | 13 - .../warehouse/reid_alignedreid/dump.py | 62 - .../reid_alignedreid/image/badcase_tiger.jpg | Bin 71406 -> 0 bytes .../reid_alignedreid/image/negative.jpg | Bin 28987 -> 0 bytes .../reid_alignedreid/image/pinggai_1.jpg | Bin 12426 -> 0 bytes .../reid_alignedreid/image/positive1.jpg | Bin 221126 -> 0 bytes .../reid_alignedreid/image/positive2.jpg | Bin 184795 -> 0 bytes .../image/positive_pinggai.jpg | Bin 47518 -> 0 bytes .../warehouse/reid_alignedreid/lite.py | 80 - .../warehouse/reid_alignedreid/main.py | 44 - .../warehouse/reid_alignedreid/model.py | 54 - .../warehouse/reid_alignedreid/process.py | 35 - .../warehouse/reid_alignedreid/resnet.py | 220 - .../examples/warehouse/track_iou/__init__.py | 12 - .../examples/warehouse/track_iou/track_iou.py | 332 - flow-python/gen_whl.sh | 28 - flow-python/megflow/__init__.py | 12 - flow-python/megflow/command_line.py | 24 - flow-python/megflow/registry.py | 69 - flow-python/requirements.txt | 1 - flow-python/setup.py | 60 - flow-rs/Cargo.toml | 33 - flow-rs/examples/graph.rs | 136 - flow-rs/examples/run_with_plugins.rs | 82 - flow-rs/src/broker.rs | 156 - flow-rs/src/channel/error.rs | 24 - flow-rs/src/channel/inner.rs | 545 - flow-rs/src/channel/mod.rs | 83 - flow-rs/src/channel/receiver.rs | 195 - flow-rs/src/channel/sender.rs | 140 - flow-rs/src/channel/storage.rs | 169 - flow-rs/src/config/graphviz.rs | 157 - flow-rs/src/config/insert.rs | 221 - flow-rs/src/config/interlayer.rs | 92 - flow-rs/src/config/mod.rs | 234 - flow-rs/src/config/presentation.rs | 70 - flow-rs/src/debug/feature.rs | 70 - flow-rs/src/debug/mod.rs | 19 - flow-rs/src/debug/protocol.rs | 57 - flow-rs/src/debug/server.rs | 148 - flow-rs/src/envelope/any_envelope.rs | 74 - flow-rs/src/envelope/envelope.rs | 173 - flow-rs/src/envelope/mod.rs | 33 - flow-rs/src/future.rs | 61 - flow-rs/src/graph/channel.rs | 49 - flow-rs/src/graph/context.rs | 72 - flow-rs/src/graph/debug.rs | 132 - flow-rs/src/graph/mod.rs | 345 - flow-rs/src/graph/node.rs | 54 - flow-rs/src/graph/subgraph.rs | 93 - flow-rs/src/helper.rs | 46 - flow-rs/src/lib.rs | 157 - flow-rs/src/loader/mod.rs | 89 - flow-rs/src/loader/python/channel.rs | 68 - flow-rs/src/loader/python/context.rs | 68 - flow-rs/src/loader/python/envelope.rs | 167 - flow-rs/src/loader/python/mod.rs | 261 - flow-rs/src/loader/python/node.rs | 238 - flow-rs/src/loader/python/unlimited.rs | 317 - flow-rs/src/loader/python/utils.rs | 117 - flow-rs/src/node/bcast.rs | 63 - flow-rs/src/node/demux.rs | 129 - flow-rs/src/node/mod.rs | 111 - flow-rs/src/node/noop.rs | 52 - flow-rs/src/node/port.rs | 241 - flow-rs/src/node/reorder.rs | 114 - flow-rs/src/node/shared.rs | 294 - flow-rs/src/node/transform.rs | 125 - flow-rs/src/registry.rs | 185 - flow-rs/src/resource/any_resource.rs | 42 - flow-rs/src/resource/collection.rs | 86 - flow-rs/src/resource/lazy.rs | 55 - flow-rs/src/resource/mod.rs | 72 - flow-rs/src/resource/storage.rs | 75 - flow-rs/src/sandbox.rs | 206 - flow-rs/tests/01-subgraph.rs | 130 - flow-rs/tests/02-dyn-subgraph.rs | 39 - flow-rs/tests/03-share-subgraph.rs | 87 - flow-rs/tests/04-isolated.rs | 49 - flow-rs/tests/nodes_ext.rs | 122 - logo.png | Bin 27834 -> 0 bytes pylintrc | 610 - 286 files changed, 59006 deletions(-) delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 Dockerfile delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100755 ci/build_doc.sh delete mode 100644 ci/cargo-config delete mode 100644 ci/doc_link_checker.py delete mode 100755 ci/run_pylint_check.sh delete mode 100755 ci/run_test.sh delete mode 100644 docs/FAQ.zh.md delete mode 100644 docs/Makefile delete mode 120000 docs/built-in-applications/cat_finder.md delete mode 120000 docs/built-in-applications/electric_bicycle.md delete mode 120000 docs/built-in-applications/images delete mode 100644 docs/conf.py delete mode 100644 docs/download-models.zh.md delete mode 100644 docs/how-to-add-my-service/01-single-classification-model.zh.md delete mode 100644 docs/how-to-add-my-service/02-single-det-classify.zh.md delete mode 100644 docs/how-to-add-my-service/03-batching-and-pipeline-test.zh.md delete mode 100644 docs/how-to-add-my-service/04-web-visualization.zh.md delete mode 100644 docs/how-to-add-my-service/appendix-A-graph-definition.zh.md delete mode 100644 docs/how-to-add-my-service/appendix-B-python-plugin.zh.md delete mode 100644 docs/how-to-build-and-run/build-from-source.zh.md delete mode 100644 docs/how-to-build-and-run/build-on-aarch64.zh.md delete mode 100644 docs/how-to-build-and-run/build-on-win10.zh.md delete mode 100644 docs/how-to-build-and-run/build-with-docker.zh.md delete mode 100644 docs/how-to-build-and-run/generate-rtsp.zh.md delete mode 100644 docs/how-to-build-and-run/run-in-15-minutes.zh.md delete mode 100644 docs/how-to-build-and-run/workflow.png delete mode 100644 docs/how-to-contribute.zh.md delete mode 100644 docs/how-to-debug.zh.md delete mode 100644 docs/how-to-pack-python-whl.zh.md delete mode 100644 docs/images/visualize_deployment.jpg delete mode 100644 docs/images/visualize_result.jpg delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/requirements.txt delete mode 100644 docs/structure.png delete mode 100644 flow-debugger/Cargo.lock delete mode 100644 flow-debugger/Cargo.toml delete mode 100644 flow-debugger/debugger-ui/.gitignore delete mode 100644 flow-debugger/debugger-ui/.prettierrc delete mode 100644 flow-debugger/debugger-ui/package-lock.json delete mode 100644 flow-debugger/debugger-ui/package.json delete mode 100644 flow-debugger/debugger-ui/public/index.html delete mode 100644 flow-debugger/debugger-ui/public/robots.txt delete mode 100644 flow-debugger/debugger-ui/src/App.css delete mode 100644 flow-debugger/debugger-ui/src/App.js delete mode 100644 flow-debugger/debugger-ui/src/AppHeader.js delete mode 100644 flow-debugger/debugger-ui/src/AppHeader.module.css delete mode 100644 flow-debugger/debugger-ui/src/app/actor.js delete mode 100644 flow-debugger/debugger-ui/src/app/index.js delete mode 100644 flow-debugger/debugger-ui/src/app/store.js delete mode 100644 flow-debugger/debugger-ui/src/component/button/Button.js delete mode 100644 flow-debugger/debugger-ui/src/component/button/Button.module.css delete mode 100644 flow-debugger/debugger-ui/src/component/input/Input.js delete mode 100644 flow-debugger/debugger-ui/src/component/input/Input.module.css delete mode 100644 flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.js delete mode 100644 flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.module.css delete mode 100644 flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.js delete mode 100644 flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.module.css delete mode 100644 flow-debugger/debugger-ui/src/component/tab/Tab.js delete mode 100644 flow-debugger/debugger-ui/src/component/tab/Tab.module.css delete mode 100644 flow-debugger/debugger-ui/src/event_listener.js delete mode 100644 flow-debugger/debugger-ui/src/index.css delete mode 100644 flow-debugger/debugger-ui/src/index.js delete mode 100644 flow-debugger/debugger-ui/src/page/chart/Chart.js delete mode 100644 flow-debugger/debugger-ui/src/page/chart/Chart.module.css delete mode 100644 flow-debugger/debugger-ui/src/page/chart/ChartSlice.js delete mode 100644 flow-debugger/debugger-ui/src/page/editor/Editor.js delete mode 100644 flow-debugger/debugger-ui/src/page/editor/EditorSlice.js delete mode 100644 flow-debugger/debugger-ui/src/page/empty/Empty.js delete mode 100644 flow-debugger/debugger-ui/src/page/empty/Empty.module.css delete mode 100644 flow-debugger/debugger-ui/src/page/index.js delete mode 100644 flow-debugger/debugger-ui/src/page/text/Text.js delete mode 100644 flow-debugger/debugger-ui/src/page/text/Text.module.css delete mode 100644 flow-debugger/debugger-ui/src/page/text/TextSlice.js delete mode 100644 flow-debugger/debugger-ui/src/page/topology/Topology.js delete mode 100644 flow-debugger/debugger-ui/src/page/topology/TopologySlice.js delete mode 100644 flow-debugger/debugger-ui/src/page/topology/VisGraph.js delete mode 100644 flow-debugger/debugger-ui/src/parser.js delete mode 100644 flow-debugger/debugger-ui/src/serviceWorker.js delete mode 100644 flow-debugger/debugger-ui/src/types.js delete mode 100644 flow-debugger/debugger-ui/src/websocket.js delete mode 100644 flow-debugger/debugger-ui/yarn.lock delete mode 100644 flow-debugger/src/main.rs delete mode 100644 flow-derive/Cargo.toml delete mode 100644 flow-derive/README.md delete mode 100644 flow-derive/examples/node_derive.rs delete mode 100644 flow-derive/src/actor.rs delete mode 100644 flow-derive/src/internal.rs delete mode 100644 flow-derive/src/lib.rs delete mode 100644 flow-derive/src/lit.rs delete mode 100644 flow-derive/src/node.rs delete mode 100644 flow-derive/src/ports.rs delete mode 100644 flow-derive/src/resource.rs delete mode 100644 flow-derive/src/type_name.rs delete mode 100644 flow-derive/src/utils.rs delete mode 100644 flow-message/Cargo.lock delete mode 100644 flow-message/Cargo.toml delete mode 100644 flow-message/src/cross/cow_list.rs delete mode 100644 flow-message/src/cross/cow_map.rs delete mode 100644 flow-message/src/cross/data/list.rs delete mode 100644 flow-message/src/cross/data/mod.rs delete mode 100644 flow-message/src/cross/data/value.rs delete mode 100644 flow-message/src/cross/list.rs delete mode 100644 flow-message/src/cross/map.rs delete mode 100644 flow-message/src/cross/mod.rs delete mode 100644 flow-message/src/cross/python/cow_list.rs delete mode 100644 flow-message/src/cross/python/cow_map.rs delete mode 100644 flow-message/src/cross/python/iterator.rs delete mode 100644 flow-message/src/cross/python/list.rs delete mode 100644 flow-message/src/cross/python/map.rs delete mode 100644 flow-message/src/cross/python/mod.rs delete mode 100644 flow-message/src/lib.rs delete mode 100644 flow-plugins/Cargo.toml delete mode 100644 flow-plugins/examples/image_input.toml delete mode 100644 flow-plugins/examples/image_server.toml delete mode 100644 flow-plugins/examples/video_input.toml delete mode 100644 flow-plugins/examples/video_server.toml delete mode 100644 flow-plugins/src/image_input.rs delete mode 100644 flow-plugins/src/image_server.rs delete mode 100644 flow-plugins/src/lib.rs delete mode 100644 flow-plugins/src/utils/bare_json.rs delete mode 100644 flow-plugins/src/utils/codec.rs delete mode 100644 flow-plugins/src/utils/either.rs delete mode 100644 flow-plugins/src/utils/error.rs delete mode 100644 flow-plugins/src/utils/image.rs delete mode 100644 flow-plugins/src/utils/mod.rs delete mode 100644 flow-plugins/src/utils/multipart.rs delete mode 100644 flow-plugins/src/video_input.rs delete mode 100644 flow-plugins/src/video_server.rs delete mode 100644 flow-python/.gitattributes delete mode 100644 flow-python/examples/cat_finder/README.md delete mode 100644 flow-python/examples/cat_finder/__init__.py delete mode 100644 flow-python/examples/cat_finder/det.py delete mode 100644 flow-python/examples/cat_finder/image_cpu.toml delete mode 100644 flow-python/examples/cat_finder/image_gpu.toml delete mode 100644 flow-python/examples/cat_finder/images/cat_finder_image_result.jpg delete mode 100644 flow-python/examples/cat_finder/images/cat_finder_image_select.jpg delete mode 100644 flow-python/examples/cat_finder/images/cat_finder_video_select.jpg delete mode 100644 flow-python/examples/cat_finder/images/image.png delete mode 100644 flow-python/examples/cat_finder/images/video.png delete mode 100644 flow-python/examples/cat_finder/redis_proxy.py delete mode 100644 flow-python/examples/cat_finder/reid_image.py delete mode 100644 flow-python/examples/cat_finder/reid_video.py delete mode 100644 flow-python/examples/cat_finder/shaper.py delete mode 100644 flow-python/examples/cat_finder/track.py delete mode 100644 flow-python/examples/cat_finder/video_cpu.toml delete mode 100644 flow-python/examples/cat_finder/video_gpu.toml delete mode 100644 flow-python/examples/cat_finder/video_visualize.toml delete mode 100644 flow-python/examples/cat_finder/visualize/__init__.py delete mode 100644 flow-python/examples/cat_finder/visualize/shaper_visualize.py delete mode 100644 flow-python/examples/cat_finder/visualize/visualize.py delete mode 100644 flow-python/examples/electric_bicycle/README.md delete mode 100644 flow-python/examples/electric_bicycle/__init__.py delete mode 100644 flow-python/examples/electric_bicycle/det.py delete mode 100644 flow-python/examples/electric_bicycle/electric_bicycle.toml delete mode 100644 flow-python/examples/electric_bicycle/redis_proxy.py delete mode 100644 flow-python/examples/electric_bicycle/shaper.py delete mode 100644 flow-python/examples/electric_bicycle/track.py delete mode 100644 flow-python/examples/logical_test/__init__.py delete mode 100644 flow-python/examples/logical_test/buffer.py delete mode 100644 flow-python/examples/logical_test/logical_test.png delete mode 100644 flow-python/examples/logical_test/logical_test.toml delete mode 100644 flow-python/examples/logical_test/printer.py delete mode 100644 flow-python/examples/logical_test/process.py delete mode 100644 flow-python/examples/logical_test/source.py delete mode 100644 flow-python/examples/misc/dump_resnet.py delete mode 100644 flow-python/examples/misc/image_client.py delete mode 100644 flow-python/examples/misc/video_client.py delete mode 100644 flow-python/examples/misc/visualize_client/demo.css delete mode 100644 flow-python/examples/misc/visualize_client/index.html delete mode 100644 flow-python/examples/misc/visualize_client/push_video.py delete mode 100644 flow-python/examples/requires.txt delete mode 100644 flow-python/examples/simple_classification/__init__.py delete mode 100644 flow-python/examples/simple_classification/classify.py delete mode 100644 flow-python/examples/simple_classification/image_cpu.toml delete mode 100644 flow-python/examples/simple_classification/image_test.toml delete mode 100644 flow-python/examples/simple_classification/lite.py delete mode 100644 flow-python/examples/simple_classification/synset_words.txt delete mode 100644 flow-python/examples/simple_det_classify/__init__.py delete mode 100644 flow-python/examples/simple_det_classify/classify.py delete mode 100644 flow-python/examples/simple_det_classify/det.py delete mode 100644 flow-python/examples/simple_det_classify/dump.py delete mode 100644 flow-python/examples/simple_det_classify/lite.py delete mode 100644 flow-python/examples/simple_det_classify/video_cpu.toml delete mode 100644 flow-python/examples/simple_det_classify/video_test.toml delete mode 100644 flow-python/examples/utils.py delete mode 100644 flow-python/examples/warehouse/detection_memd/README.md delete mode 100644 flow-python/examples/warehouse/detection_memd/__init__.py delete mode 100644 flow-python/examples/warehouse/detection_memd/main.py delete mode 100644 flow-python/examples/warehouse/detection_memd/onnx_model.py delete mode 100644 flow-python/examples/warehouse/detection_memd/requirements.txt delete mode 100644 flow-python/examples/warehouse/detection_yolox/README.md delete mode 100644 flow-python/examples/warehouse/detection_yolox/__init__.py delete mode 100644 flow-python/examples/warehouse/detection_yolox/coco_classes.py delete mode 100644 flow-python/examples/warehouse/detection_yolox/lite.py delete mode 100644 flow-python/examples/warehouse/detection_yolox/process.py delete mode 100644 flow-python/examples/warehouse/detection_yolox/visualize.py delete mode 100644 flow-python/examples/warehouse/quality_naive/__init__.py delete mode 100644 flow-python/examples/warehouse/quality_naive/quality.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/README.md delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/__init__.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/dump.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/badcase_tiger.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/negative.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/pinggai_1.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/positive1.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/positive2.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/image/positive_pinggai.jpg delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/lite.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/main.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/model.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/process.py delete mode 100644 flow-python/examples/warehouse/reid_alignedreid/resnet.py delete mode 100644 flow-python/examples/warehouse/track_iou/__init__.py delete mode 100644 flow-python/examples/warehouse/track_iou/track_iou.py delete mode 100755 flow-python/gen_whl.sh delete mode 100644 flow-python/megflow/__init__.py delete mode 100644 flow-python/megflow/command_line.py delete mode 100644 flow-python/megflow/registry.py delete mode 100644 flow-python/requirements.txt delete mode 100644 flow-python/setup.py delete mode 100644 flow-rs/Cargo.toml delete mode 100644 flow-rs/examples/graph.rs delete mode 100644 flow-rs/examples/run_with_plugins.rs delete mode 100644 flow-rs/src/broker.rs delete mode 100644 flow-rs/src/channel/error.rs delete mode 100644 flow-rs/src/channel/inner.rs delete mode 100644 flow-rs/src/channel/mod.rs delete mode 100644 flow-rs/src/channel/receiver.rs delete mode 100644 flow-rs/src/channel/sender.rs delete mode 100644 flow-rs/src/channel/storage.rs delete mode 100644 flow-rs/src/config/graphviz.rs delete mode 100644 flow-rs/src/config/insert.rs delete mode 100644 flow-rs/src/config/interlayer.rs delete mode 100644 flow-rs/src/config/mod.rs delete mode 100644 flow-rs/src/config/presentation.rs delete mode 100644 flow-rs/src/debug/feature.rs delete mode 100644 flow-rs/src/debug/mod.rs delete mode 100644 flow-rs/src/debug/protocol.rs delete mode 100644 flow-rs/src/debug/server.rs delete mode 100644 flow-rs/src/envelope/any_envelope.rs delete mode 100644 flow-rs/src/envelope/envelope.rs delete mode 100644 flow-rs/src/envelope/mod.rs delete mode 100644 flow-rs/src/future.rs delete mode 100644 flow-rs/src/graph/channel.rs delete mode 100644 flow-rs/src/graph/context.rs delete mode 100644 flow-rs/src/graph/debug.rs delete mode 100644 flow-rs/src/graph/mod.rs delete mode 100644 flow-rs/src/graph/node.rs delete mode 100644 flow-rs/src/graph/subgraph.rs delete mode 100644 flow-rs/src/helper.rs delete mode 100644 flow-rs/src/lib.rs delete mode 100644 flow-rs/src/loader/mod.rs delete mode 100644 flow-rs/src/loader/python/channel.rs delete mode 100644 flow-rs/src/loader/python/context.rs delete mode 100644 flow-rs/src/loader/python/envelope.rs delete mode 100644 flow-rs/src/loader/python/mod.rs delete mode 100644 flow-rs/src/loader/python/node.rs delete mode 100644 flow-rs/src/loader/python/unlimited.rs delete mode 100644 flow-rs/src/loader/python/utils.rs delete mode 100644 flow-rs/src/node/bcast.rs delete mode 100644 flow-rs/src/node/demux.rs delete mode 100644 flow-rs/src/node/mod.rs delete mode 100644 flow-rs/src/node/noop.rs delete mode 100644 flow-rs/src/node/port.rs delete mode 100644 flow-rs/src/node/reorder.rs delete mode 100644 flow-rs/src/node/shared.rs delete mode 100644 flow-rs/src/node/transform.rs delete mode 100644 flow-rs/src/registry.rs delete mode 100644 flow-rs/src/resource/any_resource.rs delete mode 100644 flow-rs/src/resource/collection.rs delete mode 100644 flow-rs/src/resource/lazy.rs delete mode 100644 flow-rs/src/resource/mod.rs delete mode 100644 flow-rs/src/resource/storage.rs delete mode 100644 flow-rs/src/sandbox.rs delete mode 100644 flow-rs/tests/01-subgraph.rs delete mode 100644 flow-rs/tests/02-dyn-subgraph.rs delete mode 100644 flow-rs/tests/03-share-subgraph.rs delete mode 100644 flow-rs/tests/04-isolated.rs delete mode 100644 flow-rs/tests/nodes_ext.rs delete mode 100644 logo.png delete mode 100644 pylintrc diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 3059f0b..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,2583 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "anyhow" -version = "1.0.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595d3cfa7a60d4555cb5067b99f07142a08ea778de5cf993f7b75c7d8fabc486" - -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9586ec52317f36de58453159d48351bc244bc24ced3effc1fce22f3d48664af6" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "async-mutex", - "blocking", - "futures-lite", - "num_cpus", - "once_cell", - "tokio", -] - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-lock" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-mutex" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-process" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f38756dd9ac84671c428afbf7c9f7495feff9ec5b0710f17100098e5b354ac" -dependencies = [ - "async-io", - "blocking", - "cfg-if 1.0.0", - "event-listener", - "futures-lite", - "libc", - "once_cell", - "signal-hook", - "winapi", -] - -[[package]] -name = "async-std" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" -dependencies = [ - "async-attributes", - "async-channel", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "num_cpus", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" - -[[package]] -name = "atomic-waker" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bindgen" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" -dependencies = [ - "bitflags", - "cexpr", - "cfg-if 0.1.10", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", -] - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" -dependencies = [ - "async-channel", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "once_cell", -] - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "bytemuck" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" - -[[package]] -name = "cache-padded" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - -[[package]] -name = "cc" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" - -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - -[[package]] -name = "clang-sys" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "3.0.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" -dependencies = [ - "atty", - "bitflags", - "clap_derive", - "indexmap", - "lazy_static", - "os_str_bytes", - "strsim", - "termcolor", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clap_derive" -version = "3.0.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "cpufeatures" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "ctor" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "ctrlc" -version = "3.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "232295399409a8b7ae41276757b5a1cc21032848d42bff2352261f958b3ca29a" -dependencies = [ - "nix", - "winapi", -] - -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if 1.0.0", - "num_cpus", -] - -[[package]] -name = "deflate" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" -dependencies = [ - "adler32", - "byteorder", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "dyn-clone" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "enum-as-inner" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "env_logger" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "event-listener" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "fastrand" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" -dependencies = [ - "instant", -] - -[[package]] -name = "ffmpeg-next" -version = "4.4.0" -source = "git+https://github.com/Easonzero/rust-ffmpeg?branch=master#725c9bb091e06cdecdd93fa236d67dcdbb772add" -dependencies = [ - "bitflags", - "ffmpeg-sys-next", - "libc", -] - -[[package]] -name = "ffmpeg-sys-next" -version = "4.4.0" -source = "git+https://github.com/Easonzero/rust-ffmpeg-sys?branch=master#0b3390c3a6117be57f7ca8df0d67dee45a8ee41d" -dependencies = [ - "bindgen", - "cc", - "libc", - "num_cpus", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "flow-debugger" -version = "0.1.0" -dependencies = [ - "tokio", - "warp", -] - -[[package]] -name = "flow-derive" -version = "0.1.0" -dependencies = [ - "anyhow", - "flow-rs", - "proc-macro2", - "quote", - "syn", - "toml", -] - -[[package]] -name = "flow-message" -version = "0.1.0" -dependencies = [ - "byteorder", - "dashmap", - "enum-as-inner", - "im", - "paste 1.0.5", - "pyo3", -] - -[[package]] -name = "flow-plugins" -version = "0.1.0" -dependencies = [ - "anyhow", - "ffmpeg-next", - "flow-rs", - "futures-util", - "headers", - "hyper", - "image", - "indexmap", - "log", - "mime", - "numpy", - "oneshot", - "pretty_env_logger", - "pyo3", - "rand 0.8.4", - "rweb", - "serde", - "serde_json", - "toml", - "urlencoding", -] - -[[package]] -name = "flow-rs" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-std", - "clap", - "concurrent-queue", - "ctor", - "ctrlc", - "dyn-clone", - "event-listener", - "flow-derive", - "flow-plugins", - "futures-core", - "futures-util", - "lazy_static", - "libc", - "log", - "numpy", - "oneshot", - "pyo3", - "rand 0.8.4", - "serde", - "serde_json", - "stackful", - "toml", - "warp", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" - -[[package]] -name = "futures-executor" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57" -dependencies = [ - "autocfg", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" - -[[package]] -name = "futures-task" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" - -[[package]] -name = "futures-util" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" -dependencies = [ - "autocfg", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", -] - -[[package]] -name = "generator" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061d3be1afec479d56fa3bd182bf966c7999ec175fcfdb87ac14d417241366c6" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "winapi", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", -] - -[[package]] -name = "gif" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a668f699973d0f573d15749b7002a9ac9e1f9c6b220e7b165601334c173d8de" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "gloo-timers" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "h2" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "headers" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" -dependencies = [ - "base64", - "bitflags", - "bytes", - "headers-core", - "http", - "mime", - "sha-1", - "time", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "http" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" - -[[package]] -name = "httpdate" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - -[[package]] -name = "hyper" -version = "0.14.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "im" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111c1983f3c5bb72732df25cddacee9b546d08325fb584b5ebd38148be7b0246" -dependencies = [ - "bitmaps", - "rand_core 0.5.1", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "image" -version = "0.23.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "gif", - "jpeg-decoder", - "num-iter", - "num-rational", - "num-traits", - "png", - "scoped_threadpool", - "tiff", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", - "serde", -] - -[[package]] -name = "indoc" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" -dependencies = [ - "indoc-impl", - "proc-macro-hack", -] - -[[package]] -name = "indoc-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", - "unindent", -] - -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - -[[package]] -name = "instant" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" -dependencies = [ - "rayon", -] - -[[package]] -name = "js-sys" -version = "0.3.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce791b7ca6638aae45be056e068fc756d871eb3b3b10b8efa62d1c9cec616752" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" - -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi", -] - -[[package]] -name = "lock_api" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if 1.0.0", - "value-bag", -] - -[[package]] -name = "loom" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed" -dependencies = [ - "cfg-if 0.1.10", - "generator", - "scoped-tls", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - -[[package]] -name = "matrixmultiply" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8a15b776d9dfaecd44b03c5828c2199cddff5247215858aac14624f8d6b741" -dependencies = [ - "rawpointer", -] - -[[package]] -name = "memchr" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" - -[[package]] -name = "memoffset" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "miniz_oxide" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - -[[package]] -name = "mio" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "multipart" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050aeedc89243f5347c3e237e3e13dc76fbe4ae3742a57b94dc14f69acf76d4" -dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error", - "rand 0.7.3", - "safemem", - "tempfile", - "twoway", -] - -[[package]] -name = "ndarray" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e854964160a323e65baa19a0b1a027f76d590faba01f05c0cbc3187221a8c9" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "nix" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", -] - -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "memchr", - "version_check", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", -] - -[[package]] -name = "num-complex" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "numpy" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c15af63aa0c74e0f7230d4e95d9a3d71a23449905f30f50b055df9a6a6a3e6" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "ndarray", - "num-complex", - "num-traits", - "pyo3", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "oneshot" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39d7085e4e51b36df4afa83db60d20ad2adf8e8587a193f93c9143bf7b375dec" -dependencies = [ - "loom", -] - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "os_str_bytes" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - -[[package]] -name = "paste" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" -dependencies = [ - "paste-impl", - "proc-macro-hack", -] - -[[package]] -name = "paste" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" - -[[package]] -name = "paste-impl" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" -dependencies = [ - "proc-macro-hack", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "pmutil" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "png" -version = "0.16.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" -dependencies = [ - "bitflags", - "crc32fast", - "deflate", - "miniz_oxide 0.3.7", -] - -[[package]] -name = "polling" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - -[[package]] -name = "pretty_env_logger" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "717ee476b1690853d222af4634056d830b5197ffd747726a9a1eee6da9f49074" -dependencies = [ - "chrono", - "env_logger", - "log", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - -[[package]] -name = "proc-macro2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "pyo3" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35100f9347670a566a67aa623369293703322bb9db77d99d7df7313b575ae0c8" -dependencies = [ - "cfg-if 1.0.0", - "indoc", - "libc", - "parking_lot", - "paste 0.1.18", - "pyo3-build-config", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d12961738cacbd7f91b7c43bc25cfeeaa2698ad07a04b3be0aa88b950865738f" -dependencies = [ - "once_cell", -] - -[[package]] -name = "pyo3-macros" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0bc5215d704824dfddddc03f93cb572e1155c68b6761c37005e1c288808ea8" -dependencies = [ - "pyo3-macros-backend", - "quote", - "syn", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71623fc593224afaab918aa3afcaf86ed2f43d34f6afde7f3922608f253240df" -dependencies = [ - "proc-macro2", - "pyo3-build-config", - "quote", - "syn", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - -[[package]] -name = "rand_xoshiro" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - -[[package]] -name = "rweb" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a802dc90277139d1ace995178d76eaf5602243701fa1d513a50d874bab5dd18" -dependencies = [ - "futures", - "http", - "indexmap", - "rweb-macros", - "rweb-openapi", - "scoped-tls", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "warp", -] - -[[package]] -name = "rweb-macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7212d46c6b6fb100bd2a5969a579cd0e4865c7c11a9f8562ee3ecfc89c06d20f" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "rweb-openapi", - "syn", -] - -[[package]] -name = "rweb-openapi" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f3187ee05c7f920477357885f683e5c29bdf024f7873d8e2aa23930c07de29" -dependencies = [ - "indexmap", - "serde", - "serde_json", - "url", -] - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "serde" -version = "1.0.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" -dependencies = [ - "block-buffer", - "cfg-if 1.0.0", - "cpufeatures", - "digest", - "opaque-debug", -] - -[[package]] -name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - -[[package]] -name = "signal-hook" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470c5a6397076fae0094aaf06a08e6ba6f37acb77d3b1b91ea92b4d6c8650c39" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" -dependencies = [ - "libc", -] - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "slab" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" - -[[package]] -name = "smallvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" - -[[package]] -name = "socket2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "stackful" -version = "0.1.0" -source = "git+https://github.com/nbdd0121/stackful.git?rev=4789e26#4789e2622ccf6efcdb7693f358609b5efd81987c" -dependencies = [ - "cc", - "futures-executor", - "libc", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "1.0.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "rand 0.8.4", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "tiff" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" -dependencies = [ - "jpeg-decoder", - "miniz_oxide 0.4.4", - "weezl", -] - -[[package]] -name = "time" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "tinyvec" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "pin-project-lite", - "tokio-macros", - "winapi", -] - -[[package]] -name = "tokio-macros" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" -dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.4", - "sha-1", - "url", - "utf-8", -] - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "unindent" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b90931029ab9b034b300b797048cf23723400aa757e8a2bfb9d748102f9821" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "value-bag" -version = "1.0.0-alpha.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd320e1520f94261153e96f7534476ad869c14022aee1e59af7c778075d840ae" -dependencies = [ - "ctor", - "version_check", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "warp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "wasm-bindgen" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608ecc8f4198fe8680e2ed18eccab5f0cd4caaf3d83516fa5fb2e927fda2586" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "580aa3a91a63d23aac5b6b267e2d13cb4f363e31dce6c352fca4752ae12e479f" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16646b21c3add8e13fdb8f20172f8a28c3dbf62f45406bcff0233188226cfe0c" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171ebf0ed9e1458810dfcb31f2e766ad6b3a89dbda42d8901f2b268277e5f09c" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2657dd393f03aa2a659c25c6ae18a13a4048cebd220e147933ea837efc589f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0c4a743a309662d45f4ede961d7afa4ba4131a59a639f29b0069c3798bbcc2" - -[[package]] -name = "web-sys" -version = "0.3.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c70a82d842c9979078c772d4a1344685045f1a5628f677c2b2eab4dd7d2696" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "weezl" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index dc2d0d4..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[workspace] -members = [ - "flow-rs", - "flow-derive", - "flow-plugins", - "flow-debugger", - "flow-message" -] - -[profile.dev] -incremental = false -panic = 'abort' - -[profile.release] -panic = 'abort' diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 0608358..0000000 --- a/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM ubuntu:18.04 - -RUN apt update \ - && apt install -y curl \ - && apt install -y ffmpeg \ - && apt install -y yasm \ - && apt install -y clang \ - && apt install -y redis-server \ - && apt install -y python3 \ - && apt install -y python3-pip \ - && apt install -y git \ - && apt install -y build-essential - -ENV CARGO_HOME /cargo -ENV RUSTUP_HOME /rustup -RUN curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -o run.sh \ - && chmod a+x run.sh \ - && ./run.sh -y && rm run.sh -ENV PATH $PATH:/cargo/bin -RUN chmod -R 777 /cargo /rustup -COPY ci/cargo-config /cargo/config - -RUN mkdir -p $HOME/megflow-runspace -WORKDIR $HOME/megflow-runspace -COPY . $HOME/megflow-runspace/ - -RUN cargo build \ - && cd flow-python \ - && python3 setup.py install --user \ - && cd examples \ - && cargo run --example run_with_plugins -- -p logical_test - -RUN cargo build --example run_with_plugins --release \ - && ln -s target/release/examples/run_with_plugins diff --git a/LICENSE b/LICENSE deleted file mode 100644 index b040325..0000000 --- a/LICENSE +++ /dev/null @@ -1,192 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright (c) 2014-2021 Megvii Inc. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - diff --git a/README.md b/README.md deleted file mode 100644 index 7ef0b5d..0000000 --- a/README.md +++ /dev/null @@ -1,128 +0,0 @@ -
- -
- -## MegFlow | [Documentation](https://megflow.readthedocs.io/zh_CN/latest/#) -[![GitHub license](https://img.shields.io/badge/license-apache--2--Clause-brightgreen.svg)](./LICENSE) -[![ubuntu](https://img.shields.io/github/workflow/status/MegEngine/MegFlow/ubuntu-x86-cpu?label=ubuntu)](https://github.com/MegEngine/MegFlow/actions/workflows/ubuntu-x86-cpu.yml?query=workflow%3A) -[![macos](https://img.shields.io/github/workflow/status/MegEngine/MegFlow/ubuntu-x86-cpu?label=macos)](https://github.com/MegEngine/MegFlow/actions/workflows/macos-x86-cpu.yml?query=workflow%3A) - -MegFlow 提供快速视觉应用落地流程,最快 15 分钟搭建起视频分析服务。其特性体现在: - -* 直接用 Python 搭建计算图(如先检测、再跟踪、最后质量判断加识别),不必关心 C++、图优化相关问题 -* 省去 SDK 集成、提升开发体验,通过流程改进应对人力不足、时间紧、功能多的情况 -* 提供 pipeline 搭建、测试、调试、部署、结果可视化一条龙服务 - -## HowTo -* how to build and run - * [run with prebuilt .whl](docs/how-to-build-and-run/run-in-15-minutes.zh.md) - * [build with docker](docs/how-to-build-and-run/build-with-docker.zh.md) - * [build from source](docs/how-to-build-and-run/build-from-source.zh.md) - * [build on win10](docs/how-to-build-and-run/build-on-win10.zh.md) - * [build on armv8](docs/how-to-build-and-run/build-on-aarch64.zh.md) - * [generate rtsp](docs/how-to-build-and-run/generate-rtsp.zh.md) -* how to use - * [tutorial01: image classification service](docs/how-to-add-my-service/01-single-classification-model.zh.md) - * [tutorial02: detect and classify on video stream](docs/how-to-add-my-service/02-single-det-classify.zh.md) - * [tutorial03: batching and pipeline test](docs/how-to-add-my-service/03-batching-and-pipeline-test.zh.md) - * [tutorial04: visualization](docs/how-to-add-my-service/04-web-visualization.zh.md) -* [how to debug](docs/how-to-debug.zh.md) -* [how to contribute](docs/how-to-contribute.zh.md) -* [FAQ](docs/FAQ.zh.md) - -## Current Support Matrix - -| 系统环境 | win10 docker/wsl2 | ubuntu | centOS | macos | -| ----------- | ------------------------- | ---------- | ---------- | --------- | -| x86 | ✔️ | ✔️ | ✔️ | ✔️ | -| ARMv8 | - | ✔️ | ✔️ | - | - -| Python 版本 | 支持情况 | -| ----------- | -------- | -| 3.6 | ✔️ | -| 3.7 | ✔️ | -| 3.8 | ✔️ | -| 3.9 | ✔️ | - -## Built-in Applications -* 猫猫围栏 -* 电梯电动车报警 - -## Features -- 基于 [async-std](https://github.com/async-rs/async-std)[features=[tokio1](https://github.com/tokio-rs/tokio)] 的高效异步运行时调度器 -- 简洁的基于 [toml](https://toml.io/en/) 的建图描述格式 -- 支持静态、动态、共享子图 -- 支持 Rust/Python 多语言共存(会 Python 即可) -- 支持资源管理(多层级跨任务共享) -- 支持异常处理(异常任务会终止所在静态图) -- 支持 demux/reorder/transform 等通用函数式组件 -- Python 插件内置有栈协程,不依赖 asyncio -- 基础测试工具,支持插件沙盒,用于单测插件 -- 基础调试工具,支持建图实时预览/qps profile - -## Coming Soon -- 进程级别的节点、子图支持 -- 插件自动化测试部署 -- 性能监控,inspect 等工具 -- 更多内置应用和组件 - -## Contact Us - * Issue: github.com/MegEngine/MegFlow/issues - * Email: megengine-support@megvii.com - * QQ Group: 1029741705 - -## License -- [Apache 2.0](LICENSE) - -## Acknowledgement - -MegFlow examples 模型和推理学习了这些项目: -* [MegEngine](https://github.com/megengine/megengine) -* [Models](https://github.com/megengine/models) -* [onnx](https://github.com/onnx/onnx) -* [YOLOX](https://github.com/Megvii-BaseDetection/YOLOX) -* [AlignedReID](https://github.com/huanghoujing/AlignedReID-Re-Production-Pytorch) -* [MEMD](https://github.com/megvii-research/MEMD) - -MegFlow 结果可视化使用了以下项目: -* [flv.js](http://bilibili.github.io/flv.js/demo/) - -MegFlow Python 使用了下列项目: -* [OpenCV](https://github.com/opencv/opencv) -* [numpy](https://github.com/numpy/numpy) -* [loguru](https://pypi.org/project/loguru/) -* [scipy](https://github.com/scipy/scipy) -* [redis](https://github.com/redis/redis) - -MegFlow Rust 使用了以下项目: -* [anyhow](https://github.com/dtolnay/anyhow) -* [async-std](https://github.com/async-rs/async-std) -* [async-channel](https://github.com/smol-rs/async-channel) -* [clap](https://github.com/clap-rs/clap) -* [concurrent-queue](https://github.com/stjepang/concurrent-queue) -* [ctrlc](https://github.com/Detegr/rust-ctrlc.git) -* [ctor](https://github.com/mmastrac/rust-ctor) -* [dyn-clone](https://github.com/dtolnay/dyn-clone) -* [event-listener](https://github.com/stjepang/event-listener) -* [ffmpeg-next](https://github.com/zmwangx/rust-ffmpeg) -* [hyper](https://github.com/bluss/hyper) -* [headers](https://github.com/bluss/headers) -* [image](https://github.com/image-rs/image) -* [indexmap](https://github.com/bluss/indexmap) -* [lazy-static](https://github.com/rust-lang-nursery/lazy-static.rs) -* [mime](https://github.com/hyperium/mime) -* [numpy](https://github.com/rust-numpy/rust-numpy) -* [oneshot](https://github.com/faern/oneshot) -* [proc-macro2](https://github.com/dtolnay/proc-macro2) -* [pretty-env-logger](https://github.com/seanmonstar/pretty-env-logger) -* [pyo3](https://github.com/pyo3/pyo3) -* [quote](https://github.com/dtolnay/quote) -* [rand](https://github.com/rust-random/rand) -* [rweb](https://github.com/kdy1/rweb) -* [serde](https://github.com/serde-rs/serde) -* [serde_json](https://github.com/serde-rs/json) -* [stackful](https://github.com/nbdd0121/stackful) -* [syn](https://github.com/dtolnay/syn) -* [toml](https://github.com/alexcrichton/toml-rs) -* [urlencoding](https://github.com/kornelski/urlencoding) -* [warp](https://github.com/seanmonstar/warp) diff --git a/ci/build_doc.sh b/ci/build_doc.sh deleted file mode 100755 index 7f67125..0000000 --- a/ci/build_doc.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -ex - -rm -rf public - -: ${TARGET_DIR:=/target/${CI_COMMIT_SHA}} - -cargo doc --no-deps - -echo '' > ${TARGET_DIR}/doc/index.html - -mv ${TARGET_DIR}/doc public diff --git a/ci/cargo-config b/ci/cargo-config deleted file mode 100644 index e0656fd..0000000 --- a/ci/cargo-config +++ /dev/null @@ -1,5 +0,0 @@ -[source.crates-io] -replace-with = 'tuna' - -[source.tuna] -registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git" \ No newline at end of file diff --git a/ci/doc_link_checker.py b/ci/doc_link_checker.py deleted file mode 100644 index ad7a00e..0000000 --- a/ci/doc_link_checker.py +++ /dev/null @@ -1,45 +0,0 @@ -# /bin/python3 - -import os -import re -import sys - -pattern = re.compile(r'\[.*?\]\(.*?\)') -def analyze_doc(home, path): - problem_list = [] - with open(path) as f: - lines = f.readlines() - for line in lines: - if '[' in line and ']' in line and '(' in line and ')' in line: - all = pattern.findall(line) - for item in all: - start = item.find('(') - end = item.find(')') - ref = item[start+1: end] - if ref.startswith('http') or ref.startswith('#'): - continue - fullpath = os.path.join(home, ref) - if not os.path.exists(fullpath): - problem_list.append(ref) - # print(f' {fullpath} in {path} not exist!') - else: - continue - if len(problem_list) > 0: - print(f'{path}:') - for item in problem_list: - print(f'\t {item}') - print('\n') - sys.exit(1) - -def traverse(_dir): - for home, dirs, files in os.walk(_dir): - if "./target" in home or "./.github" in home: - continue - for filename in files: - if filename.endswith('.md'): - path = os.path.join(home, filename) - if os.path.islink(path) == False: - analyze_doc(home, path) - -if __name__ == "__main__": - traverse(".") diff --git a/ci/run_pylint_check.sh b/ci/run_pylint_check.sh deleted file mode 100755 index 0ad5f9d..0000000 --- a/ci/run_pylint_check.sh +++ /dev/null @@ -1,6 +0,0 @@ -python -m pip install pylint==2.5.2 -CHECK_DIR="flow-python/examples/simple_classification flow-python/examples/simple_det_classify flow-python/examples/cat_finder flow-python/examples/electric_bicycle flow-python/examples/misc" -pylint $CHECK_DIR || pylint_ret=$? -if [ "$pylint_ret" ]; then - exit $pylint_ret -fi diff --git a/ci/run_test.sh b/ci/run_test.sh deleted file mode 100755 index c35d407..0000000 --- a/ci/run_test.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -ex - -cd flow-python - -python3 setup.py install - -cd examples - -cargo run --example run_with_plugins -- -p logical_test diff --git a/docs/FAQ.zh.md b/docs/FAQ.zh.md deleted file mode 100644 index 97b2645..0000000 --- a/docs/FAQ.zh.md +++ /dev/null @@ -1,33 +0,0 @@ -# FAQ - -Q:`run_with_plugins -p logical_test ` 无法运行怎么办? - -A1:如果报错 `message: "No such file or directory" }'`,确认是否`cd flow-python/examples` - -A2:确认安装了 python 组件,即 `cd flow-python` 再 `python3 setup.py install --user` - -还不行就提 issue。 - -___ -Q:视频流跑一路没事。跑多个,内存爆了/显存爆了/模型加载多次是因为啥? - -A:参照 `cat_finder/video.toml`,把涉模型的 nodes 移到 `[[graphs]]`上面,让多个子图来共享。 - -每启动一个视频流就会启一个子图,如果`nodes`放到`[[graphs]]`里,20 路视频就会创建 20 套 nodes。 -___ -Q:如何修改服务端口号,8080 已被占用? - -A:以`cat_finder` 为例,端口配置在 `image.toml` 的 `port` 中。 -___ -Q:如何让 ImageServer 返回 json,而不是渲染后的图? - -A:ImageServer 默认返回 `envelope.msg["data"]`图像。如果要返回 json 需要改两处: -* `image.toml` 的配置里增加 `response = "json"` -* 最终结果用`self.out.send(envelope.repack(json.dumps(results)))`发送出去 - -框架既不知道哪些字段可序列化,也不知道要序列化那几个字段,因此需要调用方序列化成 `str`。代码可参照 `examaples/cat_finder/redis_proxy.py`。 -___ -Q:视频流为什么无法停止,调用了 stop 接口还是在处理? - -A:调用 stop 之后队列的 `push/put` 接口已经被关闭了,不能追加新的,但之前解好的帧还在队列里。需要把遗留的处理完、依次停止子图节点才完全结束。流不会调用 stop 即刻停止,实际上有延迟。 -___ diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index b2e992e..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - diff --git a/docs/built-in-applications/cat_finder.md b/docs/built-in-applications/cat_finder.md deleted file mode 120000 index 224b0c2..0000000 --- a/docs/built-in-applications/cat_finder.md +++ /dev/null @@ -1 +0,0 @@ -../../flow-python/examples/cat_finder/README.md \ No newline at end of file diff --git a/docs/built-in-applications/electric_bicycle.md b/docs/built-in-applications/electric_bicycle.md deleted file mode 120000 index edd4745..0000000 --- a/docs/built-in-applications/electric_bicycle.md +++ /dev/null @@ -1 +0,0 @@ -../../flow-python/examples/electric_bicycle/README.md \ No newline at end of file diff --git a/docs/built-in-applications/images b/docs/built-in-applications/images deleted file mode 120000 index a652364..0000000 --- a/docs/built-in-applications/images +++ /dev/null @@ -1 +0,0 @@ -../../flow-python/examples/cat_finder/images \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 0952041..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,70 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -#sys.path.insert(0, os.path.abspath('.')) - -import sphinx_rtd_theme -from recommonmark.parser import CommonMarkParser -from recommonmark.transform import AutoStructify - - -# -- Project information ----------------------------------------------------- - -project = 'MegFlow' -copyright = '2021, Megvii' -author = 'MegEngine' - -# The full version, including alpha/beta/rc tags -release = '' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['recommonmark', 'sphinx_markdown_tables'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'zh' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = ['.rst', '.md'] diff --git a/docs/download-models.zh.md b/docs/download-models.zh.md deleted file mode 100644 index 9f66ddb..0000000 --- a/docs/download-models.zh.md +++ /dev/null @@ -1,23 +0,0 @@ -# 模型下载 - -MegFlow 所有模型都压缩成了单个 models.zip 。 - -| 云盘 | google drive | -| - | - | -| 链接: https://pan.baidu.com/s/1ZLVBR0igJ1hL6PoYQDtByA 提取码: 8ajf | [google](https://drive.google.com/file/d/1EwMJFjNp2kuNglutoleZOVsqccSOW2Z4/view?usp=sharing) | - -取最新的 models_xxx.zip,解压、软链为 examples/models - -```bash -$ wget ${URL}/modes.zip -$ cd flow-python/examples -$ ln -s ${DOWNLOAD_DIR}/models models -``` - -如果有 MegFlow-models repo,可以直接 - -```bash -$ cd MegFlow-models -$ git-lfs update -$ git lfs pull -``` diff --git a/docs/how-to-add-my-service/01-single-classification-model.zh.md b/docs/how-to-add-my-service/01-single-classification-model.zh.md deleted file mode 100644 index b49c71c..0000000 --- a/docs/how-to-add-my-service/01-single-classification-model.zh.md +++ /dev/null @@ -1,172 +0,0 @@ -# 把分类模型变成服务 - -尽管 MegFlow 解决的是多个(20+)模型组织成 pipeline 的问题,但凡事总要一步步来。本文介绍如何 step by step 集成 1 个分类模型,最终成为图片/视频 http 服务。 - -## 准备分类模型 - -[MegEngine models](https://github.com/MegEngine/models) 有现成的 imagenet 预训模型。这里把模型 dump 成 .mge。 - -新增 [dump.py](https://github.com/MegEngine/Models/blob/master/official/vision/classification/dump.py),按 [1, 3, 224, 224] 尺寸 trace 模型,打开推理优化选项,保存为 `model.mge`。 - -```bash -$ git clone https://github.com/MegEngine/models -$ cd models -$ export PYHTONPATH=${PWD}:${PYTHONPATH} -$ cd official/vision/classification/resnet -$ python3 dump.py -$ ls -lah model.mge -... -``` -`dump.py` 已经 PR 到 [MegEngine/models 分类模型目录](https://github.com/MegEngine/Models/tree/master/official/vision/classification) -```bash -$ cat dump.py -... - data = mge.Tensor(np.random.random((1, 3, 224, 224))) # 准备一个样例输入 - - @jit.trace(capture_as_const=True) - def pred_func(data): - outputs = model(data) # trace 每个 opr 的 shape - return outputs - - pred_func(data) - pred_func.dump( # 保存模型 - graph_name, - arg_names=["data"], - optimize_for_inference=True, # 打开推理优化选项 - enable_fuse_conv_bias_nonlinearity=True, # 打开 fuse conv+bias+ReLU pass 推理更快 - ) -... -``` - -## 模型单测 -开发模型的推理封装,对外提供[功能内聚](https://baike.baidu.com/item/%E9%AB%98%E5%86%85%E8%81%9A%E4%BD%8E%E8%80%A6%E5%90%88/5227009)的接口。调用方传入一张或多张图片、直接获取结果,尽量避免关心内部实现(如用何种 backbone、预处理是什么、后处理是什么)。 - -```bash -$ cat flow-python/examples/simple_classification/lite.py -... - def inference(self, mat): - img = self.preprocess(mat, input_size=(224,224), scale_im = False, mean=[103.530, 116.280, 123.675], std=[57.375, 57.120, 58.395]) - - # 设置输入 - inp_data =self.net.get_io_tensor("data") - inp_data.set_data_by_share(img) - - # 推理 - self.net.forward() - self.net.wait() - - # 取输出 - output_keys = self.net.get_all_output_name() - output = self.net.get_io_tensor(output_keys[0]).to_numpy() - return np.argmax(output[0]) -... -$ python3 lite.py --model model.mge --path test.jpg # 测试 -2021-09-14 11:45:02.406 | INFO | __main__::81 - 285 -``` - -`285` 是分类模型最后一层的 argmax,对应含义需要查[ imagenet 数据集分类表](../../flow-python/examples/simple_classification/synset_words.txt) ,这里是 “Egyptian cat”(下标从 0 开始)。 - -## 配置计算图 -`flow-python/examples`增加`simple_classification/image_cpu.toml` - -```bash -$ cat flow-python/examples/simple_classification/image_cpu.toml -main = "tutorial_01_image" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["classify:inp"] }] # 一、输入输出结点 -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -connections = [ -] - - [[graphs.nodes]] # 二、结点参数 - name = "classify" - ty = "Classify" - path = "models/simple_classification_models/resnet18.mge" - device = "cpu" - device_id = 0 -... - [[graphs.nodes]] # 三、服务类型配置 - name = "source" - ty = "ImageServer" - port = 8084 # 端口号 8084 - response = "json" -... -``` -开发时直接从别处复制一个过来即可,图片单模型服务只需要关心 3 处 -* 计算图输入、输出结点的名字。这里是`classify` -* `classify` 结点的参数。最重要的是 `ty="Classify"`指明了类名,MegFlow 将在当前目录搜索`Classify`类。path/device/device_id 分别是模型路径/用 CPU 推理/用哪个核,属于用户自定义配置 -* 服务类型。这里想运行图片服务 `ty = "ImageServer"`,如果想运行视频解析服务改 `ty = "VideoServer"`;图片服务默认返回图片,想返回 string 需要配置 `response = "json"` - -[完整的计算图 config 定义](appendix-A-graph-definition.zh.md) - -## 实现配置中的 node - -创建文件`classify.py`,把之前实现的模型推理调起来即可 -```bash -$ cat flow-python/examples/simple_classification/classify.py -... -@register(inputs=['inp'], outputs=['out']) -class Classify: - def __init__(self, name, args): - ... - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - - data = envelope.msg['data'] - result = self._model.inference(data) - self.out.send(envelope.repack(json.dumps(str(result)))) -``` -实现只有 2 点: -* `__init__` 里加载模型,做个 warmup 防止首次推理太慢 -* 解码成 BGR 的 data 在 `envelope.msg['data']`,推理,send 返回 json string - -[classify.py 各参数说明](appendix-B-python-plugin.zh.md) - -## 运行测试 - -运行服务 -```bash -$ cd flow-python/examples -$ run_with_plugins -c simple_classification/image_cpu.toml -p simple_classification -``` - -### WebUI 方式 -浏览器打开 8084 端口服务(例如 http://127.0.0.1:8084/docs ),选择一张图“try it out”即可。 - -### 命令行方式 -```bash -$ curl http://127.0.0.1:8081/analyze/image_name -X POST --header "Content-Type:image/*" --data-binary @test.jpeg -``` - -`image_name` 是用户自定义参数,用在需要 POST 内容的场景。这里随便填即可;`test.jpeg` 是测试图片 - -### Python Client - -[图片 client 代码](../../flow-python/examples/misc/image_client.py) -```Python -import requests -import cv2 - -def test(): - ip = 'localhost' - port = '8084' - url = 'http://{}:{}/analyze/any_content'.format(ip, port) - img = cv2.imread("./test.jpg") - _, data = cv2.imencode(".jpg", img) - data = data.tobytes() - - headers = {'Content-Length': '%d' % len(data), 'Content-Type': 'image/*'} - res = requests.post(url, data=data, headers=headers) - print(res.content) - -if __name__ == "__main__": - test() -``` - -### 其他语言 -rweb/Swagger 提供了 http RESTful API 描述文件,例如在 http://127.0.0.1:8084/openapi.json 。`swagger_codegen` 可用描述文件生成 java/go 等语言的调用代码。更多教程见 [swagger codegen tutorial ](https://swagger.io/tools/swagger-codegen/)。 diff --git a/docs/how-to-add-my-service/02-single-det-classify.zh.md b/docs/how-to-add-my-service/02-single-det-classify.zh.md deleted file mode 100644 index 5d46f63..0000000 --- a/docs/how-to-add-my-service/02-single-det-classify.zh.md +++ /dev/null @@ -1,148 +0,0 @@ -# 串联检测和分类 - -本文将在 [tutorial01](01-single-classification-model.zh.md) 的基础上扩展计算图:先检测、再扣图分类。对外提供视频解析服务。完整的代码在 [simple_det_classify](../../flow-python/examples/simple_det_classify) 。 - -## 移除分类预处理 - -之前提到过:MegEngine 除了不需要转模型,还能消除预处理。我们修改 [dump.py](../../flow-python/examples/misc/dump_resnet.py) 把预处理从 SDK/业务代码提到模型内。这样的好处是:**划清工程和算法的边界**,预处理本来就应该由 scientist 维护,每次只需要 release mge 文件,减少交接内容 - -```Python -... - @jit.trace(capture_as_const=True) - def pred_func(data): - out = data.astype(np.float32) - - output_h, output_w = 224, 224 - # resize - print(shape) - M = mge.tensor(np.array([[1,0,0], [0,1,0], [0,0,1]], dtype=np.float32)) - M_shape = F.concat([data.shape[0],M.shape]) - M = F.broadcast_to(M, M_shape) - out = F.vision.warp_perspective(out, M, (output_h, output_w), format='NHWC') - # mean - _mean = mge.Tensor(np.array([103.530, 116.280, 123.675], dtype=np.float32)) - out = F.sub(out, _mean) - # div - _div = mge.Tensor(np.array([57.375, 57.120, 58.395], dtype=np.float32)) - out = F.div(out, _div) - # dimshuffile - out = F.transpose(out, (0,3,1,2)) - - outputs = model(out) - return outputs -... -``` -具体实现是在 trace inference 里增加预处理动作,fuse opr 优化加速的事情交给 MegEngine 即可。更多 cv 操作参照 [MegEngine API 文档](https://megengine.org.cn/doc/stable/zh/reference/api/megengine.functional.vision.warp_perspective.html?highlight=warp_perspective)。 - -因为推理输入变成了 BGR,所以 dump 模型的时候参数也应该跟着变 -```bash -$ python3 dump.py -a resnet18 -s 1 224 224 3 -``` - -## 准备检测模型 -这里直接用现成的 YOLOX mge 模型。复用 [cat_finder 的检测](../../flow-python/examples/cat_finder/det.py) 或者从 [YOLOX 官网](https://github.com/Megvii-BaseDetection/YOLOX/tree/main/demo/MegEngine/python) 下载最新版。 - -## 配置计算图 -`flow-python/examples` 增加 `simple_det_classify/video_cpu.toml` - -```bash -$ cat flow-python/examples/simple_det_classify/video_cpu.toml - -main = "tutorial_02" - -# 重资源结点要先声明 -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/simple_det_classify_models/yolox_s.mge" -interval = 5 -visualize = 1 -device = "cpu" -device_id = 0 - -[[nodes]] -name = "classify" -ty = "Classify" -path = "models/simple_det_classify_models/resnet18_preproc_inside.mge" -device = "cpu" -device_id = 0 - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -# 描述连接关系 -connections = [ - { cap = 16, ports = ["det:out", "classify:inp"] }, -] - -... -# ty 改成 VdieoServer - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8085 - -... -``` -想对上一期的配置,需要关注 3 点: -* 视频流中的重资源结点,需要声明在 `[[graphs]]` 之外,因为多路视频需要复用这个结点。如果每一路都要启一个 det 结点,资源会爆掉 -* `connections` 不再是空白,因为两个结点要描述连接关系 -* Server 类型改成 `VideoServer`,告诉 UI 是要处理视频的 - -## 实现细节 -* 可以看到此时 [resnet18 的 lite.py](../../flow-python/examples/simple_det_classify/lite.py) 已经删除了 preprocess 函数 -* det.py 可以直接用 `cat_finder` 的 - -## 运行测试 - -运行服务 -```bash -$ cd flow-python/examples -$ run_with_plugins -c simple_det_classify/video_cpu.toml -p simple_det_classify -``` - -### WebUI 方式 -浏览器打开 8085 端口服务(例如 http://127.0.0.1:8085/docs ) - -* 参照 [如何生成 rtsp](../how-to-build-and-run/generate-rtsp.zh.md),提供一个 rtsp 流地址 -* 或者干脆给 .mp4 文件的绝对路径(文件和 8085 服务在同一台机器上) - -### 命令行方式 -```bash -$ curl -X POST 'http://127.0.0.1:8085/start/rtsp%3A%2F%2F127.0.0.1%3A8554%2Ftest1.ts' # start rtsp://127.0.0.1:8554/test1.ts -start stream whose id is 2% -$ curl 'http://127.0.0.1:8085/list' # list all stream -[{"id":1,"url":"rtsp://10.122.101.175:8554/test1.ts"},{"id":0,"url":"rtsp://10.122.101.175:8554/test1.ts"}]% -``` -路径中的 `%2F`、`%3A` 是 [URL](https://www.ietf.org/rfc/rfc1738.txt) 的转义字符 - -### Python Client - -[视频 client 代码](../../flow-python/examples/misc/video_client.py) - -```Python - -import requests -import urllib - - -def test(): - ip = 'localhost' - port = '8085' - video_path = 'rtsp://127.0.0.1:8554/vehicle.ts' - video_path = urllib.parse.quote(video_path, safe='') - url = 'http://{}:{}/start/{}'.format(ip, port, video_path) - - res = requests.post(url) - ret = res.content - print(ret) - - -if __name__ == "__main__": - test() -``` diff --git a/docs/how-to-add-my-service/03-batching-and-pipeline-test.zh.md b/docs/how-to-add-my-service/03-batching-and-pipeline-test.zh.md deleted file mode 100644 index 4717135..0000000 --- a/docs/how-to-add-my-service/03-batching-and-pipeline-test.zh.md +++ /dev/null @@ -1,81 +0,0 @@ -# 批量推理和 Pipeline 级测试 - -本文将在 [tutorial02](02-single-det-classify.zh.md) 的基础上扩展功能:动态 batching 测试 QPS 提升。 - -## 分类模型支持动态 batch - -resnet 的 dump 需要支持多 batch 输入,样例 [dump_resnet.py](../../flow-python/examples/misc/dump_resnet.py) - -## 分类用 batch_recv 接口 - -新的 classify.py 改成这样: -```bash -$ cat flow-python/examples/simple_det_classify/classify.py -... - def exec(self): - # batching - (envelopes, _) = self.inp.batch_recv(self.batch_size, self.timeout) - - if len(envelopes) == 0: - return -... -``` -这里 `batch_recv` 的参数列表 - -| 类型 | 名称 | 含义 | -| ----- | ------ | ----- | -| 输入 | batch_size | 最多攒多少 batch | -| 输入 | timeout | 多少毫秒内返回 | -| 输出 | list | 一组消息,0 <= len(list) <= batch_size | -| 输出 | bool | 标识该端口是否已经关闭,当其值为 True 时,语义等同于 `recv` 接口返回的None | - - -然后在 Python 层合并 data,调 `inference_batch` -```Python -data = np.concatenate(crops) -types = self._model.inference_batch(data) -``` - -## Pipeline 级测试 -MegFlow 支持直接输入图片集/视频列表做测试,不需要 http 服务。使用方自行实现 Validation 结点,集成进 CI 做正确性/性能测试。 - -### 图片集测试 -以 [simple_classification image_test](../../flow-python/examples/simple_classification/image_test.toml) 为例 -```bash -... - [[graphs.nodes]] - name = "source" - ty = "ImageInput" - urls = ["/mnt/data/user/image/","/home/test_data_dir/"] -... -``` -pipeline 建图等不变,新增了一种 source 叫做 `ImageInput`,调用方填 `urls` 做图片目录列表。 - -运行方法不变 -```bash -$ run_with_plugins -c simple_classification/image_test.toml -p simple_classification -``` - -### 视频列表测试 -以 [simple_det_classify video_test](../../flow-python/examples/simple_det_classify/video_test.toml) 为例: -```bash -... - [[graphs.nodes]] - name = "source" - ty = "VideoInput" - repeat = 1 - urls = ["rtsp://127.0.0.1:8554/test.ts", "/mnt/data/file.mp4"] -... -``` - -建图同样不变,新增了 `VideoInput` 结点,参数列表 - -| 参数 | 含义 | -| ----- | ------ | -| urls | 视频 url 列表,流地址、本地文件皆可 | -| repeat | 每个 url 并行创建多少路。注意**如果是网络流,需要调用方考量带宽压力** | - -使用方法不变 -```bash -$ run_with_plugins -c simple_det_classify/video_test.toml -p simple_det_classify -``` diff --git a/docs/how-to-add-my-service/04-web-visualization.zh.md b/docs/how-to-add-my-service/04-web-visualization.zh.md deleted file mode 100644 index 0589882..0000000 --- a/docs/how-to-add-my-service/04-web-visualization.zh.md +++ /dev/null @@ -1,79 +0,0 @@ -# 视频结果 Web 可视化 - -## 依赖 -依赖 `ffmpeg` 命令,请确保已经安装并能正常运行。 - -## 部署图 - -![](../images/visualize_deployment.jpg) - -1)video input。可以是 rtsp server 或者视频文件,直接传绝对路径 - -2)MegFlow。解析视频,把渲染后的结果以 bgr24 格式发给下游 - -3)[LiveGo](https://github.com/gwuhaolin/livego) 用于把 raw_video 转为 flv 格式。引入 LiveGo 的原因: -* 浏览器无法直接播放 rtsp 流,推荐方案是 HLS 或 http-flv -* 播放端可能不止一个,需要流量转发服务 -* 生产环境中存储/点播功能是刚需,MegFlow 不具备此功能,应由其他服务完成 - -## 操作指南 - -1)下载启动 LiveGo -```bash -$ wget https://github.com/gwuhaolin/livego/releases/download/0.0.15/livego_0.0.15_linux_amd64.tar.gz && tar xvf livego_0.0.15_linux_amd64.tar.gz && ./livego & -... -INFO[2021-10-27T15:44:40+08:00] HLS server enable.... -INFO[2021-10-27T15:44:40+08:00] RTMP Listen On :1935 -INFO[2021-10-27T15:44:40+08:00] HTTP-API listen On :8090 -INFO[2021-10-27T15:44:40+08:00] HTTP-FLV listen On :7001 -... -``` - -| 端口号 | 说明 | -| --------- | ------ | -| 8090 | 管理端口,创建 room 返回 channel | -| 1935 | 上传端口,用 channel 拼接出上传 url | -| 7001 | 播放端口,用 room 拼接出播放地址 | - -2)自测视频推流、播放正常 - -假设测试视频是 demo.flv(建议长度超过 30 秒),使用 `push_video.py` 推流到 LiveGo -```bash -$ cd ${MegFlow_dir}/flow-python/examples/misc/visualize_client -$ python3 push_video.py -``` -浏览器打开 index.html,应能正常播放。 - -3)运行猫猫围栏可视化配置 - -猫猫围栏环境设置见 [ cat_finder README](../built-in-applications/cat_finder.md)。运行起 video 基础版后,能够运行video 可视化版本 - -```bash -$ cd ${MegFlow_dir}/flow-python/examples -$ run_with_plugins -c cat_finder/video_visualize.toml -p cat_finder -... -``` -浏览器打开 8002 端口,提供 rtsp 地址或视频文件绝对路径,try it out。 - -打开 index.html,应能播放可视化结果。 - -![](../images/visualize_result.jpg) - - -4)注意事项和常见问题 - -**播放地址** - -注意 index.html 播放地址不能有多余的 '/',例如 http://10.199.1.100/:7001/live/megflow-test.flv 是无法播放的。 - -**视频长度** - -测试视频建议超过 30s。至少有 2 个 I 帧,否则影响 flv 转换。 - -**视频尺寸** - -建议测试视频为标准 480p/720p/1080p。 - -**跨域问题** - -web client 修改自 [flv.js](https://github.com/bilibili/flv.js)。如果不用 index.html、直接浏览器打开原始 demo,需自行解决跨域问题。 diff --git a/docs/how-to-add-my-service/appendix-A-graph-definition.zh.md b/docs/how-to-add-my-service/appendix-A-graph-definition.zh.md deleted file mode 100644 index e42f2d2..0000000 --- a/docs/how-to-add-my-service/appendix-A-graph-definition.zh.md +++ /dev/null @@ -1,189 +0,0 @@ -# Config - -MegFlow 的建图描述文件使用 [toml](https://toml.io/en/) 格式。toml 注重人类可读性,学习难度约等于 markdown,看完下面 2 个例子大约就会写了。 - -## 图片范例 - -举个栗子,`cat_finder/image_gpu.toml`: - -```rust - // 完整的计算图的名字,叫啥都行 -main = "cat_finder_image" - -[[graphs]] -name = "subgraph" // 子图类型,叫啥都行。子图 == 自己写的业务 -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] // 子图入口在 det 节点的 inp 端口,队列长度是 16 -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] // 子图出口是 redis_proxy 的 out 端口 -connections = [ // 构图, A 的输出,连到 B 的输入 - { cap = 16, ports = ["det:out", "reid:inp"] }, // det 输出接到 reid 输入 - { cap = 16, ports = ["reid:out", "redis_proxy:inp"] }, // reid 输出送给 redis_proxy -] - - [[graphs.nodes]] // 子图节点声明。注意 4 个空格,表示和 [[graphs]] 的层次关系 - name = "det" // 找 examples/xxx/ 下面的 det.py 或者 det package - ty = "Detect" // 这个 node 执行 Detect class - model = "yolox-nano" // 自定义参数,yolox 模型构造需要 - conf = 0.25 // yolox 需要的 det 阈值 - nms = 0.45 // yolox 需要的 nms 阈值 - tsize = 640 // yolox 需要的 inference size - path = "models/yolox_nano.pkl" // yolox 模型相对路径 - - [[graphs.nodes]] // reid 和 det 同理 - name = "reid" - ty = "Reid" - thres = 1300 // 里面用拉普拉斯计算图像清晰度,阈值写的 1300 - path = "models/aligned_reid.pkl" - - [[graphs.nodes]] // 纯业务逻辑,name 和 ty 字段是必选,其他看需求 - name = "redis_proxy" - ty = "RedisProxy" - ip = "127.0.0.1" // redis ip 地址 - port = "6379" // redis port - mode = "save" // 控制此节点存特征进 redis - prefix = "feature." // redis key 的前缀,不然整个 redis 库乱乱的 - -[[graphs]] // 描述完整运行的计算图 -name = "cat_finder_image" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, // source 就是 swagger 这类 service,接收视频或图片用的。收到的数据(图像、视频、extra 字段)送进子图 - { cap = 16, ports = ["source:inp", "destination:out"] } // 子图处理完,把结果发给 http server -] - - [[graphs.nodes]] // http server 的配置 - name = "source" - ty = "ImageServer" // 这是个图片服务 - port = 8081 // 端口号 - response = "json" // response Content-Type 用 application/json。不写就是默认 image/jpeg - - [[graphs.nodes]] // dest 是自己写的业务子图 - name = "destination" - ty = "subgraph" // 子图类型。没事儿改它干啥 -``` - -对应可视化的计算图: - -![](../../flow-python/examples/cat_finder/images/image.png) - -## 视频范例 - -视频和图片的唯一区别:**重资源的节点要在子图之外声明** 。 - -MegFlow 设计上支持不同视频流跑不同业务。每创建 1 路视频就会创建 1 个子图,40 路视频就是 40 个。det/reid 这种很重的节点自然要被复用。 - -以`cat_finder/video_gpu.toml`为例: - -```rust -main = "cat_finder_video" // 完整计算图名字 - -[[nodes]] // det 节点在子图外声明 -name = "det" -ty = "Detect" -model = "yolox-tiny" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/yolox_tiny.pkl" -interval = 5 - -[[nodes]] // ReID 节点同样在外部声明,被共享 -name = "reid_video" -ty = "ReIDVideo" -path = "models/aligned_reid.pkl" - -[[nodes]] // redis_proxy 使用了连接池,也可以看作“重资源” -name = "redis_proxy" -ty = "RedisProxy" -ip = "127.0.0.1" -port = "6379" -mode = "search" -prefix = "feature." - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ // 描述连接关系 - { cap = 16, ports = ["det:out", "track:inp"] }, - { cap = 16, ports = ["track:out", "shaper:inp"] }, - { cap = 16, ports = ["shaper:out", "reid_video:inp"] }, - { cap = 16, ports = ["reid_video:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] // 给每个检测目标,赋予唯一的 ID - name = "track" - ty = "Track" - - [[graphs.nodes]] // 业务逻辑:ID 结束后,给个最优结果 - name = "shaper" - ty = "Shaper" - mode = "BEST" // 结果类型,目前只支持 "BEST" 最优 - - -[[graphs]] -name = "cat_finder_video" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" // 视频服务 - port = 8082 // 8081 做注册,8082 做解析 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" -``` - -视频解析服务可视化结果和图片接近: -![](../../flow-python/examples/cat_finder/images/video.png) - - -## 完整定义 -TL;DR - -严谨的描述文件定义如下: -```rust -// 节点间的连接channel -struct Connection { - cap: usize, // channel容量 - ports: Vec, // 连接的节点端口,格式是`节点名:端口名[:标签]` -} -// 有名channel -struct NamedConn { - name: String, // channel的名字 - cap: usize, // channel容量 - ports: Vec, // 连接的节点端口,格式是`节点名:端口名[:标签]` -} -// 节点定义 -struct Node { - name: String, // 节点名 - ty: String, // 节点类型 - cloned: usize, // 表示并行度,默认值为1 - res: Vec, // 引用的资源名字列表 - ... // 其他参数,会被透传到节点的构造函数中 -} -// 资源定义 -struct Resource { - name: String, // 资源名字 - ty: String, // 资源类型 - ... // 其他参数,会被透传到资源的构造函数中 -} - -struct Graph { - name: String, // 图的名字 - resources: Vec // 资源声明, 生命周期与该图绑定 - nodes: Vec, // 节点声明,生命周期与该图绑定 - inputs: Vec, // 图输入声明 - outputs: Vec, // 图输出声明 - connections: Vec, // 节点间连接声明 -} - -struct Config { - resources: Vec // 全局共享资源, 生命周期与整个应用绑定 - nodes: Vec, // 全局共享节点,生命周期与整个应用绑定 - graphs: Vec, // 图声明 - main: String, // 主图名字,及应用的进入点 -} -``` diff --git a/docs/how-to-add-my-service/appendix-B-python-plugin.zh.md b/docs/how-to-add-my-service/appendix-B-python-plugin.zh.md deleted file mode 100644 index 3cdef0d..0000000 --- a/docs/how-to-add-my-service/appendix-B-python-plugin.zh.md +++ /dev/null @@ -1,41 +0,0 @@ -# Python Plugins - -从一个最简单的例子开始 -``` -import megflow -@megflow.register(name="alias", inputs=["inp"], outputs=["out"]) -class Node: - def __init__(self, name, args): - pass - def exec(self): - envelope = self.inp.recv() - msg = dowith(envelope.msg) - self.out.send(envelope.repack(msg)) -``` - -这其中有三部分内容: register装饰器,Node的构造函数,Node的执行函数 - -1. register装饰器 - - name: 若指定,则register所修饰插件重命名为name,默认为register所修饰类的类名 - - inputs: Node的输入列表,每个输入`input`都可以在`exec`方法中,通过`self.input`访问, - - outputs: Node的输出列表,每个输出`output`都可以在`exec`方法中,通过`self.output`访问 - - exclusive: 默认为False, 调度模型是一个thread local的协程调度器, 若为True, 则将该任务安排到线程池中 - -2. Node的构造函数 - - name: 即参数文件中Node的name字段 - - args: 即参数文件中Node的剩余参数字段 - -3. Node的执行函数 - - 一个python插件的执行方法必须是命名为`exec`的零参成员方法 - - 对于在参数文件中该插件引用的资源`resource`, 可以在`exec`方法中,通过`self.resource`访问 - - 通过输入的`recv`方法取得输入消息,输入消息是`Envelope`对象,其`msg`成员即开发者真正需要读写的消息实例 - - `Envelope`语义为在图中流转的消息的相关信息,由于这些信息需要在图中被传递,所以开发者应该保持消息与`Envelope`的对应关系 - - 若一个`Envelope`携带的消息被拆分为多个消息,或者转换为另一个消息,应该通过`Envelope`的`repack`方法,将`Envelope`与消息关联起来 - - 通过输出的`send`方法发送输出消息,输出消息是`Envelope`对象 - -MegFlow也提供了一系列异步工具 -1. `yield_now()`, 让出当前任务的执行权 -2. `sleep(dur)`, 使当前任务沉睡`dur`毫秒 -3. `join(tasks)`, `tasks`参数是一个函数列表,`join`堵塞直到`tasks`中的函数都执行完毕 -4. `create_future(callback)`, `callback`参数是一个函数, 默认值为None,`create_future`返回一个`(Future, Waker)`对象 - - `Future::wait`, 堵塞直到`Waker::wake`被调用,返回`Waker::wake(result)`传入的`result`参数 diff --git a/docs/how-to-build-and-run/build-from-source.zh.md b/docs/how-to-build-and-run/build-from-source.zh.md deleted file mode 100644 index cb7ae4f..0000000 --- a/docs/how-to-build-and-run/build-from-source.zh.md +++ /dev/null @@ -1,107 +0,0 @@ -# Building from Source - -## 一、安装依赖 - -### 安装 Rust -```bash -$ sudo apt install curl -$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh -``` - -成功后,`cargo` 应该可以正常执行 -```bash -$ cargo --version -cargo 1.53.0 (4369396ce 2021-04-27) -``` - -如果不成功,提示`Command 'cargo' not found`,可以按照提示加载一下环境变量(重新连接或打开终端也可以): -``` -source $HOME/.cargo/env -``` - -> `cargo` 是 Rust 的包管理器兼编译辅助工具。类似 Java maven/go pkg/C++ CMake 的角色,更易使用。 - -### 安装 python3.x (推荐 conda) - -打开 [miniconda 官网](https://docs.conda.io/en/latest/miniconda.html) 下载 miniconda 安装包,修改权限并安装。 - -```bash -$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -$ chmod a+x Miniconda3-latest-Linux-x86_64.sh -$ ./Miniconda3-latest-Linux-x86_64.sh -``` - -安装时接受 conda 修改默认 .bashrc 环境变量(zsh 用户还需自行修改 .zshrc 中的 conda initialize 配置)。成功后 `conda` 可正常运行 -```bash -$ conda --version -conda 4.10.3 -``` - -创建一个 Python3.x(这里以 3.8 为例) 的环境,激活。 -```bash -$ conda create --name py38 python=3.8 -$ conda activate py38 -``` - - -## 二、编译 - -MegFlow 需要编译 ffmpeg。考虑到 ffmpeg 依赖较多、本身又是常用工具,最简单的办法就是直接装 ffmpeg 把编译依赖装上 - -```bash -$ sudo apt install yasm git build-essential ffmpeg -$ ffmpeg -ffmpeg version 3.4.8... -$ sudo apt install clang -$ clang --version -clang version 6.0.0-1ubuntu2... -``` - -编译底层 Rust 组件,安装 Python module - -```bash -$ git clone --recursive https://github.com/MegEngine/MegFlow --depth=1 -$ cd MegFlow -$ cargo build -waiting ... -$ cd flow-python -$ python3 setup.py install --user -``` - -P.S. 默认 ffmpeg 依赖自动从 github 上拉取源码构建,这会使得首次构建的时间较长。若希望缩短首次构建时间,或者希望依赖一个指定版本的 ffmpeg,可以启用环境变量`CARGO_FEATURE_PREBUILD`并参考[rust-ffmpeg](https://github.com/zmwangx/rust-ffmpeg/wiki/Notes-on-building)自行构建 - -## 三、Python“开机自检” -```bash -$ cd examples -$ cargo build --example run_with_plugins --release # 编译出 megflow bin -$ ln -s ../../target/release/examples/run_with_plugins -$ ./run_with_plugins -p logical_test -``` -`logical_test` 是 examples 下最基础的计算图测试用例,运行能正常结束表示 MegFlow 编译成功、基本语义无问题。 - -`run_with_plugins` 是计算图的实现。编译完成之后不再需要 `cargo` 和 `Rust`,使用者只需要 - - * `import megflow`成功 - * `run_with_plugins -h` 正常 - - -## 四、Python Built-in Applications - -接下来开始运行好玩的 Python 应用 - -* [猫猫围栏运行手册](../built-in-applications/cat_finder.md) - * 图片注册猫猫 - * 部署视频围栏,注册的猫离开围栏时会发通知 - * 未注册的不会提示 -* [电梯电瓶车告警](../built-in-applications/electric_bicycle.md) - * 电梯里看到电瓶车立即报警 - -## 五、其他选项 -```bash -$ cargo run --example graph -- ${args} # 测试 MegFlow 的延迟/吞吐/调度开销, 更多使用说明通过--help 查看 -$ cargo run --example run_with_plugins -- ${args} # 基于插件 + 参数文件形式运行 MegFlow, 更多说明通过--help 查看 -$ export RUST_LOG=LOG_LEVEL // 设置日志级别, 例如 INFO, TRACE.. -$ cargo build [--release] // 编译 -$ cargo check // 快速编译,不执行 link -$ cargo test [target] // 执行单元测试 -``` diff --git a/docs/how-to-build-and-run/build-on-aarch64.zh.md b/docs/how-to-build-and-run/build-on-aarch64.zh.md deleted file mode 100644 index 782ed86..0000000 --- a/docs/how-to-build-and-run/build-on-aarch64.zh.md +++ /dev/null @@ -1,103 +0,0 @@ -# aarch64 源码编译 - -## 一、测试环境 -华为鲲鹏 ARM 服务器,centOS 7.9 - -## 二、环境安装 -**gcc 需要 >= 7.5 版本,默认的 `aarch64-redhat-linux-gcc 4.8.5` 缺 `__ARM_NEON` 没法用** -```bash -$ yum install -y centos-release-scl -$ yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ -$ source /opt/rh/devtoolset-8/enable -$ gcc --version -gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3) -... -``` - -### 安装 Rust -```bash -$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh -``` - -成功后,`cargo` 应该可以正常执行 -```bash -$ cargo --version -cargo 1.53.0 (4369396ce 2021-04-27) -``` - -> `cargo` 是 Rust 的包管理器兼编译辅助工具。类似 Java maven/go pkg/C++ CMake 的角色,更易使用。 - -### 安装 python3.x (推荐 conda) - -打开 [miniconda 官网](https://docs.conda.io/en/latest/miniconda.html) 下载 miniconda 安装包,修改权限并安装。 - -```bash -$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -$ chmod a+x Miniconda3-latest-Linux-x86_64.sh -$ ./Miniconda3-latest-Linux-x86_64.sh -``` - -安装时接受 conda 修改默认 .bashrc 环境变量(zsh 用户还需自行修改 .zshrc 中的 conda initialize 配置)。成功后 `conda` 可正常运行 -```bash -$ conda --version -conda 4.10.3 -``` - -创建一个 Python3.x(这里以 3.8 为例) 的环境,激活。 -```bash -$ conda create --name py38 python=3.8 -$ conda activate py38 -``` - - -## 三、编译 - -编译底层 Rust 组件,安装 Python module - -```bash -$ git clone --recursive https://github.com/MegEngine/MegFlow --depth=1 -$ cd MegFlow -$ cargo build -waiting ... -$ cd flow-python -$ python3 setup.py install --user -``` - -P.S. 默认 ffmpeg 依赖自动从 github 上拉取源码构建,这会使得首次构建的时间较长。若希望缩短首次构建时间,或者希望依赖一个指定版本的 ffmpeg,可以启用环境变量`CARGO_FEATURE_PREBUILD`并参考[rust-ffmpeg](https://github.com/zmwangx/rust-ffmpeg/wiki/Notes-on-building)自行构建 - - -## 四、Python“开机自检” -```bash -$ cd examples -$ cargo build --example run_with_plugins --release # 编译出 megflow bin -$ ln -s ../../target/example/run_with_plugins -$ ./run_with_plugins -p logical_test -``` -`logical_test` 是 examples 下最基础的计算图测试用例,运行能正常结束表示 MegFlow 编译成功、基本语义无问题。 - -`run_with_plugins` 是计算图的实现。编译完成之后不再需要 `cargo` 和 `Rust`,使用者只需要 - - * `import megflow`成功 - * `run_with_plugins -h` 正常 - - -## 五、Python Built-in Applications - -接下来开始运行好玩的 Python 应用 - -* [猫猫围栏运行手册](../built-in-applications/cat_finder.md) - * 图片注册猫猫 - * 部署视频围栏,注册的猫离开围栏时会发通知 - * 未注册的不会提示 -* [电梯电瓶车告警](../built-in-applications/electric_bicycle.md) - * 电梯里看到电瓶车立即报警 - -## 六、其他选项 -```bash -$ cargo run --example graph -- ${args} # 测试 MegFlow 的延迟/吞吐/调度开销, 更多使用说明通过--help 查看 -$ cargo run --example run_with_plugins -- ${args} # 基于插件 + 参数文件形式运行 MegFlow, 更多说明通过--help 查看 -$ export RUST_LOG=LOG_LEVEL // 设置日志级别, 例如 INFO, TRACE.. -$ cargo build [--release] // 编译 -$ cargo check // 快速编译,不执行 link -$ cargo test [target] // 执行单元测试 -``` diff --git a/docs/how-to-build-and-run/build-on-win10.zh.md b/docs/how-to-build-and-run/build-on-win10.zh.md deleted file mode 100644 index 6ea40f5..0000000 --- a/docs/how-to-build-and-run/build-on-win10.zh.md +++ /dev/null @@ -1,50 +0,0 @@ -# Build on win10 - -## 下载模型包 -docker 运行方式,建议把模型包下好,解压备用。[下载地址](../download-models.zh.md) - -## 安装 wsl2 - -[安装文档](https://docs.microsoft.com/zh-cn/windows/wsl/install-win10) 已经非常详细,核心是安装 Linux 内核更新包。完成后第 6 步中的 Linux 分发应该可以正常运行。 - -## 安装 docker -下载 [windows docker 客户端](https://www.docker.com/products/docker-desktop) 并安装。docker 依赖 wsl2,Docker Desktop 启动正常没有报 fail 即可。 - -## 安装 git - -下载安装 [git 客户端](https://git-scm.com/downloads) 并运行 Git Bash。 - -```bash -$ pwd -/c/Users/username -$ cd /d # 切换到合适的盘符 -$ git clone https://github.com/MegEngine/MegFlow -... -$ cd MegFlow -$ docker build -t megflow . -... # 等待镜像完成,却决于网络和 CPU -``` -> 注意:**不要移动 Dockerfile 文件的位置**。受 [EAR](https://www.federalregister.gov/documents/2019/10/09/2019-22210/addition-of-certain-entities-to-the-entity-list) 约束,MegFlow 无法提供现成的 docker 镜像,需要自己 build 出来,这个过程用了相对路径。 - -## 运行 - -```bash -$ docker images -REPOSITORY TAG IMAGE ID CREATED SIZE -megflow latest c65e37e1df6c 18 hours ago 5.05GB -``` -直接用 ${IMAGE ID} 进入开始跑应用,挂载上之前下载好的模型包 -```bash -$ docker run -p 18081:8081 -p 18082:8082 -v ${DOWNLOAD_MODEL_PATH}:/megflow-runspace/flow-python/examples/models -i -t c65e37e1df6c /bin/bash -``` - -## Python Built-in Applications - -MegFlow 需要的编译运行环境已完成,接下来开始运行好玩的 Python 应用 - -* [猫猫围栏运行手册](../built-in-applications/cat_finder.md) - * 图片注册猫猫 - * 部署视频围栏,注册的猫离开围栏时会发通知 - * 未注册的不会提示 -* [电梯电瓶车告警](../built-in-applications/electric_bicycle.md) - * 电梯里看到电瓶车立即报警 diff --git a/docs/how-to-build-and-run/build-with-docker.zh.md b/docs/how-to-build-and-run/build-with-docker.zh.md deleted file mode 100644 index 4841c74..0000000 --- a/docs/how-to-build-and-run/build-with-docker.zh.md +++ /dev/null @@ -1,35 +0,0 @@ -# Building with docker - -MegFlow 提供了 [Dockerfile](../../Dockerfile),能够“可复现地”生成运行环境、减少依赖缺失的痛苦 - -## 下载模型包 -docker 运行方式,建议把模型包下好,解压备用。[下载地址](../download-models.zh.md) - -## 编译 Docker 镜像 - -```bash -$ cd MegFlow -$ docker build -t megflow . -``` -稍等一段时间(取决于网络和 CPU)镜像构建完成并做了基础自测 -> 注意:**不要移动 Dockerfile 文件的位置**。受 [EAR](https://www.federalregister.gov/documents/2019/10/09/2019-22210/addition-of-certain-entities-to-the-entity-list) 约束,MegFlow 无法提供现成的 docker 镜像,需要自己 build 出来,这个过程用了相对路径。 -```bash -$ docker images -REPOSITORY TAG IMAGE ID CREATED SIZE -megflow latest c65e37e1df6c 18 hours ago 5.05GB -``` -直接用 ${IMAGE ID} 进入开始跑应用,挂载上之前下载好的模型包 -```bash -$ docker run -p 18081:8081 -p 18082:8082 -v ${DOWNLOAD_MODEL_PATH}:/megflow-runspace/flow-python/examples/models -i -t c65e37e1df6c /bin/bash -``` - -## Python Built-in Applications - -接下来开始运行好玩的 Python 应用 - -* [猫猫围栏运行手册](../built-in-applications/cat_finder.md) - * 图片注册猫猫 - * 部署视频围栏,注册的猫离开围栏时会发通知 - * 未注册的不会提示 -* [电梯电瓶车告警](../built-in-applications/electric_bicycle.md) - * 电梯里看到电瓶车立即报警 diff --git a/docs/how-to-build-and-run/generate-rtsp.zh.md b/docs/how-to-build-and-run/generate-rtsp.zh.md deleted file mode 100644 index de17ddf..0000000 --- a/docs/how-to-build-and-run/generate-rtsp.zh.md +++ /dev/null @@ -1,77 +0,0 @@ -# 创建 rtsp 流地址 - -## 视频解析概要 -![workflow](./workflow.png) -1. 前端采集。录制的视频需要用 `ffmpeg` 转到 .ts/.h264/.h265 格式,**不能直接推 .mp4** -2. 推流。`ffmpeg` 命令发数据包给流服务器 -3. 流服务器。github 有许多开源实现 - - |project|language|优点|缺点| - |-|-|-|-| - |[rtsp-simple-server](https://github.com/aler9/rtsp-simple-server) | Golang | 编译部署方便,yaml配置灵活 | 不支持转码 | - |[livego](https://github.com/gwuhaolin/livego) | Golang |编译部署方便、yaml配置灵活、支持转码 | 文档较少 | - |[Live555](https://github.com/rgaufman/live555)| C++ | 功能十分强大,作为本地视频流服务器很方便 | 接受外部流需二次开发、文档较少 | - |[EasyDarwin](https://github.com/EasyDarwin/EasyDarwin)| Golang | 国产开源,功能强大, 具备web管理平台、录像检索回放功能 | 直播业务适合,小项目过于沉重 | - - 本文使用 `rtsp-simple-server` 作为样例 -4. MegFlow 拉流 -5. MegFlow 解码、解析 - -本文只说明 1~3 如何推流。 - -## 配置流服务器 - -下载 [rtsp-simple-server](https://github.com/aler9/rtsp-simple-server/releases/tag/v0.17.2) 并启动 - -```bash -$ wget https://github.com/aler9/rtsp-simple-server/releases/download/v0.17.2/rtsp-simple-server_v0.17.2_linux_amd64.tar.gz -$ -$ tar xvf rtsp-simple-server_v0.17.2_linux_amd64.tar.gz && ./rtsp-simple-server -... -2021/08/19 18:08:00 I [0/0] [RTSP] TCP listener opened on :8554 -... -``` - -## 笔记本推本地视频文件 - -如果是手机录制的 .mp4,先转成 .ts。移除音频(可选)。 -```bash -$ ffmpeg -i test.mp4 -s 640x480 -q:v 2 -vcodec copy -an test.ts -``` - -推 .ts 文件上去 -```bash -$ ffmpeg -re -stream_loop -1 -i test.ts -c copy -f rtsp rtsp://127.0.0.1:8554/test -``` - -## 笔记本推本地摄像头 -```bash -ffmpeg -framerate 25 -video_size 640x480 -i /dev/video0 -vcodec h264 -f rtsp rtsp://127.0.0.1:8554/test -``` - -参数说明 -| 选项 | 含义 | -| - | - | -| -framerate | 每秒帧数量(FPS) | -| -video_size | 采集视频宽高 | -| -i | 设备文件描述符 | -| -f | format格式,如 rtsp/flv 等 | -| -q:v | 图像品质,2 表示最好 | -| -an | 移除音频 | -| -vcodec copy | 拷贝流 | - -## 树莓派实时推流 -1. 参照[官方文档](https://www.raspberrypi.org/documentation/accessories/camera.html),推流前检查摄像头是否正常运行 - -2. ffmpeg推流 -```bash -ffmpeg -framerate 25 -video_size 640x480 -i /dev/video0 -vcodec h264 -f rtsp rtsp://127.0.0.1:8001/test -``` - -3. 常见问题 - * ffmpeg 进程被 kill: ```Out of memory: killed process: pid``` GPU显存不足导致,树莓派最多支持设置 512M 显存 - * USB camera 推流卡顿、帧率低。应该换树莓派专用 camera - -## 检查流地址是否可用 - -打开 VLC 媒体播放器 - “网络串流”,地址输入“rtsp://127.0.0.1:8554/test”正常播放即可。 \ No newline at end of file diff --git a/docs/how-to-build-and-run/run-in-15-minutes.zh.md b/docs/how-to-build-and-run/run-in-15-minutes.zh.md deleted file mode 100644 index 81f46ce..0000000 --- a/docs/how-to-build-and-run/run-in-15-minutes.zh.md +++ /dev/null @@ -1,80 +0,0 @@ -# Run in 15 minutes - -## 安装 python3.x (推荐 conda) - -打开 [miniconda 官网](https://docs.conda.io/en/latest/miniconda.html) 下载 miniconda 安装包,修改权限并安装。 - -```bash -$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -$ chmod a+x Miniconda3-latest-Linux-x86_64.sh -$ ./Miniconda3-latest-Linux-x86_64.sh -``` - -安装时接受 conda 修改默认 .bashrc 环境变量(zsh 用户还需自行修改 .zshrc 中的 conda initialize 配置)。成功后 `conda` 可正常运行 -```bash -$ conda --version -conda 4.10.3 -``` - -创建一个 Python3.x(这里以 3.8 为例) 的环境,激活。 -```bash -$ conda create --name py38 python=3.8 -$ conda activate py38 -``` - -## 安装 Prebuilt 包 - -打开 [release 页面](https://github.com/MegEngine/MegFlow/releases)下载对应 python 版本的 .whl 包,安装 -```bash -$ python3 -m pip install megflow-0.1.0-py38-none-linux_x86_64.whl --force-reinstall -``` - -完成后应该可以 `import megflow` -```bash -$ python3 -Python 3.8.3 (default, May 19 2020, 18:47:26) -[GCC 7.3.0] :: Anaconda, Inc. on linux -Type "help", "copyright", "credits" or "license" for more information. ->>> import megflow -``` - -.whl 提供了 `run_with_plugins`命令,某些环境可能要`export PATH=~/.local/bin/:${PATH}` - -```bash -$ apt install build-essential -y -$ run_with_plugins -h -run_with_plugins 1.0 -megvii -... -``` - -## Python“开机自检” - -```bash -$ cd ${MegFlow_PATH}/flow-python/examples # 这行必须 -$ run_with_plugins -p logical_test -``` - -`logical_test` 是 examples 下最基础的计算图测试用例,运行能正常结束表示 MegFlow 编译成功、基本语义无问题。 - -此处常见问题:`error while loading shared libraries: libpython3.8.xxx`。如果使用 conda 只需要 -```bash -$ export LD_LIBRARY_PATH=`conda info --base`/pkgs/python-3.8.11-xxx/lib:${LD_LIBRARY_PATH} -``` -`run_with_plugins` 是计算图的实现。使用者不需要关心 Rust/cargo,只需要 - - * `import megflow` 成功 - * `run_with_plugins -h` 正常 - -> 工作原理:[megflow](../../flow-python/megflow/__init__.py) 仅是一层接口,由 run_with_plugins “注入”建图/调度/优化等实现。 - -## Python Built-in Applications - -接下来开始运行好玩的 Python 应用 - -* [猫猫围栏运行手册](../built-in-applications/cat_finder.md) - * 图片注册猫猫 - * 部署视频围栏,注册的猫离开围栏时会发通知 - * 未注册的不会提示 -* [电梯电瓶车告警](../built-in-applications/electric_bicycle.md) - * 电梯里看到电瓶车立即报警 diff --git a/docs/how-to-build-and-run/workflow.png b/docs/how-to-build-and-run/workflow.png deleted file mode 100644 index 18ce7adbb0487feac501bbd00ee4670776a9c976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30067 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 diff --git a/docs/how-to-contribute.zh.md b/docs/how-to-contribute.zh.md deleted file mode 100644 index 1d81c3a..0000000 --- a/docs/how-to-contribute.zh.md +++ /dev/null @@ -1,63 +0,0 @@ -# 如何提交代码 - -## 一、fork 分支 -在浏览器中打开 [MegFlow](https://github.com/MegEngine/MegFlow), `fork` 到自己的 repositories,例如 -``` -https://github.com/user/MegFlow -``` - -clone 项目到本地,添加官方 remote 并 fetch: -``` -$ git clone https://github.com/user/MegFlow && cd MegFlow -$ git remote add megvii https://github.com/MegEngine/MegFlow -$ git fetch megvii -``` -对于 `git clone` 下来的项目,它现在有两个 remote,分别是 origin 和 megvii - -``` -$ git remote -v -origin https://github.com/user/MegFlow (fetch) -origin https://github.com/user/MegFlow (push) -megvii https://github.com/MegEngine/MegFlow (fetch) -megvii https://github.com/MegEngine/MegFlow (push) -``` -origin 指向你 fork 的仓库地址;remote 即官方 repo。可以基于不同的 remote 创建和提交分支。 - -例如切换到官方 master 分支,并基于此创建自己的分支(命名尽量言简意赅。一个分支只做一件事,方便 review 和 revert) -``` -$ git checkout MegEngine/master -$ git checkout -b my-awesome-branch -``` - -或创建分支时指定基于官方 master 分支: -``` -$ git checkout -b fix-typo-in-document MegFlow/master -``` - -> `git fetch` 是从远程获取最新代码到本地。如果是第二次 pr MegFlow `git fetch megvii` 开始即可,不需要 `git remote add megvii`,也不需要修改 `github.com/user/MegFlow`。 - -## 二、代码习惯 -为了增加沟通效率,reviewer 一般要求 contributor 遵从以下规则 - -* 不能随意增删空行 -* tab 替换为 4 个空格 -* 若是新增功能或平台,需有对应测试用例 -* 文档放到`docs`目录下,中文用`.zh.md`做后缀;英文直接用`.md`后缀 - -开发完成后提交到自己的 repository -``` -$ git commit -a -$ git push origin my-awesome-branch -``` -推荐使用 [`commitizen`](https://pypi.org/project/commitizen/) 或 [`gitlint`](https://jorisroovers.com/gitlint/) 等工具格式化 commit message,方便事后检索海量提交记录 - -## 三、代码提交 -浏览器中打开 [MegFlow pulls](https://github.com/MegEngine/MegFlow/pulls) ,此时应有此分支 pr 提示,点击 `Compare & pull request` - -* 标题**必须**是英文。未完成的分支应以 `WIP:` 开头,例如 `WIP: fix-typo` -* 正文宜包含以下内容,中英不限 - * 内容概述和实现方式 - * 功能或性能测试 - * 测试结果 - -回到浏览器签署 CLA,所有 CI 测试通过后通知 reviewer merge 此分支。 \ No newline at end of file diff --git a/docs/how-to-debug.zh.md b/docs/how-to-debug.zh.md deleted file mode 100644 index 4a291df..0000000 --- a/docs/how-to-debug.zh.md +++ /dev/null @@ -1,12 +0,0 @@ -# 如何 Debug 常见问题 - -一、`run_with_plugins` 无法启动服务,直接 core dump 报错退出 - -如果“Python 开机自检”的 `run_with_plugins -p logical_test` 能够正常结束,排查方向应该是 Python import error。调试方法举例 -```bash -$ gdb --args ./run_with_plugins -c electric_bicycle/electric_bicycle_cpu.toml -p electric_bicycle -... -illegal instruction -... -``` -可以看到 crash 发生在哪个 import \ No newline at end of file diff --git a/docs/how-to-pack-python-whl.zh.md b/docs/how-to-pack-python-whl.zh.md deleted file mode 100644 index ce255b9..0000000 --- a/docs/how-to-pack-python-whl.zh.md +++ /dev/null @@ -1,18 +0,0 @@ -# 打包成 Python .whl -## 作用 -打成 whl 包,使用方直接安装即可,不再需要编译。 - -## 依赖 -相关 Rust/Python 环境得 Ready,见[源码编译文档](how-to-build-and-run/build-from-source.zh.md)。 - -## 执行 -所有命令都已写好,复制执行即可。最终安装包都在 `dist` 目录 -```bash -$ cd ${MegFlow_PATH}/flow-python/ -$ cat gen_whl.sh -... -$ ls -alh dist/ -... -``` - -> 运行完要确认 `ldd` 链接的 libpython.so 版本是否正确 \ No newline at end of file diff --git a/docs/images/visualize_deployment.jpg b/docs/images/visualize_deployment.jpg deleted file mode 100644 index 497f3c06d0b8fcfff36d89d3dfdf2b494a2f7ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26358 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⪚<5Srw?3FLSL$klx<}b+MneLi$&!U zgx+jwSetbw=5aZe_g~VwP*5skbNKkS`FLl8)vOUY%9Q6syFLyfgQJJpNW5KstfjJx z!^de8u-=ZW4U?Q%EZipPToYuri-~VKnPwVHs35oV@KHm7M_*&T-H;yh=u5DFL8o2E z%IDBM&hqWHhJqhwt#?F6A$E<{5L8)2%T6_2fIygbm973^W~ERDp~8Lz^Rb<;;mEf&hz2{^AWDd{aZlP zmV|J-fhB>4YYAP*Mc*EqpGmBF@V3*awe`cGiUfcEGVwF%#kaygo3bI8l5;>5b!H@&)y; z_M{4=pb$FwI^V~=U!R3AD-uw2RDjlbTqHN{Yt3HV3`f*x55gc_DYW2xErqTlJ1_!G zdue9@S$JoiCzmtN(tz8IEBbG4{wJ=J(eHy81)QG&tPkS;M&J9EHNV)$^fQO9M3PN# z)s4+KYl-Ypc;sxyN@Yvph)+A;uC(IB83orn3zM*>YLrn=*KzU16LU~?W74nupM2hV zwj!|Of=Wpa;b}FS%s0M8bZ1)Yil?w??j(fl_eb=Nd~0~bsY6FWb zeoVyw*;Z$MZbmm+u^_4|ziLt7=T@TxnZea=xpYt_IeFBn=f(DymIK32010sSU3-KL z+ycIdxBc3X9%p@9-Ek6L9%t!%CvsHx&cxJ?m0o~&u5Dp-jj&Jo)}RL94sdA+Km=i>)mD&7;hw?ub6?U3BI zWF&FJl5o8u{iF_R@<%8ufTZu{0C2MXI4nB^o>zXBt|lG6atrVx>HuLUuT%=MI}ZYy z-%B>#TVh#E-mtx49{s-LCH+%&f57!_yGLUE`;SES-YX)9ubvUHO-$Iuj_K##-nn~I z7PB$7i zC|`C=`eTS=L4sIbu5+DB!%39Uf{g=XLfx&=9JZ*{4U$~3YpewZz3%|PB6#=sofD`gSuO`bIQ8o zuf{B<%Ve;1c;F??T{UOA*$v`?i4(D!9Eu4x587PjU=K$Xij5!ILUcX;$u7fGQFIfD zdE_7LKCl2G!p|+B+>Dk9pOQ&->>TC?AjbXX0{ZZwORCBU6<>=N$cH%|4o~wrz{aZU z{3cBd^eT{@fvFJXU#`g=`NPP^u`4R$67DM6^JU_+I1X12>oJ_&)5{+5Bt&T{6SJ~G z*s+=9%%~*_Ze^Qp*GbNSKba!^GnGZ(vWHoh=j5Y0biSxZ4;{rrRuTpBgbLJu>+In; z%;?xaXvu-=r3CmD)$;r=eB4Hf5g%dDXV&CMRZIOw?YAk=Qu~LSSov`#i$Eo<8Vbs! zq>Atv;aMgIKJ>eT}q796p$LhNesm z`DrOw3?Kz@W#PNzY9|clY+BAe%vw_`o|I(JP#t(!N4s_K`4e^?}#&t z`y)c078;g*oT4n-uw|#)9A!Z_e#U{jGEJGSq0zAgER8cJ;V{oy9fmo65`uA6Y&6eJ z9i4y<<{H>kUxPkDSR+5qg16!|cxLy_d!g2_v35gYU}E7ABSi9ZCT*jVY1%-zDQ&N^ zoJ7;Bo|$@Ypsjg#*g+rbeqyKJikmZDUVUOoIuI;&2DZ(h>oQT&Mb zeX6lKRfzvEyn^_}*piWX&O5a5ggY=p__>wFv9Bjp(%HjSA*zu_q1tIZ8%Hj6G& zb(37>4`hq~p&Lt&&Ilg_3oSKPpIfsS$|Qop@Ll+|K$Y>Ym5(tDDQn~+YtobpYEb^F zKn)Xxz*o^_6$hw1H%LsN6V^(@Ej^Vr)|B^87o%#spc!vuj0L5K^_%25a6e~+@oT%; zakmPCFm%2cmBCBaRNy9HE~A7yC6)TK`xTW`+>= zyy^BzY?a$x9WM?gy;&K2TkfrGU26Nnchl30bj+}vF)5n+>z^jUzOn>bj=jc|rF`Dj zP{nD88;1;;wLu2GfKU~y9EgVv`BrZ@J8bM{O_JG3)e5(I$pJ~yqnhKUui06F$Qt72 z(?=*nVg23K`GG3if|Ea7jH~r)`X7`lBa5KJTZ<~qS{5(ER_P`{DOs{yYz5F#xAvvk za4A*>Y1XqIj(vhQ!hXq$uKgHsJf2cl�nHsKbakei0LeKp6ZJK=2a%sN6=GWrrv8 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 Gtqih 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ⅇ~QOLF9((AR}@o|sudt#OC%miWVDe(C4OIp4D>T3luZMvfP33282? zsOmnc6zmCg;Xj*;(HNZcdKzCTs}Vd~NMjOIB(D6S>r8IF_usr?#`M%g)d0=K2z3ie z{{WJ>;P||(OKHv*=J1rniSjPXR?(&X;Q&1#?Ii_B-_Q3l<~NIM^4#z}GdDMdI5&YB z$l+qc&(HiCYw#&O2FA>%3OwkUDOf3@D2O>O55#lSsJaHSDEcNriY*zvKb$q3*0;?R z=)+m07hQ=V0w&=EeiW#HlMlnr6vZcD8PW38v)SKA*UuX|Isby2f>C8RxPoIS{_nei zirE+qZr#0TgK)k9Q)|efA#axlv(pxtWCL1qK8P~Im`4fzFrymZ{Y=KzUEfr2;AUlx z83XVUxV)L2Ddy|`g^;|{#5A$Tl*nF!pgNAY>keeLturzZ5aD`ZGw4o3HJz+xN+VFy z1^e+Jv9~;ALYuN3Tf=`0*LLiR@X28tgvL$3p!SO48f{j4_{3iNGBB?OfAPnr=_NLq zPc4?FhS;o~=U?QQGD!zYT<8sqUpQ}eoQ1W^`31yCB9e{Jn8(}i0J=6ZV8r;WwxKIq z?|Sg>F?TqD{imkW@0t)BPLatGIYdu`45KF7_sBndyEnfJYs=&2Si(I0{y}4BNv-Dt zdBoSlEfmixqR#j9dVlgS@MC8*jBolvw*P`7tFdpH+XRe&BW7egI!B-&R>4)?C9HN1~-b`r{AVIplFzHmwVz&5%x$b$5?k*y|xHzoR%;?g||TP5M(jHPndRp9H?! z?RC;=MuhQ5s=hdWp^j48FTwJgQFpM{+TDZw249}>@jA%w#_FatMFOsK4}79AGfq1 z!AoW?8k1`xfceurhz;bX+}<52x}8xkppn!%ZXI%|V`fmAYwLf=$fkmI|^KY>tqk3_P z?&re`@ru5vR`IeVrUJql%3y5Q;o?RiMRyv^+VFd$9J}xVzmWqmT+cx55t_HZdC|8s ziF0UIh47g;z|5eRGSAtmAY?nO4@5aT82%vQbPjL)M!DgxhOcscf59~ptTixjR<(RW zC&F;^eE}EbK4ES1ji&3kn@BMuyEAUUjT0Vf7ShRg_w-WvQ)h2g|ajK1`^r3F9;kh)bedx9iwk;bYKs=U6Z}iN9?wYn`pKC zlDCw;%euJC?(zq1KTgVU7!3D$T&wYuzSD$|E{MZfnAD2eFvt!WGUTTriwFjB zkGQ>q!ra{Va#~g=s<|P4zuwI0u3?Wm}l4|A!FNwN809kS zq$S}gyjR7QRSM3^y(y%9<6AmfQ$>i5@!a_No)Gf5&s4{xITB4=<}r=TEcB6OL01m_9MrncUSmrL>9YPTHvwpT$`he5SQs(@x^{o}yn)3Yd1BHk=46%VttVCRKT; z%k&@HHgvLUY|gcMZ-1_aFPX^LG=B+J7r};Y5;z?)U!gEm*vmSR#sj;h5e`x$>&dV2 zM_u_Y4+<|d$?`_TA>u!jSlRVb%3z^7Tp9AZFDr|EXA;b2##Bwne8*wVyJ1~p6kpX! z7*|>$kg&hrR1CUXBdKj`>b|5$krX-ZXLYR1G7Bhi$4wqS20jYGSo5i35hg|A&%tlD z1!~fplq!blQ#hR7*~fkzGGs>~C|fYw5_I5UPzo)Lwd1yzIMm{xI$-LZS} zJHK5(u!}BkkwMs>WLL$tC^vL$5O@#ruZRK>K3QqHH3Q{P$VK)^(0Fg>DOUk9lbtnn~9=y41uwa)ZX@o9c zyk)$$cgdk)z|TU1SY9l>tQGhBnfZY|sIsseg9J?#o}N@OG{IsCiZ5WbGMG90CmMzJ z?Ww>H22g-jj9)7DHQ5?7@`s5o?}WgE8V@O`-d+PhD*9z$bD2by%McS`m8t#xk)AVB zZ1VSy+oNoW*on0QL*}kVOCEgCU(w_T-RfR%*JpUtq(4a8BjtfKjcBmE$e5>J(GL5J zCN3nqhx+7)*x{b-e42T)a+MduYhhWN&Su6b>W5-f)4w4B9TAna4=5Q(e~PBUf-SssoSjfIAt`L=!G`EXs$FU1YVY4fZThE zXRNW7jan_KiAV@<>>!25ibc;0v<#-W{Kqo{nwQL4pH9AB4fyH!60r{XP$A}Iq$}t{ z-`7ExeU9uY(h1#=joL1Dvtd!5m^a^uC=9n$x)bDeDRJhIqS#Vl@@ycgVHBg2R^5Sy z&$pgT+Ij}dDK_dx#~UH^DcQtNdWoh+pLupDXgbjyHnL?@@bAj|27UBIRFB55IGwx~ z9oTMD24%5hjwte|B#Pgtm{CQj`9-lfQR z#G;hsoSLcWOuZUvlIf8<2_Nbn{l-VKsd1W;E+;*FT(xLw07LNcLP z%L{L;-K=5ZyUpJYqNH-Ag!m-G%Ap|>f_l*T_Z&q(6X@jQM3_f{ZGv&6@_ZX4U6!gxzJSFSg2VdOWo1jRy#!L$_rt z??ziV8kzcV+tn0Dq&18oa!UDqK|^4?pnbK0HWM8Fs>c2#UQT!5u1DnPuSlaAkj2jq zjsENqXoUka?ry*9Tp-R*g$`W0i|16nZ2EL-hcD*>CkF3%t5_zAx*sN;{TeDJ7Ko$A z&N7=7#>G@saYu&&a*8Auj}!`xzEOh8vXg^Wz0#}jai9pO&V~@;WXIx+MFsx_`tN7j z_gLD*VH6#@AI?~l;eKO)d?SYm86u5q|t#IU0${U_d_v96I2L=tk z9zK`9ZS=y6&!y)+iF=uO(0n6@q{W~TK0AfarfB#t%z8=gHh0f(zdQ;GlNDnC6|DcD zgO?%vN1Nk@e?&gFe3ifZ3Y*p%*22<~uxV{;O*qA+TstF7GMW3AL+()ocSCMENNx|7 zk&a{2dx*f-F#LgxuOa@Q-YCGq|IPkpbz%bff3!8d|DvEa{!KyURBH)J8VSg8d0|W{ zsB83sdE`oAU6nc#XW-RM@l4^<{;^8#MDeB!zK)zFd$DR!-WU8wStJlfE<>en3;Z_O zx!t-}2;+1wF^9ErqUPXkm|6F`5IU2paTCWS%O>!M2zpao1&RD+u%47;XKWTN1CvAr^z56|=*lzE)> zs5H1p=Qw+u>$hX1`=~~-LZSE_b@{5KfL)!-NY0(-Jp}zpOI$PU^Pr!?YRg{16$#at5TS7@SJ(1h2Mm@! zG8m%zj@Tijfz?PD4{Po-&bM_<${_d)vCVCAQI6w)BJTP4Vwf)}rR! zucQ|yjkf~Ur>6#(mn;T5?JNHimU}s>T(r2{}b5nC_U{BG1Im;VSJB z-YS=2Eywo@lf=n2OZ0fDpL!uh{(J*%IS^qOJYFsp6OVuB(DXCgZD7k6tIrb>%!Z|f z3g5|NT!p)n5XJgbl!e7S+YvA?7GjxA)_$Kmrjdrux@+}&)skCG5)M^x=JaVoPd-t( z)H4vC=%x%XqTwNH?2)S&Lco}*p9vr8x~YF~tHW@aE~+R#C}G+r(W8ZEyT2Xs_yPv; zucx-z_C_Hq;kvrIA%olrT(LQ9QidOHA=9-H8Pf0ih>#oS+7p}LaAsNavfv}KjulTFxMm!z2hN6{pUfBN`V!ksrn}sP>b&1NWB==EKlSWV9zVB1vbLL_30!R9soR zgA~l0zK-XeXXV^FaHjaC;kd(s?}mlVwLrw(A8=%HJQD|<90{i>jNdHyQEAeToUa#a z9KlDwjK8R&3BNnjASg4W?zrjbC~6pHvD+C;8Yb8mY*XVIgQQ&g+6{tz1PGSw%KWh* zKbUrCt-P}dU+i@gWwEk6V>DO40+{gNyKkz@Fpie`S0-Ia&Er@o zSgHUiIps*qX#A8ZO-vhVf=M;Oob z3xCHHZ6wUj31#VV`M#x2v8Kn=Tr%Z%7$qY0!teG!WM8JoL(Ik!;IFxwj#K*~P0`-h^q_b>G#n9@4B9eaNG=&qU}DIl|Ua zr$ncu_kts1TJiV#<6y%hrxAjrqdUAJQ2B-K$2|Cxtu9pRE!J;Z5U$<5_ifv3;y_o^ z8z`%u2f!O&I%RUz^6;jnRbxhVrm(ZcEuSztg(em`DEJ=61NhbdQc=?BJ1WgaY}vEF z_rg%ZYD87!{s;Hll2852=cXuxuaU?|{{9R4ZOMiTINlzJO;$dd^D;99DAb~=*iMXk zOD%9NxCGFQL}@i?75h)!1ZJc-%tlJFLy}ls;S|#;8bS_zk+QFvV_Sbu*A9P|M}{elc=rW8}}^ zS2MQSVLwq?ed>pwsC=ba)pB}#IiL08mnG34=^VqR?+5>zZJwY3(!3Sdah^Jzfav*k zADzsY-dGtaN5Ub2vMjIRI6KWnLA>Irw&u`l?)#Mnc#UpR)npb1zUvpecOO`4T(7lm z*@{T;y(*&WCFRz##8pbj7+pkU=v$5J@iJ*FIFad4OUnwL!io;Gsl3Z5k_N)xeZuWf zl3(|Lb{3B?QrVKJ%>$Xu6}!<XGF)EyEf1cL1+= zW~O9Y(Fm@EJS+t60Or+(yBdZKa+EV#lM0t>aav0Lm?=6~x`(Qj;mb&y`jj}BDat?1 zlrlVBZLCwE1u%#m8P)w$biu7%;lY>k0Wk5-Vm0n>TYB<;6FI|H~VIjZ;oqx#Wz?!J?)Fv2Wa}8_?Lu~50jp#WW zDl(KR4m8(lnf$^^P%T!Q3Iv4sZa)>r2?u-3YO5pWVEraLZ0zb2!%%EvCYoJ=1s%QW zV02Iz7!)i>%#e%P%OL4(^}=Xs^@U2}*-ntLYB;4gJbSC~3N^3PPO%|dI+`7k1VC=C zM|iAEp7gtOmp(650}ZjP&^hUP5}N!I1J~>q*fI0OAd+_ZnJ#h6Oi}kBD4ERu{pklU ziap%ZpvDSzL?m~OX_GhdYTAMdh}#%G#o>dBsA>bT$)<8*!il6`ano+OmxZHS!vnW| zvmML<R_nNL-g&Ttp6g-R#_!CAS5>kXwHs+Do3!q&$S&lxA3f8azw-o4R!!taLB- zS% zd)+)qetJ~*3rmqG_UX%zs$A~Sn^l={)zPPNnHUXdJCUfW5qPZ`V3|=_xUSkyZO?FH zOX`j{8r5a%AzoM6tKr-`|B+mhr!wVg)efKBl;c7i^Vnu#-RE|29pvHk^-dk>G^5W} zsGd0Pc6qogDw?_sUExE_)DsIV8ZNNQ9U5&4Wm0_9P4Jd=OH^KhhA&Gs+iE0>$QWn- zKH^9#5`R-W@WvI`AFTn_9u_fbGH`B|?Md7toPaCm@^)w<&mg6@+t?}uW0|Kcq2`q# zFJ{BLv7YaTA{q ztkdy0;Z=CkYAPoIbZn|FX~}nOOoY&<>wR&PNqLs2Ft9tjwI}cdzH3C;cDX4NX7nr( zc3ZYn=WGtr)mpx)9Bv%FES8DfKrpyiE16>T#LYHf;mrF+7<-+{0t7jD@us6B3Jo|G z_nwPd)9`eCE*dSA)To~51>@K4wVHg|+{gISPb(G1d(LdA6g5e=nSpqpUQ}9=yCj?S z7hJNh#Yi7m{T!XFqhkDw`$@cSWRt{|!e^@ubJb2rgx7$5GexYlMxbpzHh&CQLKQa- z2_L6hCYXz=@kj~#UG()-oKxScD(5?dftvajSA@nmY`mLiVp3$czb27j4A_AY+Ee|# zC!coO3Sx_M1BY@5P3QD-IB?v7_=mGF~O09ee#OoH(xJM?m0Z z+!&(fQEEiwG&c)R%1ce@i--u^zn%jb5A-Vt#VH;L*YK{pI?2&mv_C7k$(4Kuf}(#? z57kxh`rcI?_`w$D$XFk^lr?Mm?n9fv9PL-n)a}C`-PcO$$+Iu^*BVZn(La3VUmXG4 z%Zf|+nj~@7mP;(T&WoAVKR>touDvLwUOAO|SH;PAjF%&lNumkj-r~p@X zU3g7uZ-yd5;NTlw+lZ*Jr4VYVikue)DEx(4e7kGs@b`KGoUsCbJQ7V`JvG~?Fd+40NWT;N^+0NQx3I$ z*D}eW>kyt(1zT~91kWW4H%Y6@HW**ErcF4v&~D zfa72xR|QH{OLbG;8H|m*p5JmOwU~IP3Gr80= z?aCPZ^tZ9wnVQadw1v2214t&G;Eja*A%Kd3MBu^K6s=B_f7J$*%7O_I?y zTg0}9K6EKrVrb*0a;XtWwj)+r$WhBbR8|&u7h?ysmni)%BBvPCd&HpH6(N|f2{^z| z!CnlM;XZfO)FLT+oF?KO0cBYH5zSAQKtxFasv5>jO!Ua$Ym9|w!49aJOH_@E2Q4mu z*}kV=IkMrp2Lke@B~_nbM{SrgxUC@Hm?(FE+S3{I<{oCen}xu}a4^~aqkAw)*G}BM z)@y$S#S6XSA@j8#MR#2ObKGbJEDs;_znO=p5d(-l@OM!JFCN3PU$D(!{d%9D6i2pi zK^ONF*Ftt(j|Qx+rtVMw-UV`p9}GJME6K=$+t^VGOSv(uUQp)~c0DbSIkGa%rx5;XL3VSOtEgV8&Y^rZh1CR9IteWuXvWo#a z%VDangS*<&bB$aFHzNNOGi3!e-=3FCNFRX+ON7hseKB5V<{(W zGv%5GXD(ZUTYB?#;UiLyjG#@MC%t4X{qm~K;RjHSyHt#wc->ni>Ahe4;& zr2Ay$)~)O@Lnx@`j7CQ2jj`YM`|DA4jnqMYp;HSyTPIrjv(*JUVIrA33f_4 z#vbD`wn(XQ*gdS>O!5=V@&}-unsVCOcZx@Nt6t#{CVT4vg%rx(>^?v3_ZNc>#XQ-RW z*W)ZSPxvG>%}AX==IAvIl6}IxD$DCwW{Owex7%x@?Gh$~Gw7oE)SMO&@GpVH} zMreiD8!5y>F$r3LZ@zmGGR@moRC9!_&bcw&*xR3m`}S z;v>kV-5XpkTcN8~Ss{&C@)p3ItZoAo+(f!7vVPn1ZDiJKJ`QxPI-2iE zZ>kY``=*qbKhA76gb3*v4{9zCOoU)zkwOS&ZJRZEOBi)~m~cmpFDD&EqK%0(Bt12Q ztO=%lOkXE1`)Ol{#QBA_-ij0zx~(8we50Rr*K_t59&@di)#2z~a#hohr(dFSk9Xr_ zwixYO+Ie4LO9@nUgExgMb7*1CeAJ&%tRD`+rS;q@%mJWCb|+JU=BxfBnye6HuUc5N zI)=l|0k|=3AnsVpaV~RAs(a}esji$T#-XwN6Ltkh=@AtP$jcD}gm0HB4g2QV2|rql zi5XV7;~3P7Z#QXqBfE1Mq^L-012UXQQf>;rQJ27lhill`n!3OiMf=ipC=fYjNDOax zNN0z&*W^_cz~4s1%kx`y!#|kx)h`}0vn0>KkBJDI_?)s?wk?9Eu==J ze%del8l%u?f5>~)hks`Lc1pKhe)0;-W3SvG7xWd8P~*A$q|+;)GkH%ne^2yV<`=>| zi6n_eh7HT~a20R942jj2oACuF7z2S2s& z>oc6QzEq?-84*9PXTV=@^=97^74O}P`ogNv@hswGX(uA2~wWYVU zBm&%vq2OJqU~H2n{x4ds_DT`ftt3%La@1`(xJ#Rxs<^^&hTGiwt7pw222ugNJO@GO zkSkBZss3csrp#U2EPTp`)0i59)nJ=@LmP3pw~jp4pOYWCWo2Oct@)HVYQi!mi?E=mvNavoB1Fu{b4%n%YgXsoYs%X@9}_%r1X` zrX94!5nw2Av{IEVoR?@KBjy%OHZj_l;Y_L*^J!^X`C$Nb=xH@RSfdyA!*)W57_hEJ z;Gc(+0(serC>uT?PHBX~POxEr2+5N)6kTvQ#Azvd?xE^xg!y6fgRlZw^FZ^84?7v! z4gQ0NQQUjQ4j!gBFL{a975h8)qjzvE7D^%WK#^)87AN*EkvJ{le?ugW?`niRXFB)c zK9Mz5BiX?~>dg)oAx4wtv}HFf6PzzauAo2Q;*}p)d@@Mq@;Wvw}j!)CQ76_~N8w zFAe}nItFm(JwG*1F|WvH7oTP#k<4dnQ64;H(yo_*xU^I2Tv50hP~hK16aVi9L)olD z+x$-IpnzspLn7HEemFBO$-A^%;W4gAR#kwfNMtNcJLgx|DKIpx?zU`j#q3VT<64r0 z-VVS|R3a}vpu!Q!Q5%`yc^qJgB2H z^AY4J+78q^)cDaYQR@NcE)QiJQGz+?XONcIBetU7*B82d+7Nt~Qxp()F=?F9A57Gw z)WgWWOd#LO>j!V9b^N&78M?VV?pg%5wA_YuJuw5kZ-(w&8P8SU*spF@*N}CK{wP<3 z&i-gS_3FfY(i+@B(Az^4s;GkA6`q8-;P5$Bll)2?fy6l&3CCty0?#~*0;}qRqXg#* z$#9Zgxrfwi9dOW&>?W3JD1omm;Zr&$oX3B_5i#&AX@}iaLf)~*fR;$I6HvqiBe(hK zP((~Q;}ahms%-gf-LP{hkpUm$c8%R^=QQ2ShC)KZ^zbh18qX#Ai(O*S@ZA&?z2yji z-dJ&eX>qx$5ihYZMJ3r1W-7O4SDdoJKJpUCG{(8~U`?M&NJBGUWhb4S6(xL_fW@L@ zg-7~0V=?RGIBns$>^kjJ_8u(*@clmMg1|Nn50`VVXB~E}(l5(N?GTXBC!VTitvb#B z%wc?sB~XRUv?OGan}V60Uutk9_+@p-NFV)Ut>gudbZH+!7AgZ>Ro7bq_S#Bh!FH+pKc^V2{JB$y=s;HCmXF2F*phJ#UL<(N1Z^tlf!g z7^FidHH?!?Db6<(-jjIh(e9*fT$yx5{wWZ&j5a_wFX2C84u{O_rZB$e{g@Qc-d*L8+f7XMBPMXbge&= zd|evg1hJ1wqlmbUTMv5{%e?>1iN-&~{T<(C z)b229-}oERhBo?Di@;X3UFzFOha4LPDSr@xNZ_&H!Wdq_?*TjdI`ug2iNxNEKv*a$ zjxsYGxK`IY;!SxNZ~s9)k+(>kf-PWvErvwRg|8VkKrb=6_00Uxz<9mxKx~!3iC1U9 zh=>rSqMV82&C8rdW_G)F0z4H-)OLvo^KdX(oGJ4vg*V+C^IkK@fQX$V8Fj41CE{hZ z!hpLD54tAb<*XGR*UyrcHWNO%_Bo>F%J*aPxBZ?ywAyOnFeH|UrWwWSd=*9x$2-j> z9aS8H4(4MqIHTm|*pE`7guRY~1eYIvm8}m@G*;bKFD6)I6%HBiq|`LD6X8$)DwcuQ zh7+%jEFhjyl66qt+EUKtH#4-tr42Zt&kk>*k?*ubt4C3_lc%uQ2hcw1bi@+Toml3b zgV2^ECEC1s4n$F!*SR4AOX@Bh#(EJnmzz&Y*=m|4)jl;!=O$rt=66ge819MlEp{R} z&%(5ouE9i}X&-GJBpkldg1m>T->*uFt)Ys*iO#iM;N1$r_z)_@h>^(PTy>QewMU zIcPCuXpSNIK(xh2jTTo;tbL&N)30n~$=Ct~V;Br|T81ERig2G>Lk3X=R%j&Jt(IrO z|5Qd7*k&Ves-&TsrlRG`wpy{+8c)dDFIX& z51;@TC!rbQ$RY`uyMc_!f*=fx*qtDyCykx1CM6kUihuwT!h4BL@!*61(rhQgb1voE z|Bq(t`TuLSyDf45<@KWa4}D(nu;-)hu${2Nyj~<1h_8c=dVj$weXOQyb6zrfRpr}4 zeTiMFc}-C=hSAc@wnpc2T;=XHt|eeze*gpQbcl{vg+H8DN|=jmjVzDaBv<1CVpeZdr6Ag>mpHg?nPD>bUl2a1Od?k3VaAYqZ@-hnAOY~BeI8z=JCYBu{v-g^j z*IZ2EN30U$#lqIZl2Je`)m>S&JIl*h3|4d;#(cYd4^SR%Bb-p-)itAq1cg{v3uXtL zc?~UDver8qTZWJ0jbS)0DInxE1O#5G8mN~ z7TLVqmN*svd#Wi)PzTAL7JhK)=R>)pe+Hh3IjFrIuJHNU+jGHgn+p;e&?{*rd(_J~ zT)UPetl?axykBg(*<0U zYK13Xebg%$=%kuyqAE3^wSel^IaMqqtUstn`M){mCZ%?DOg!7_7 zsQ>e4{AQUeMI$E-KGXyyr(n@2be|nYo^qV(=Z$fsPzSE@HfKQsT9^EF1fcUu-}GH$ zcFb>%wPfDs0H}UgYbC6BRcJ{RsaVt-6`)63i=*O84rDGY){v)@-4;Id^i=2?%7DNR zoCE+=tyn;9Q%pzm;kM}K{e_$&@p-;4;oXX-lY|3ItDw)`)U!jZz(@^Qg`pb)cd3i7 zuf(0-4)iMzNv!2FcjYV7Xp-uie#PhBSk7nDsQl8DC#lWPY~}$h&R>vMZJNCuV)Gcs zHyowMLu-L=%T88Y!mSk-9r=R+maxuWlm6-)5sI`Q+c>=7_b`*9jpb@kzg<^?Q&M4a zcm*fAfiZ^caPN2eYC_ARu~XsZt%FUsub3!rON4Wh<8xQxCt6s$7z#me%SmmrK)A0s z;rl5aD7J$7qJ{qt;A&ow#h!cG%ME;KinY*#~Aeqyd+I?WT-TBD01B5CTro&-GU7LkAtz*8<=hWSl z^o^q|EwTFdvfMsazCYr_*A-4U4mXvuIvOKTyRamOEni@OdDNwYpegGZL88X6Ot^Kv z)l`5Z$#PQGt4wmJM(9m{AnV1#X3RowPL#JFzSn&-04t?>G(_XuhTOiENQ`apo8g)7 zsc4ZmIOu~#j)&%Lcm;^w#`7P)(#jg$f8&~j%?lKK*4WkR7i^QuJ-?^SpS@iy2&9J zAx-(ILqvMxu<%Y* z{DPFBkQMxGL%vFf@Z}jd>E^CR^4t28&@bo;Gx7rtj_(9>;xy~Yl99bbJUfo730qus zS3^4)W0(dQ;dJo2nz3Oq4=tN7kOiW5rNTk7Bn4(tVlW_K@dJMSL}%gqv0lZvdAS=Q zsSwPY5d-~l%uV&(Z%W#v09a(l>Be*!IIYO(g`cT8_aZDACKq1jT zMtMjYI{0@SJ5Yc1xqY6&tKxOdQE zu*m&B{xmun1*8aB_D^h4RBebk)R*GqHR;-<0>Vu~+w1*Ae+dge(_a?lCoVdh!!TS3 z$b+Lfeu`!r&j1GE6>xG}AS0s@1RC};3RWc9iy`X-pZa0u@J|=wkT+P+4L=~5*5pM< zyVLLycO-Pxli5T@r*3A1i% z?*21|^_&QRQA)vbo6b)kSb|}6u!5TDgJ1;F=u0uqnrC0Xt}$3UF*^kN^q;SWj(92R z+Sv}G3|>6>TL-pk>RWJpQVJd(cov79yO;l-$PU|oPad&^b2lUSC;zvi`HB_z=7@=k z>m3Lq=<0x(Zt2s3W;f|OjTP(-#}ld66(9V0hns%%72`2b0q$RLCL|=#OkLmQ&}4gRh9TED(#Hj0CkPJvh#!^-^W8fN2)+^&D({}h!rpXAz#n{@8*Ysi3MmOo zT^Y*||E>6u(q)CaV)=j{ZzzxYGH2NYxZw1_IkV8V)-35vCj+hl6a}$l4l6y!iusC_ zA!*tKbqRJ(5Tf!9xbs`ez;%J8pN<*#)2oMX$@*2U=?HDZdH36;AA@<%M|?@KfKGSa zx@9RM+9C_da{ru(5FiRW3?_G#o;vB^$y4YYDDRKMl-2N{=@L%K!*NOy+A`}bL_j&0 zHvUuyR+N)c`S4i_V7UNI+u6yqNw1-D$b6imn;w00J+IxrDBb zQR5?f4u|?uXBKkiS?(9J6B(KodWNAhIx0v%!V<-c;E;i`~?BlnbUdQD%H3OnlakT_6&xO)dWL?O3-CBoq>ptM}LD#!{0Dz7)hsmbdKMJQV) zvkp~g{I=y1xXR`r=cl}`R=94(h>{*tFm{?$^ZN=|s*t+%IVEHipyzQi#J96cH%+$T zQgAHWRSGUgO;E?SQH&5Bt0h7wbZB-p@DhAq|7lKisvaTeb6Y&J$74x^$3We>4VuAi zn2USPNb~_Sb;7)cgF!)@z5i8Ck%N!ZE*p0ar-9_>$febm>Yy{}&Zw`hnPqT)24IxJ z4(!5)ufHymduW}`v`Bc-X&om^4j&6u9DTn_O`&X+27dSK60qton8wwCM#mZBylt@u{6fQ`5%n*3xE zG-OJ4Kb)68UViYVs<=7Qt($SV<<+8#^_Ayd|K8I0!&`#)cQgzma&Q->XRuJ&@Jk7g zSolIV-MvsLV}{y=Y_?3fz>tE7>%E31qt;KM+KUCtLuAJxBDImg^4IJwN_-E|rWCr! z$df1msbNx_WWS|N3>bZ~hhSsNhLQXQ*)~IWj1%4R05BFof|Skll@DovkXLm(z3~&J zCl1sqyL%z?j@#8qajXvgWrOyP;0p4LU(r`Tmn#*ehN)vt>@spG@Yuf^ph}F#iEz-a`C1UQQ8MRbrW5-FtG;Xp_zC z{cD=#ZV2qwy+hm$++5WbU)ipB3p^4g!ITqRmG6l>$pmRb3Z^#mYqYP$keB3m9&4ZS zLhy44dE~3EdrAi6S++rbq;r$sftBArqgk)cKwHhCA3=#nu6^=^v>=b`YJtJE)-z3z zwv!tNWWw9~$W@P3O`!6Eij%B!uE3sLT;PcDk~wWQ(M>j{SYg9;t(pPOd`{^jmCv|w z4Bs0x?iB}PdJ?;+x1y$iS7{JDBBV-$)f?+-23n}DZGM|4U2QcVDXm$GpBu_2yKREUe{jRR36euxxMjsP(*CI%}11qO|)oqkE(Yw0zzzq4`ck@FDd~ zEy^ogx-uoqMRzI?U&G*vlV!3a2se0`<{a`8o$|L9J-r}s?*FPl5z+O>_+S32*e=Dq zXS7GQq34ONi`}DtLp>?~SD>Dlx2g26#6nxBVpsoGqmdG47XVMn0u+tGeekfYf1OpZ zt$*N!ckPcD_vJNru;BhO)c&{JG{(AD1}u?pBcz5uzCWd_rn#2SwqBxW@k zhsJpUSoZNu^8=QbfwrZhv+Jw)XN@%v_}wYMi0ZmK8J-$_*GB6QGB2;B_-oYk$}z%k zTFdyy(Z$KUoT1mHQVIRsGIF+Y!#9N%;zQg6X=MY*2%0Md1U95iUSzQRdJH*iLhdtT z&|D@YL*;}zy4*xNL#cQT}b$?+}8tDBVhTcL_>Mcc;RT(#;T( z(p?ggLyB|`-QC?GF?5&v{9o67?fpE@XTRF_yPxai^~9pmn&NIpUP zPd^md74(MT%YZ$DT&4DSQ@fZLVLh4fx!y#^gturcFXV zdZ6t5+%l?>0S$VJysC*;M3~wqyl(OdxzRcTK9TxSP|C!)!9gg zH8W++>*6vG)GSANIVyfvj1juoKfd7>XdL|jz04hlB;Z|@L8XMjbsp4E zUSxxslhOtLhjG>`syl8MoSGH17#r14!Rbc8LzOrtKT+KhPe&&M03EdOTf2W(oOT68 zxG%DWcVa&Coa9*B7#Xk}cMq=4NZ2EPj+aAg-z?>fm!cV{jal8EGSiS+{%sG8pB4gO z8@KiHbm@}q*m&%S%{paA$5cyX^85^-Yy)lFje7Jfn}mIT8*5fQ6Fpig>_#&y1Roi! z9}%Q#2pME%zk3^PiWXZ7I+NGh+xOMhj0{$neJ1EpPrg*wzKq+5SK*HKfWLR;^$|1` z?VdOwI7aD+7nRtaZYp1&rXe*IP6`uH4;eB0qj#M9W#?`9ikU&xqT|>_Id8gtn&PG1 zjHd=FXq+>?gU2zMfqNcFmd)NAgcL38td2mlWMPX5@wh6kfCnnnac3Khf9vh7q#{jW zjh2HFFd}q-aLT1D1tQdlB3%UGij5)f;XH4I*|e;+E-nRLF^KZ!%=dLy#7qrrgFyqNQki^9&&l%?tIGK z{hLkfz<4R>KK+kI*%hrom$c7^GmPh#K&1W!=qx43ugl>yPl5jz$2o>a`mjAQa%374 z?C20U&n1CZ_W`$WHiNUneZZ&na&Z=7#*@4*+udyx(5`_y%(Q zTQ}Soc^*XCR&Vbl>h~m{eX8WJ*k7mJK|m^_eEVZ5<|(VSg8i0xuJgfP?pCf6)AHG9 z131%lVCxlsL72wdlxSBSG56k~k2b?lW$e|m%eUHOvtef$K-515ZjSpop?wy?dHT?8 z55R3ffzJ%|@|*5|HaWEmANb>%0eNO?jf8X*bV~WE*~X zhd|!HvKZ1^pxU9Yr7dQ*+83h>Wc$U%t-0MF{(?{!*-(d~j4&x5z1l2pp}_CV8n{L1 z?csG)N?$VYJlDkK)pocxIN&WD_j(BX3}0SXj`IT#DSzaTQOZ^aDvDQ^Jia$Q6$0Jj zTYe~iK|!H@FFp2p>&4K2KV|u7VQ=&BmFGCozrSzMB< zj~O}r9QHM*j4r!}jXF z(+q<}B@TzTTUVuXl&4xT->!jZV`1Lujb>dS9y|Al=S%dq#t|t!59wpzH5J*7OvFCy zR9SqnY2kX=gRQ^PjJMh0nXO4w{F>z{*M~QM#IwXh=vCbrPxLSASA*RM@%WnI=0}3O zd(M!KN#M2ZYabQk5S#T@*X@hPx>mwpcklNQ+b*9{#jQ@zo@XFfI6#OKWnW!y{`*|L zRKpLlMh)qeM1j6haV7#B99=zjb%D()Jj)U49q||X7lUv(i zti2jM@sGecvz%>_=ae7Du>hNOICTtp;vN3<>J zA~nLTc(aM}b7*?f%b|utodjaU8rImjsRFes-+t_lXDRSf(NN}f*_4DJ-4O6MO*Oh& zYY#Z6A7qG1pf}b%rCemtUMt(-Midko2W$1Y2n93Q-Td=DXGz=Qx|I-B<#|y>x{gB) z7ik5F8ubFGhaT;Zxj^~b8n?Qv@4 zExN*CJbhv*ag!?^TZ+QivJN1!UgHnqV6iXC^)nmz8hkkF?=b*TeZG5y3P;Jkt=T@2NrtpRm^2MrFVv>2$fhKLoeEhz-JgfK^_$0daSX_O zQU%?fv1!WR{jYPkY9*HhWC$5^!v+Ogfd5w9yJ$duUL}%-3 zZFFVxfvFkG4;IYBp(I-*Zrqu=wevQZI|Ggd?$S`Cdr2(HFeX?iIHbbw$tpw4>QV!`L^XromP=*1(5i^OH38ngzDPGw6`o?F2^Rb4;%(bJn1g z|4l{2djBua<22F0Vh5yjX`cWN9lX^c^c0tWEImW*gH!ex*J+3O7;b7^{Pc!Z>wP2E zBp3Fzx#YjDI_vZixkcI($IB=PhhN@_{OlvPD?)@3)Bwx6G4oQz3Pnc#H-rW`+dKcpUe(zf6#E2JG zZ3u=fK2zw5`qlo)q73=i8et;4H^n=_Yfg|ZD&9#*;3YK(i$9_f7atbDpS;a8I<2Xj zfc)H*K5$OoC}YzTNP0!!d=rf=r8m>LppOwuyBv)K36|=%8!20uzsS!#{=@+s!n_1Y z&{bs*E$452_~9r&k>$-z+KbtIaSD_j%2<@YIVRjlGt)Pa|46#DV?tZT>m|)ftbeUH zy!S;wP)%8HXKQ9dp;kKkZ3;bk$)t5%)v)B)oJhSjTl<1qaeMfCUf)_=GU1u;WbPFb zkMDD5j3lPFH*0xX)r5;XbCKhM5~SB{CCWT2cLuu|4KUH0@ftuuaR)XeWM%%p&$4=J zBL`^Y1vL8va-{w^hf}A;z>Bu=eK@G%>-&@RavSoI&TO{VOP*VWOg7$0Au83q zTsTZ$t%ymCtVy5EGh>?dyzE+5<-h|22GI=X?^465Bag{BnDZygkcFJMb6A`+uX7}C z{pMMa*Zn!CH4nqynptR({^sKDWvo*%812PJMj>z3Oq{4-E##`PfEs7e1!V4p@j4b6 z%8-5XJRl@0Q7#>#A!Y51daUzhm|c%~(A_*=XtT%3DRHlhY_!Tinj(iHd|A?Hj#$@c zS$dE9R%Vsrsv2CWXotFB_Ev#S{@aK%=W(<#2O~YvzCId@+b;*xA$sJjK!28w;=2Sc z1Hn5l^T?TyrsdpT=d7#5I3*1c-9??KqaVt(hVH`B!nh-#r1{@N$Ve{neENddP`fW+ zYB~}4ypr4jQ;u>iY;4?;u1<~l<S=^X&8gc7<(25r!^*x7*$Wum!%pIx{tbO| zMZwQPDYvN1=MaIy5z5>O4UPOEPSxB`7uto7>5vjr`?w`+VlA( zd~C{ApP~mUA?qxfncBm8+Ni$%$5&nS@A7UBAG~~s&t$qX#;|VndqB%$6ntE{{g_xt(veWOkxx`-)Q{vQ@g&@h@MBsZJfLctrI@h_III--HsJgU=ak zEwF{sn;fkR(jtpImLEB1c3T3kb>GI84|D&rMBQD+sVs+RWS`o=x)rj+DNhwz#kE^o zE(+_;6jw^CEyY>*_A;*?W*%#OBx|cDpXm>UM7XP^@Gm1G-ybNWMmz&*Ykk~1SN!pH z#ghbb&l$H`q?h?oo#p*pwIsUGwaDPvZt%iMcI|bYorrs757Oh9YrkllRAt8AJKuB0 z0n@Cut7BN*$TawjQa>8(R=+5XcymWs?m=6YMvD$S3qBRJMd2A@Fa(Fzye`hqr2KS+HPQ6Ia$i0Do;Ng{NlUY2SIB>lJ~z zk}GyvqBh=O{SEN;0d8+85Z>j(&opJ_CI$qn|5{G?h(k`H)(n1sK^to0AO6W@A^-D0 z-^2fNSkgEaw01802sjSR{%Z^JA7jJ+d;&abt>!UW9PAKg!v8oX1pCLw!00Zj*POi= z^sJ=6N&gh1_pf)d`WXH{=7tZOZWn}ES2pz1GqSMR%Gq+QFM-?l>0G{ww0Izk`-y)} zcr^n&-)4wja;frj%{X$nU;?#0qXGwNf~w?K<;i^Es%aHVnk7P3pksH6{!9B^jIo}( z7_5NHXWeo(eVLYFNm3+R4}=uU@Uv`~OIckS;efG1R)pkJwz_g6s-5w1%wQUKf6?~k zWdY!jNTYHsk?&SCqDGFd>blqXoO-JB?D9Be95hv2=q!)n*eF&@sTZFoYQ>ozN46cv z0rpSm-BQkU!je`(5QOVX&vLrI8Z}*i?R=<~AK6bTDy7YWqlP8=h027XWIjSI(kQ>2 znz29s!XRiw`U`!@BoB=7&QYt5%_&H!YvxCqjyUl#_*FHhWiLo%HwU~Rjj+EMW=}(8 z%zlz>bmg+RE68fT4Pe1o*u$>ALxQ{ryVh{Zq8uxX8q#@f$@9K&$3QDXp5HtVQoK7O zXvXl!q6>U=AR~g1{@{H*G}{-|24v2iisM;H<`a>9X9WlDPnpA}mM}A9(ewQC$mRg) z@PR3u`q!y(C=Ub&%(qDX&3q^jl-74>2nprMK#fx!3UuNsY=}Zt)rm<;X34jxev=O8 zG1Rm*FaS76`!Uv|d5vRyuJ>m8I)k|y@u+^zDz{A=_Um#U4J2k zS0u$%o`nOolrHW7GCtbU;rkG4W|X87-*~Fg!5~LVkyGybDYpD9Ij-NYq`jxTTAb=? zcS8ow2Y(%V;;j?gqo|uKVmprrW7?!yBIt%ueRU`K)AFW7I=Gx|8r4rTtir{}@7Bac zB<}sp?3!*Ji|jVyN-#-|sQlvK=U4@&hL{EbwXS)kAmd+5OuTN1Z{Pk$+mA8|u5=he zDR6-{DpOgm^G4f1qPCV; zdZb^Hxs-heuOcIv+Pct|Y|77}YkCE=mqf=CKaii*aZ(R&uuDq zKX^-Jp^@BxZL18jP&ke2U?lI27m&I$)}Adeg0hV-xs3te9s#dl`Qt}-dHGmAdwYVC znp!qyNp{-FPrXYiA|_XP8lKVJQMw>OmOg(kKYWTP?-$()A%+9}f(OETSEcn|7p&Fm z@8v$!_(UzwDi%f*@Do!CJ+Hvf&CYJRsy3teSm*A)@Z*sst;8G}W4AVUJ=caP;E&lx z|AZ;G7;fy$*dFtEry+zK^F{tLdI|iY&2>ZY#4XWU2)8hnn6qCk+JZ@RSkuDn^7pa? z4t0Cecjr&8Zw@@}rNdCQM5W$Z(Z|GOTzoPl)Q{BcDC7SeEs^i4|1x$^-iipX+Q5!dB^ZX z1a%DciZ^D<0qqujk>Shu@phJZ%t}^hbZw|3$`7$fyUqIe)ni7@tqc(q;=F}rrQcRh zR+Fw*=}2U+)AD?XwvAHZ`qz5p-E9;tIx}DEDkd$WzcTN!&wt;FO6g$_B3Sf2Mbeto zKe{QQ8TzFfwS0eJv3_7jopCuiQ#Q=xqJt|* z59T0vURUlbJYya%ubs+2*%HuH_LQr<*?$f-b9@Hqz`A4i4pQbleRqCw|nOU)2KDI0w#pN{p*S%IY_cQroBqZRRHQTCU z#Zy(0oL56>cU+Cn^jp85vLZ!yDyEK8EGkm&O_+C-->C9sm~Tt0(J)N05VyK4Xurf; z`&R{tKPu2f%a@cbKy)Ifa`R3fuxiS__ficwxf}QLhq)jrI_u1WQTKBf1LvqvnAgGLsj$H z%71NZFbwD55`gED_3X`aU%BzWJeLG*OqFM!55^ku9vSZ6PC&|y%XKX^9!4TcqH2T8 z3*^Noz0M+nBn^k^{XDJ;?@psD7+jYS3@-8YL05PPmhe}9L1PjMdp%EQnqNg3axjd1 zjMwmuzF@s&0@tV@ZJ6Y5Pk-AsK@SF=QDuqO2@v$D_Dl=PFh90bd9RutT)5oq_FPN$o4|Yt1=vN|c)(nGnyW6`tjIJx z#R_vh!_1J-o0kW{@8&XvCwX$9h^1&xI;wjyClR&3lDk_t7WaZaH8h8GuIeuZKMmvZ zMD`WoZ6_kH^*D-Cw%Gjzy;Sa8(N?+OxX@4CWS)KvlQUDwebPtF2|O}97qyWidRHvsIN}v?z_1PFso}XCVAFyd zkavEvuq1*T&Zd%=2lB}=$@O2u4d@~#J&VJFqY*Znz4Z@^^ImFDaNu2+Ems^lK^wWH zSM1gBor-oJ3X1|EtL%$rSYwWpDW9hElb1oceCgG@y~AxbnEXC2xqVfiZ5sXh-iUJw}0q)#iPMFxHvSTp3vx)Q9hSd@$%N>-Oos;w8xY%;FBzjZaZW zvO~N^n;XNV@#U741WLT9*bNVD-f@J*%Ka&dFyzy%6;7-LM^sT0Zy_D(RI%7_AQ~jh zr!P(VNB@zn4({(=9BKX~nz1ex%Vs-TOFkRq!j%z*OqCPMhYx4=&4gT=0f`P0HRJ@iv zX&x~jbMLHZ*&}2DCxtB96FIhF1kq}taXJ%|;>o{c#F1s#46WBOJ&&N(8v6pNIUtzm zQ0<4;e6HJXGsjqjKD^gSBQ|zyguw=bPTm>`5)NPT*sEh&4|S=#f6*`nqJqd=i+-58 z>iA^1(Bx9>)fWiBJn<%FpE7TERUzglxN%d@uP`FL|AKy!JYw92yFV3edSaM!X5lwd z%0Hdlo-T=-Lte+t_)#p!T|E$2wpZdRkS)S{A0x#9_fKh6uc8$Nao`%@~m3y7Xx{Lp>~EB#aE1+TYiP zpd3<UbNAGi>g!im3LYfhl{m?3dh>wn-Ors4RUELPG5tMwY|`3qVs>V9T@N~x&~tv?St z$s5*=RAvLIU<=>mCCQ~rtXO-{hvfs~2;FQIK;`PzSyu8saX~t=SOKDQ2kX^B{`>q# zz3JX5xTU%Au#Y=~h9cvT$<4t2+#;+<{FZwcG5b`0M9nNi&p0AI(;r9qx32TOwjwPU zy&#jv9A>lBDQ%-P+YAh1KE3HN)b_H77D$ ztooppG2Qf6Y1yAsl;&w#qD$JJk8l&Tw?-#=Ecc^Qe``d0M@j7{Co3FgJUec?~# zUP{nED8U5G685&Ve(pc}f_YtRhzcu|AB}@q$pHz%Ov*^o$;86&GYQ0kP?%F;B}Rtm z2?gMHys9dh>Lv7_sm7z7UJ{8O2qpUk9ja=S_tvA^P$$IJ9K?A6v`$5X2!XZi#Hnt3 zoE2Ug-~H*v#c{z*7iwU(5$VR|kFFTCuVfT-sGvJ&CyW&dbUbV$V^Zqrp{ifyrB(HP z{TTsF`c+gi=4PV~4?q1ZO?orjmuw{XPoo5ma&JVMlmV;b!@ob6Pw6quYhv9W`}=;P z)fb$o^5ff&7?>C~WZ>Ot<+{raYB^LL#&c zqqRjD89+tEWN$7=?3e-gAm)KRd+J}%D$js!ny2VKn6hX~NgOwIkl|-Ns4%6YmvM$z zP%wYR->dF;dcXiq<5s-O<{{lHG|er4(6`q^)1Tf%7yl)KlIJ38Moaglnl|*Z*l&WF zZGqNI6pJdZ`X-96!eqPL1kBxmdQrTS32om@qdr#xj-)^wUXik`AG1L_smFT}4jCPH zF!_MOchnKz;aE=-hPcsz3X*$S;%!U>DZ3&OC3BcMJ7AIB%W^>y?&N|>{$&-KfnF&M zep-*E^msUgf0g9YH{#rL%1t z?=@q`twS({!|T)I9N1hHa9KKO4-Sfb-!}v|`lgpIa*&)bK5=@it$H4g%t$WfdWvRG zYA$Is8tGX7EF1uE}MA6XThaWwa2t`wbf@uF0-=6M5~hBwKN$b`2+!yTpp zx|2ptXUple4lIpY=KZ~#8mdl19ViEmba~$N$>KAhd14@AQ2t#RQ-;_oFRm{5tt{DY z-qf*0{Myh3;DH;*!Jqgu`%osbKb}kvy;ng^_DIKwB2-ALso?{eHjDQ30=+md-} ztDjjfqVZyY?Z!h~g+tGKocN_>?QX&muSG2J(i^Zjb$hW;tqX~)#x?Y3Ej?5`(y3qz?9+kQSpVtABx zx_ddx>|%I6JHrDOV+mbFS>&muy8Q=cq+br~8wD3Wa#dBI9tqX)?verfo(@0p zLCWvg$gUeGWbo*>hy}{l$7bssvW9&Go!`OH?426cGhK6JQpO&nJlLg!9=Jrwn0hEW z4^Sm^(ktPdxhv$!$uCkIPywpxqowo9hRl5V4@&Koj`22#1G7}v@VwZs3{1j5`odjT zNDbo^m6#DH>sR|&N1VLsBg&}W;T)~g7$F#4u?P(=30Qsx6>{0IcN5rrrEWx}&8JBc z*%DFFh5fueH!Z?=d0BHl{rJ!a(bM&NS7y3N;uJ}lhPQ=3TzjDB)8?qscO3kaF;>a& z7g9Y7_`J%HbkavD8lOW34O@t!GhB=o{QW$2jmm9bM_Vg-D)MED2NFHLv>_{hl7<<= zRc>MZ3v+1bCU03x2u96ypB`}2G35-^S7oM1v2y!k)*Jc?p^i@rj|VGZ9R2hkI-|2{ zSUZmVZXP{NagIzkJ!z0}ZnfP%0+Yt6w90l?z5B&2?QC-g;iYp#m@g1;ly-dz5z*!{ zXFgrr&io6Si>qw65hhIEv}w!;jjP+**VmeI(%M=_^iWRuF)u(pTehD?S!dI~Go4SN zD*}kjwX-6f3|W+knmx*7Ym7aY77EQ*o)CjP5OzDx3|I0wJrhBtyLv0;SjK@4yV+ZnR=`k|j4`B6rQ|P{}4EUYbpJgHrYGxwsevzF0U@^Rs;nu z$F__ytiO)-n>G+xg=toM}!9X z>kaT<=%Q>|+hkbAD1m=VB67@tNu-&2qgdJ4|-98m}CRbQ57kW@#oaGziq%k+U zzo|^_VKewx;VXvpiAhE|znucN_4}LES`uNGP=C=2b+DJzXy#eQ&=)EDj1X+dldHY2 z*t<4UWX=IZCjsIS$z_6V z*LMKZH9C_LiKrY)C>|gQs`k+vMEIS0;Ij(HPc;lO0v)NOIOVEtW|b0G1^Gxsc(svj zRHp9_{AyI?cmjokvBsYmav~$u)x#}Z)axkq_$XENR&c-YTs~SAFgV781>kBofL$Z# zghbDNM@vwkIJy0rT#7z5dlk#^uNNJWYA-w1z8wurV<2sv4h?w{V* zq^9h0+W(RqwA7c6;Qvi)&|nw-TyCq`d+7aHY>TjhhV#@M6wy+K#P+W<^w%Cia;;7-HV+%q8F>GztwEK$h=j92 zOy5o8E9PScA}X~i+&wM7mejUj8g1K6KUw7h-w%H6u`(0MleM=!R7GyFu%6Z}ZrW?w zkd94589HQFWL2NudX#0LHO^gazSxF3#~aQI!?PAz8kTElHg6_>FQPpUsi}{!JgsjB z>TDV{Y-({oc00#oI~o%%C24vEmc<5%~IW#X#TpxndPNzL82;S z!RDGy13>^bp831?Ubu$*!Ot)MTw^92@JBiBv}q$zzl(kCLwagoiWB<7fpCZ)U5#o@ ze)rLHW1vN}lDDR+u(LS`DKgvo+D>Ry^P7yFmD$pb5;IaC44YS(P#JBie0WZxVJiZ3 zu5T!G{CqF0Z*@i;*-JV%w{PqU{I|&RjBb5;YiTt1C`CL!g+nE9@DeFT?{2Hp_@%42 z@E>@E2&bF9LYcQuLR?n9<0MSZ55YrU`qurlS^ji12_x_fwfTkP1;q@Om_PV-s$Gci zkvU_Nb) zHo0rv1{6WOI3Ip&d_sM-?axRY*sdpufN`E~Q3oe|p>^0#zHcwR{mT4B!(J_e zk1R#si36N$L);{rNGSWRkY9)Txkb?rw8Y!ZLaqH4TM1zk1_1;}zs7U>Gl!%yB_-#w<0r|F+J;syS;*u`0W+K5FdTKI(XE?6FUZ+#xplbEo*-ze+kk zuz`mDlcu7jdR?fZjT|kVq$kE2KA7g5Rb)>R5lWR++hyZbx@wSe;byY^n#)FZz9wRB zj!P~x(jFBQF<8S*jNLKn(GSgUuzMKJSem}ZuRn!#rik&J1s4Wek@{4#y*D^ZubYfo zP%T`J0pbknS!*ao2$CY_a%LW_-7a}@a^Uu6b6p#*FR=v4vfrhY~GuI^wQIq;z z7@-*MEgw0KRD<_9L2- zv{HsbP27H-Y1bBb%*H1{IiI8ag-uN_6-&Je)od0j&|Bi_j;SnP@vi`tUTRs^{uZApaNS zGE2%O%g}%I6L?wfF_XL!PHj5Ib2^Bls?xXm<2|d~P0>y0p7hQY{tL!GVu|UE;N_%c zY>C1<7~C%rKoynplS@yU0wbl`dzH_SjlI*KvA$cX41eg#C~VuZ3n(mrH>`k0VGu+&!|^A>Z(QHcg2-kR|ibV6{6C%+#Q)}n)4TS6`bON1Yf&FF>${a7C~6`9ct-VZ zOJF?!(s(oGH17{^Q-F~H6xsjZmlh!363YQqzzuEaGs8iNtrAsazItS=**YT*>%-{b zr=On6K2HB^!`g1nZE>Nw8!zRGp7eLDFD^Oy7VErPwv!c}7z2t>K5n*ELt? z`XL$-2k4h<$zpyjm_)$)Y{B(YiV}c5k|8NnH3Qh!#Gn`X8gRDGFToOE+deU@a?3AK1pF!f=W9_ zK@NefV(Y$!T5n-S zsM=x2M6xtAAkLu48n}b0&P(Tu;xWC>y0&O$soEH7@WcG*LA9wX*_2%Z(Mc8~Lj6-y zaRF{()e#oh%8#mP^7xHf^ztt?Y`Ol;M)1e4MyUW?jX+wI+0<3o(aH|R-Bs-chp2id zP#G6eoo`JCIr6p%jiE4zp>Tv76|9df)oa&C*j0LH(&*f2MQ*m~)`r;NV^Al@1+e~M zf)|Xe3_}s+RW8@B@cbW?6`xuzN6e+OyMj7~D_tbZDzg){l)EXvui;#spl4&<);*4( z7t+|0e!v_;@z<7i9E3iaDJm zB;kRE<~57hn`A!L=U?)kPt2LHQ}?3>5#^^OyyAQl6bDFwX3!@?$%*=Nx(|r=Fg?c{|^`=XUeHd?T1i?q~KG6~@?N3a??7^!j9(ppd{`x`9m!*0>9c(io zyH*Y_OY@JO6E*!2&K4&j(XFX_eOC4#6j-+GXQ~{x z?Wz%oM0QPe!ov%Xp|y>uwddIMXWw_VtY7o%ffT7bwH_n4Bx(3-&Z;V<=|w?*k9SMK zq`$qUQ8`PZR-lzM<*_=OE%!abj957D9P6)2IgD5Cya~)irQW}4*jCS}=Sr9Ohv{dOecg6=T^ngfas873k z*qH?=$k7xLQDz&>oK?cfA3hw2<60(2jz9Lh^lwwy`P`-U4^(VdzP2PZA8JwdHYdNV zb8~3pF~jY0#qY5xiKBjnKtmRJQ|@Wjq{a0Lp3uIeLo)AFHn{LbO`ZfSoG|#1riLFw z7Wo>5`Ox^5Uc6nG_s6G4=@~dt7_mlt?wzn zq#Yj@cCIarCu#-i?aU@mSM_*KLZ-6ftz8~(Z_AttQ115%$H=2{e(jdVM;Yg+)fu@c z@l3RT8#2XUb1t*N8b467qz^*yL?LtGy*~qjIK`m@PZ=j>uMr7*_^BMn?u(g&5E>UU z!BYDDx6Rjo!XRCGw=2&^ysjb?km)`n$oh)urJWIT2DGKd$k{0A!R6!7gZAx;KiR?1 z^gnKn!H@6OO%us_rA6;5Ny!qr#nq?Vj53}4NF;g98UCkc& z5lvo^vnk{KnH@Y=9-gFHPruDjn)*EH>T%3ci$<;1o_HaEeZw$3c!dZ{WLSQZ8=1fXmg7M) z7Y=k^c7b+K0RtgknU_hP$P%TLrKC&)`nbP;!6pOoB9Z>=FF}k~OD1C_SQLu9h0prp zTS6`04|;36&u%!5XPgG>Q|U4tcO|?gtzZQx(Qf>_bteD@)x5g&`#v(=&S^ja+v;x&K2jjD4?Z~!I;HD>Hhs(9{KEln7Y*5l3w;g zgzPV$Pah9ncSoveIVo+zT;zva9ye3B-vH%c2ANwt@n&||{p5;tJLLO`87Z@=G2=j- z3U)622$WTsjR2KKeTKZwlrIEtc{c#_v|7)<-XrSwBlHy8wtsaK+*Oi{a!yP!H9AO1**GqXYoC9fW^fZw=~> zCb}ZgL3$XB^l^$b3`>e7k)DwU_RO)$DDe?Y(=5Z?P8`zUG$d#Nqy=0#b(VXKL<%jr z2s8%fsG7=Kk6?VF3$(aH)yd>8N-vwIDG96v1A`b<#V-c94Sp_*{#U$ORf#3Kwk)H; z{@CI|rY=OZp?jL&zZgW=?!_|2jqx8Zvp;(xD0#p&`>8B~l%)j(j={fSgYU~He+$Y& zE9N&t{JJiRjdnERB}yV!x@UTq<%41cQL3+2z%IT7ds@hh_22rP=MmHml*oSM;U6nji+|`kmsEehk zQAvS|Ok^_5h%%MgZ+fcaxtG3u zIaKi(}) zk&!OEBa8j@{BcyY?)<8Uv-J*@yOe(}EKET=&Wkm_-?3KXo5Y|r~OYaOR~VhsC?rXE<^1IyURyw7D^Y3911{m$7R zWv`{`JX0UHpyY?SiZV*IwPG$+S0d=6b<;I+h2Tn}V<};C6-TA*nklB<$sr^Ip;xG9 zWI|q08UQ16bi86D|>X%}S#8%*LFFOhJaFPovu%VuC2Sn5s zbypnH#K&q}k{?pM@uZ1^OCyQ5h$ZE8x{&4?6q8HjBD7KzcT%zlyoI!2fn)HLU4Pal z4WTd&26`YZHYB$s^Vt6AzS>Jq?$U4;<9GDu=yq0R)J-ABju0nUmR`cIs)r;(b-XIwUd=sp(ziddCOu4DCC?5Pt#4oEhBbc3v_7&iTZdm66|~Uor^Bq z7~V#E>=qwX$xo)Wv*fsxIlxO(Q_=9Y3f(n>HYGu0q7s_{uk}|48p8%-zVzVusL_Ms zUv6QoRu!})%Ye-cBCiDsY@q1Jy{NPPypy}V56XP^kwJcbYKoRM@p_Htp9d-Zuq?+I z#kna5lUb$WSqnwB@Q(S?F`(c1(;NDMe_)DIa5Hvl-{aKXvXQFkDkJ?`wX8uf(hnFD zlsetzsyL4ATHHq*jPLw_bldS4bda*b=iAn9b9afYweM%%M+eJUTLdg=TL>a%MU>|X zY>>;~(!2AlSENoB+vdEjE?I@Q-aJF5_3A-;Nch_DPcb{5wqBSs8IZKoncdmt85-uY z;KaOj$SYpaZwk(gv5K|S1D5pPDDDc|<~O;5M`!5q`<^FYuWbF$e9$s);bdPu$vsCrUck>9 z)AEg^9RqrO4-6f&yDTmo-mAXHH_1oVBy0u5O@Be! zLeEE8*v`@7=$Ri{>7oy`qNL1E*aM8-vK;Q^fZz2JU5(ZH0lK?``9}O`>Pj>!wXm zz+aF-PGt`yNSoQF>_z65BM2!j;^`-Fu&55~J`YzX*~Z+;*>jFPaR#pZWJa0SH;JlW)pv+q^67+QX6bWL9ldP6bK8(!Ej zG)5;tGyq>L-{&eB)e>}0=&#_b@H)-Z{&2|3-F>}A+(sx-4s5UX-5kRzCIB$JbJoo6 zeN<$fJ7#&@008ct6>pCrA6s`I>#~j`W~oKmF?`?HM_qyC4kNU?Tw?WwUzUFJhzQX@ z-6h^lhGrPC(Gy`12*y%acRTs`n?a>_^38u;U6#tx4~iL0PmB)XHeDpdK#NM*HZHK+ zYPE;23*(k)!^l{R7XP+>5G&q+z>Ale%Q%xSbE^^#x`mgXTydr{z#ero>=tF0~ zn^Fcr8uiHVppcSIC9mC-;p_aFA+_IxBN-2U=lN`V#e!Eo6qdDbW1pBT$|BU7annN0 ze4)YH&pQJB!kJT_Lg(;)uGBHBx4>{rAQKTc-ok<4Z8+TI*nd>B>K$6-M#w49uiHVlm`$tPQJ;MJJTJMz7 zswkFnHTl?tLm=c_+6Pb_X8)x+oB$o_dCR_m1PGC~Y@m8#Voue#VEh@`_kU9&(EneR z2(sVg+N*Q%UC;k4c{WRG;s3F@0tQ!ri%xpEFCi+MPDxE%(lEN~4un!E^` zs?H%{mk!iD{Iia@zXg{9zY5)J8R*${wu!W3V`GcUAGAR5Shq;GP%-Vfhynrz%Jk)unE!KNM6b$ggfJdh_9;!x{G=OfpMv8^u4 zM+EsFLFIav8+)aF6VEmaQ6!3$Pt{&;TarNEHw%Ft(&kl$q^NV9wVBwdDBuMVN~o!zX*ipb~@{h<}2zFU)$zor}>q z&}uPL+T}GJS;3{o(nh0BD&pd5P#V^}<*1OMK=`wqklm4ue-qU|po#vOMyFB4BYWEZ zSW*`KG7)+gjr`4)yv&1^FzOnp`KU)!y zq7)^E5|X?~ZZ3h6RoR5#Tn-dzmQI)>%TZ#}M#KRCC*%0k$(M3Qp)N)9HsD4w6LH)_ z-S#(*2I!S??%(NvX9X+1^TZz^z5t`~!xmw{h)Z7QgFprgRqMh#Xom0QTh&8zvZoOG zrUPwB{ViN-af6OGY_{JZA={%KAb}+_K}Ha$QTr>cx>D3T&^lEo(0B%~>JViI=_(Xm z^mM55hV@_|A=Y9JkTT%FE}m$ZwsoQrK4@{Zx@CVXR=fF z5_?>-;ye~(QIVQDUzopHj?CAbCXcvN;liSKx@vm@Yl%K>CiMJZShvh)5DdK>?Za72 zSIfAYT5YT9VdTXMKUl9P-ODr$+BMJCxD?;hi3Io(YpQ3d?&0(C!xEOQ#j2^Sh3(_T zr0U1GP5DEFAnZ~nmG%-Bekf-LJQU1^(8|QHaSR@SItKAo5d39mUoh~CpMt-Zs;T|8 z1@7Ot0P&IX%c$w%b*_QMkIUuK?SRkCcaN)EmUPHpCVW>e$=)&HGI}hCA}nX#HSqZ8 zz^#2o@w|qp9XB;)?J1liEFJcO3w)2J9t$~+Ovx2!@;*LN1LkQfS>vp zC;p~Mq7)>mwp@&Kl(Je{GVlCytI@PZ6Gc6kvF$SHlVszQqwE>kxuTN(vFSBqryd+k zFj~PxwM#NwjLJR@pdA^*T$V2TgVE}`UHJ)3&c%OEu_Lmdhvo3Uik&4pU(u!^i0c6N zbmo{xT)?N@$FfOqv^+U0{AV&Xg}bb`iI=6~{36x55)WZGVVz&o(jv`x3ICw(XVqj8 zJ(5R@Y5vGk4l7m6C7(4L`TWO_YV-Lo^M8MHbx6$A{52CMrO6y=+WLOvxuOA6N!OVi zIrGyX*bDp!{rt&i$p})xILoF1KVN#2U-ASy&)oR+7$3X8*X{VWO!wBD=$nmW))jz$ z%#A7MiFDq5KhpxT61L#Ye3WE znYxAPXaK+3%X|&KdHm#(QIlxtxm;r#_Hqo-(QJcUe20uVRe8nm=^LULbM5r?bRH*N z`s4=xoEx#eTRwC|?0b*g*V2>c389ScX9&v_F!Qrer@@ZFD#<@_40 zd<$;oK>d@}4OzJ9niqbqf!Je%jZjp;uZC4`Hf+z%58_t@8&SI7`;`65t)=>8K12!s zlf7AhPWgXrHdGiPoC+lq;JSqhNI~kif+)MB&%-hmoD^wNsN-lp)l@(n>SPAfRiVtV zRkHpdlxd$pMrkXge^AS%)IszxTtY$l2wZq$#iKxAHL{EAe}v=LY~&?Mc!eK4!OHRp z5zUG_+;AIzKR=YZ<~l!TXlhj?i`wLBO{u582rcj*lbRIIh!#sQkHhmuX}X4nYUr2n zvh%+#$n8h{m9R*ao%YdSI*+N-5N24xOfiLi)sV&Sa5T%Sw#A-j_x-sNgB_f-RmrBa zY&qXlSve;2319w`vz7zxos@GDQ#`28hw28tWR5IbHycg&wB%9TVIMPBSGkRC)m0gA`rDcO7;3S{GV`zpKgR!xbI6lwx@O%nBJ?nALk%-UA4kyp zJWuzE<@yTQa#f$H_r&&iQ)U2$$yM;qj50Cs-dv11h zol_?4hrElcCbN)^yC-yPz>TvuscdS)FV_bgE>BToAQne#+o+w3Ofh{2hWn%&f}yrb z>`;GIXu;RRB_iK8ccQ_zHkVI4+O<&2T)ID9CZ4jwHvcvh#q8IvWkq65bHHi3_LV8t z=ftMfTc^2JH{AY($fWM2NihL=CV3(r*%>OF%DqSy2TZSG*r3j2kXt2QyFt-c-h`}B z{}m`T7HoC?=DbJME-3>&X+l8Ew?YcQ;*alPaM%*^JnE-gjM+DqmE*7IF^0ve7#;W zRKA8|61PT;B~5^eMsTS+QENB~NrZ*<^%5`JJz>3s?HR+MJ_@IH*3+f+;y&eX4_1${ zx|hE%SrJJ%iIFhk+vO>vKB@X`blW*cx&Q5GMKlxkdDZwuthc_8&U@Q?z@2EJE_+#g zM|+GieOBvi$!f`p*JIOl+-AB0RZjg#FeFm~_v?4u5nZivI4G) z&Q?`E``sOyO$T!05Ji%drf~iD*r#+hs{55F6qC9QTltQ)K&Q^jGsa0=Ep+ejW6!M@ z*K=j-l?A{`|2|)?g}y_)aHW;{id&cXB6k&P9E_tXAF+ny+bE+S^2gCfzCq7kSf?)J zM#t3-2~WxB_P~+uOgGtmh3%P2HtOnWLJI!~>(mMI1{pydQ)6SpME4s690uez;{_X`57#f1{P!+LuID=-{m$!H8IK5^L* zrQx1JG7w$ZPae@vtb|ZJo3;xIJP-U)Y&SJ_%>2$6N|V>ai!nDYkJ3XsE$=m=HfV&O zXWoajfFB%jok?4NZBvl>MijIv!JBN2Pk(OnVQMORUKs`Mm`A@#ouPd`|a9=EsSgQ{?5GXC2HX zxxp#Po`x}kOH6U+6TW?@5b(dS`dlTpHEo+(x56DOekAA{{p1$wQBhB4{ZPF@^K~Y7 z_X=jYIOk#is5Ufq zaVY#mLWF+h97M~5-GJx!lY6C}W5v-2$cO~dZ;mA4nv*I~_Q+Swb(mdJ!qW%YGviXh zil_~{DXf>TEV+TR>_yoT;SU!cOnninFQS9&nGF_IM%=w{*}ZUilNwU}(2Rp9q2d$- zmNBm)cOs^cT&pym1Cb~E)X+Vz4+k_Z1vS0(Kfa0PP~jOtQ<52@c)i z_8aXMpU@}QzvL!TN>0Tuk>wH>3UXC$dJ%%r*_>i(0ML%_Rfw_&PN+LFFa>AELqcv| zU^iaV+KGI#Nu#^PN>-8U`-+X7w~_nO5e8)!rDOTu{OKmcmNODB3kMl>UKPV;$@gT_ zdDtKXYOtFt0>?!_`a2>&h-!D?e9u7ezhp;6n^G`>D9k&dzaK+s;D02?$|=`>7nc40 z-Z2Gk%hDFwRbtf0tOc&ii4kpGY=Q#t#o_Q^}d8F01 z3;UM2w^o6%-2NFP;58O+v;lkhfDGDDCfu~SQSt|s+@+gT%dV;}ou|cuj}*6)xa^7W zRory%2OLa$y5vz|h6k~dSd9@!kr0Sm1wdbE2Gh$;kO-tFnc=2#6P1fgqEqMp9U27S zZKlBqlPQbuW>-fIht(!d`Qk04*6F z3)Rj>mL`y*oof8e*tF;Cd%$5XESs?jZin#HwEOi}$WyF(Z2sJF$~NUPzE5IfUFy`l znQyIUWG7Q*YU&`ujQCVD-HuetI@4NEqsfJ6R!Z@1MwymU2Wynt7r`I8mzOxOYp@cz zWyLF&G`-PE>a_(ENm#atMxEPr!*wP0PLyjNC!rO)V@bcwa;~hm2F9+~qQ=5yeUiYO zYPy4SRB{!F8@rjMtqb@XzGAM!>SI+Rl8Ssrn|gfrq82l6amRxi(*7tk zrr0%QkDZ!h9>%c|EGW&rC^N%Z!Ris5)Eu_Aq5LZu*Di6iy7gFlHJ+K2!%0w0ZZ~y~ zyUAFNM%k$le@odw`lFa`?I|J3OGDU(!JQ?#3qLs9p5*K(0%84FL_e69RjKx6imyxI zVzlOArg5-t@Q=tQa_*x=2|J)pcU&|8jsG+%*DVSm!C<6IEts76sO+NzeZ(aM|A6}7 zQ_U!r<#ZUyBE*S%p|WSFSV;HjXLtJ@7?6kPBxU1u)jhY@{GE(EnNjRC4n;NBd{5bZ zNHMWFk*_^Aeq2UmKRiRP@~9lo!j7$2@tZcaT?cwVs+mk;KYo$fJ!-^yWs&5DgA!fT zTw}eAvFUsEjlWG&eahAveaKQF^~AJ*Wfry~agccL^HBv$>VOO>-+f*uZVR(p+kwF) z!TZUqro{*R%p}ZZWXf@fZJ~fi4n1l%>BbLH#Qp`6%QZ7k>L(~Itpb3o2*DkZ&~phz zbm8<|INe`iMglI%>U)!pn5UY477@HCL2q7kG+2%B8?Wpylt$@fgY+;#gyy-%nBRFq z2wYmH1+vvFZW`b*hOzHw@c*ES$m69^mi@ePVDx9}=jDyR zuLvI5=3bQFOGx-U=#NHCtkK0Qi@W+Qf*Kift=MEMyQF%LHZtV%fM4mK=PE@l>DC5) zN_&!NriG*Wd!y$dVkge^2KOA4L#arN&mwD8nVzg1zNFSwI<7IV^U_J1s7oEyULLm6 z48%}q*Y-n}eZ~`fviRjs1?xo8rrp0Cs+(~vqFrKeM^ANWVLXWI5TWS)lGwO6$D#Ao zjp4IwH&tEiI(@gUlDi%8p}M8KxU>v73z)UTdcwYSg^uk(x^n&p6$DWooLlq;wc|a8 z0$SJcm)KeVpiCU`snEJ^`p^0PdwOyy&fQ`esSV2zoSR}sWKU>(;QLdt{wWMj!^@%V zsMf${c^MbW2I!D)e;Lh~I_*4zlZt&bH)#RkwqNQyUgF&nuJrzc`trzhTgK8kKRAYD zKY>eyk29juQCLle1YQ7(wt<3gr8Sln4|DZ48>He~o9IXW4te8j6%{2FcZrcO6)v+) z*9!r8k&k4ltvt*Y)6Ug1?2clFr|waUv@Dp)vVWK6N3|q1(2s*PNR|rqkfD=vgO(>H z?RQ4C$e}asCzUtbRN3#2i*2&(4nyaUMO(zzB=?Kr1HAPSn`tt%C^-`!%C_0@H-C7a zMs?|w3i&3lj$i{3=j-43-fic>aN`r@io{6{zl^heEj#yVjHt(e$c6k6c6*>jEix<6 zs@!JEw)1-_>GABcTDxU^rlwW?sc!XldijQ}CMSN4y@ig6Q@}aHC?ur|*$bfsZ~#Zp zR`nEas~V21AHAy`wC3jNU0=V}93{rjgjPkos6Q*ii*^ORqS=*Qk`o<{nba(qTPu8t=jKe79z zWVd-@nySasakV6Dg;UYJYJ578lJ0<;Ps+Rt%MjzYPea23n%&Wm%zA^M6&(Wij6cPwHK(@>h)^qK;Ct@;Vm_(H~0%p?@J|&iqwf0>-`Qp}D-8N$kq>X+O6Q$Fc7i zPGjzsLpKS%$fL&Y4G;OcZIk9y=42YgVpI=(5TnoKN6OzT^gJon=#S~oHgjAi+ z0vYAf%X1`|Y_L^iJFPy&!nUCNw^>9S#5cqtD-NWphT=c$ees9XfV`;@YETyPVjMei zX*0_$Kyg65pF+z@9TC5&!}Ssz!>SNfly3KyPMGc$MdFKlBLb3`X*?i6P+Pf-(d5Sx zq4M}1nMH{{uAmUvl1AKfnd3_reLn4Zl_zmudgUhD9hoD`{GW)<|I&Da zAG~nd@stb-|1$EfMF^w<_t4aSSxgH2?Dcke%45=F(n@&%-*x;{3T$iqC<-8#I~@S+ zXj;6u_I0Lps_j=dj{}^}aqHQ#9L{u{7g0-kL@VDREY)kwX8hAR67f+QP2=O#X?B$* zC8RSL?Kzf5Y{$oha${-!N_X|GL_{(9joYGvX4S=_D}-Wcxe>ZhnIG^r87!OhWhX_D z0s)!-k{F5L(~@Sh=-D_O9qls8jHe9$9!4`v?ZZVom*H|I3idVy+@(hG zTeW7(*OX?a&5z|*P4ljE@xQXac3pK`>La1e4__BJQ-0AJ6K944 zF8@0A;S}-U8}?bmWFQyeBi1a+l-!!?AHg=`8zZ^Z^|9)|#;`dvTv1FM2*h2`quUr%$#jmKQUz3!G1+>$t{TbOK%15#e;M{a&9p2iUiq5M2{lO+ ztk*;EP9qu$rc^B2+9bD#;qW6ychE8W95dlx7>KHZH#Jv!7x$B8R3>v`W)>ydJ8A`tC!d^n)bV9ICHz= z;cNy4^&ftusQH`X=7}Np_Fz*eztZIvt|`p##&u1`spRD(*2`wC3zzQ^(8{g}UHn5* zlRTEB^_7aamyGm%;x3nYHse}SFZvdGHE3P7Hs~8fRz0zEYf|{Z+VV$+n<*AAo}XIJ zb!kxeVVmZV*75#NS)#y|qZg)%LnT)X62;bCeJAPeM zEE~fopenUdT$LTe4d)yyzo_R#&-r$(PT4JApel`Y_gI-0ak2Z}H{ixa=aNzrO}nmm z*kCmql}mD)(<<~-zHcp5-51*8O}coR$s6q^Q!x-@Rjo0Z)zM}-%^k-K3qzI5Bq0lA zW9`kxSZ{24ap|X%+P&9n_mXOp$c8&qF}WAiUYvjDWVu?CY$O#iWU9KEjuvu-X$G1* z`D&n{c1`{z2O1vWb3;JrD1Kzz4^_1`vQ+fSE-0`mZV*iP2u+bEb6ho~l@3^KqYKi& zq%4yqk$tE&x{2>o^whgs-cd~KPdGqYb%*a_lm1BWly)b}bKF}JrMtad0m?NKWsLjP zj7%hY+4P2MiMt5YRdxIa^$C8`^A;dWp|7oVM_UsdtPiEmC7hXf7w(bUdzX9@ITHu~ zT{Vp;Mv%juOExc7xTtxEn77X#elxq1g}MHUgSPf5Mv|bHj2GuDfE8q0d3wiZi>vV? z;F?cZqFp`AI^)M} zHFZ}wsU70Yhr_E#vS{Y+l5!)9bz!P)RwJM`f28NOL%2(4lohIR#YVDn>~~CkC0s#Y zZ29|hN(>t{a@06S=RCLb{PA_fh?9e;$v-F@_-Kl5f=vr0elk;=ccNR740`}$AnJ8H z)Ctq`#C|}$b1it3a68xrN#673NgEw{u{ncmxd%FcmIz{dhD0L|4WFUTfWvRHN<05*o}hr=VSQ*B?M<`u(qbM~#=)a?=$V z8z+(m&DpG~-}r@$muQn$hnSeK@Xfv?g(j+RuQFcK3s-EWGgEy&hgI3z{0v5Mr4$9x83JR>z_<>D zK$4z0J5X&u+Am#w7Gj^$)Yb$sL2oFntLt~dbxz2#=wi8*Jg|RiQ5r0_w!8`u{(Z(f zda!x<56bRb-jM)wKg6zGAy1oA_QH9P6#JI~{9S8wC6UNpGCvi5cZ80F-7o|15;HyU zMs+6c9~4xl#8>Nx$kYps88a(*=~MlgAthuIEQ6F0(phspSa;Iq`?eU$TjV!nV5YY9 z3-JXtb8zIYMoK2FNt_qBSyn(jVTg*P_cl-W{ykooEj2w(b_1Ag*}~PrhFSNmyG_`Z zb(wAx9wH9|`nMH-AN(nuF$d6Iy8al7{1&telgp$@AVCjd22VHOLv*oajTpE|Rn3JK z^`faLE+qF0d={CH*V{j+Sl;|U9W#Fly&tg8%piD;nH&$!r;z_HK~=MMh&WZEq3|1erAdx21m95bU-~6!YOu{Sm z*Xxw=$%NbEv@T{%YHyMw4Nqo(D6UlyuyMgR3%Ow;cR#@%x+8WU( z-{W1f;F%BES1WMRh(TCDm^6s}LHei}@=IjpS}nVP%{A5nx>SW^Be0s!w2L zQ88KAecx~6s3c+tjw(iZ8iC#Em7=n4W{=jQG%v(#14wCMH4n1Cj2hYyyZ^Y=)If?I zsKK8>k&b1UX7!zc+vt1<@0piLQeN*%#Drxw@xn#9p(k`OTwBMpsuo#M^B&PwCD|vm!>F?ZRnOH+VZHeBQ4#0wB(ERpzCaTvyv~;GiXS z#zo*b2vgKt9-`O$K*IF7onqoJuZdG#8CX!F91h|Ugf<`x2NRrSroL;=>L$$digyOb zHP`PE(Ki$9Ct^`MT>|m@YX6Affy{nndX*rBVAIohBM?*@Z%8xO;*|&AxIQUGy`C{u zdo0kwIE&<_K1hd)S_OVNX|XX`z;+R+MSz48-;{tMI9az;gFNf$VWvw>UwU;8KkG_f>yVLNn#bM}Oq2bkYId!qnass&ZcL1( z?Aa1EY|h$DuDk(fkL?oFTw7WujC%AGo1H|}dQ@O{n?qUkP_~m$sw+hdkGp(hdzRU+ z=R)C-UZhOo4>(Wq$dgc{jna}<+<$Amaz{w{UR)5xHwHdIgmX<+qMW26j_RrAPg@7f zDP3C)%T7CwJX9?be>ymNEOk@;YY}cxdQ+@JjLw^ln!7kV7^FRqi3T-idluchQ zZg;*VLgL11m$Z0a{zQZMcQ_*S#DML)*98i&tHKR!F|Wj0L+!k?1@sTn6;DC zRXayHpCr6ar6Fyn*Mz>9=!Yr+3K#jv3$iu`01+qyyzw^ zG02ZNEF~22lg1qUeRihB5aQJl(I37SrvVcGbH?`x!ig4XxDYGoNgg zR)K?BWvgCbV!3f?vnMK}8PY~q=Ro1Xp~ehI1~vy@{!-R=W!DL8|@#jL$&9~*Tp+B4)L*> z**Q${3%|+WIJ9a{$qrHjkLyBm#l2wIc%PjcV0i6gWgZ1q*SH{N*>S^0$5Lfuc{1zb7i*Ymro^~d2-htzO?qEDW=O{g!i)u=Er%g9mt5u z{nEfhh>HOwcN_2XqW5i~^Sl*%qNy<^sPlvAObLF1;%2GylO$t#Q`l})WyxBfE^em6 z*;L)q!)y2rrp$(!+)nO}EdX%zg$%0k2HwUVoAE*kOY+-#;M# z?#I@tdv4TwV!|c=L1m<}hsFhr!84sYf@o@ovW%jQzLbKj_K^x4n=Gt%VUHQ5q)FFm zVc5Z(A{|VrCu|a(Kp9;jd)PRl)rCLnsL*2hryHgw<{qBVcR-2)M zrZ2KY|xiiv*U1;l$sjnKREM0c788PR#*JU;}6l6?S8~ zBi!G1ZCi{4|Xkiq}>Ybl)fL3%-_jwzlnjvT# zX8Z3h!+fB^eJC{12aMKY5Ym1g<>kY23K$ep>UF-|BUG^hOs{;OS^D@1F2+0Tq4qSw zar5SOL~fpB%J^e{0P|2uin`?BPKLHor$JqCb)0yv2Sk^2CBBgcpPedg8^dm8@`O9&LvH`CvOy#;_y{>rz2Z%D?STd!vazlXgKd4#vfK z=!{Lg&+9x;;-Tzpuo)-r2juRctjsI%P%;B9?@l>_Jh*HBpq6;&YiQjC(9zmJ>YN{a zkL3}Y?~DXs2sT zXIZpUtg@)VzT(%QZTYDx&28b~ix74Z)}+F$=D!P%CR|zaX4f)bgf%MTKrEq&rH|Zw}nbwqpV(~&Dy>dh!l(ITjOC=cM z7F;=+``LKg%r_$gO!6~di(K@71eu#d?#G1hw>e4D zNxp^|U+Se@e6`eZMi)Q)ARTbN-6WEQ0W;flph9OyaB`(hfOsRD#<$fz2ntGTRWnma z7q-2+id{5AXo?AAD?V_(l?_CjH^2wR3>eD&JeMDqVT-^~q*r--@&tniId{NSs#{m2ir z7REEk^kTWva)kl%?{~Z1M#ONvRq7P+deMB9y;exQ>L8`NjaR8#WX;{){%dd$m<==g zs>NHXbEarrm8Il|IskdLXbEW$bAaOHf6=IsUT@=&UsW5SY5%EDdnD13+r?yWQk7So zU+i81;6)g2OTx{69fufF3=zGq9JM*ajA&NFE~Jzm%C1-slVI@eu7t8ZhB*6?NQ(dd zooo#IVtwo^jLIGbeW8;+-8E;PAUfWNE3x3AXr+g%PV<&aKj+S0!{xnf(#rH6dnuDN zj7LE9m1ulyO+7yx9M4ahinz(Z$0|zbnf+xKELFo$L_d6#^IK+-9%V$X2jd`5;_*ZUpr%v%q$lFUv-ShvC;( zbAM~>;-kAV-W_lT(@X9x=F`fWHlb16P=;~K}~B! zJDJ7t4{3C*G)>U29reV1)_RN=%sgA}Hb`b~Ask4QBwP+Rv z!PdxuAxq_^7+a1L8KU+9Wf$81Kd4{Tk6ngV(wopG4@aG$`l(cj1(sAt!_eH>(@`o7 z?2f3X_)QVHPH?KNlK5lgHIdt&fc4n@KOc3Ee6vbTF&rwot%Q)@G%Y&-SiP3RsAzIq ziosA+4;4PAlJ!=IU!k`~Y?>Y=fnIs-flaXc8&6ob_GAB`(gKlLiSFuczyZ55`0-7w zupJrBr^!Y=c}+D-A3=WBeL+Y!H7AGJsLXoRfkMCl-W%4KfVoOgk5U+wKD+JWv_E_1 z4q2x^svYX&ZlE2J!H?sP>tcS5^+2QR~7LCA`dU1VNu{ z#JA{u>C4I+r2aIYB2AT=;>xkoPF&YN%u$EvoU3O1Q+_NpUd8TRs=jY)tDOs6Va{i+ zlJwkIvKQmHExocW>bvnjvKN7wu3`j?E`nC)DgzZ8)Bm8h4uZU{mAcxbew8I>JL?rC zE#A{PxJvg4Fn80mWywThPXXPmz350&D~r7xKHOy#(q|c39PV*XZt_Ne$ByM-YA9$?Y@e7lTSUH>q%Y{V=?>P||o!dp? zX+yH(mqk|vW=|k_=h~1<@5eAyelP3bj3-AQJco7&AuMsY@RZbH%D!6SY7q90o$%2VSPi{k~6R< z?-M(PsI_0~!<2VwDCu`=f%`s!T3-~V1*;L$a^3PJYvo3L=@!~vs@y{#U#;u(ccNb^ z|DcSw6crRYgaUoqERVs$m$o;e1DpiZM%xE$O$FJ;ulN5El@9O-7gUwx%z^uRJLW*q zyGwv!IF3QC2i2Y^jp%NJ9NIe$!U5*1S0+0Ij#H;a^M>x{*aJd)`)=*Cm+p{Lu8;;C zN1M1O$&X*)J|Vl&z9jV$-7V?Cy;^6F^b?N|*|7}owgGP09a;RY3LY5z_EyCY8=!G? z01#WW&wbLN(*3siwS8?FT3!XEzW}ax@H+nYNvviPVC_q6#$XZ=YF3I4FsJ zQvy%mE(`pOWGye)@Q=H|^!(I?D)Lj4Es~4C&A`-`D9jy+;!E7`TKLMQCXw)%4J{^V zB>&$sKZGl$f+&KhKoynHhu-pO9Fx~BkNqY)3$5vFN$d-(moxwR9`-$ z4D(e@7`47URwir?mqOjai!}QUUB!N;6<)6%-bhFaBwlvo4BqI{2WDe5l2wbL!ZxW$ z!b7I%t)*)ChqJH_E&zI=WSKlSWtji483`XD6-xhsMJwxjP?z)=^(R9>JUXLXNp&

rPPQJ^~S|xd$Zg=<$VJ^{OM?)i8~>q{S2|{EhSfClK^@gWco1l17-+TgiR?Amt>-`QVSIZP?TarE6{vm( z_|!pq)78EfMA1Y2|9pXY$^U3?PK$mz1&!ebTo1)#phkd0JRyJNWJ5|t=T7>O*^IIw zcs<-J0ox+*i>weH>UGSD)25WrOjI|eJKVJQ;uVTFO5TQ>zbtc&N$T*GzIkxe`&DC9 zHDo%Q*SUB1+Sn(d)X+oiKd@JM;$Dr51UlZN`Q<cdVS$4T zvM1rFMEJ1heKQx$I(zYGlc#k7FX>SZX!#YI{C^pY#B>j@*0D`9pOMeh%Z@T3M9>4p z%H|f#l-vVd53!(vLT{uP40$@y9F9y0M6-_rr4rF?E_q|jEQbE$?UXtM*ab`XwUsWJ z+yS8(8_#TMA|G|VmF3L&5G8KeFFbNU>S;=HC`s;Xxuj2VDC(`u=Ey}4=Ze30-hubk zs+wQ3{3hG%D_ELBBp_|hwsL3~Tv#llsX#Uh!_>$p=^P+EHL^MMwbsKWPOSs1s*H+~ z<`gH-MKs~c;FtZS-K9?v{ctAp9im9!IV}N7@3--=w~lzZzufT=y38K++aIl?`4L(7 zX2dHNdu+jhi0|JMnxD#rB*SGeHS517dn{hP^S*fimO1*LOTB&toe_mz>ycqVaBM|J zXk3mk+qUf~cIM47S#BuL@eV21h~Pn^#_no6p$|)MYGYJQed0WuQ4nN45Bv0y^Y>=E zVm(FFzDY@Wjp&|4TL~4KUDHE;_KGJ$qk#=FcrV8N`9(k)Mjvsw#aM5z zuz%&zPUKEYUYw9?<&=BndA*#uYDNFI5z<2V?u#zSnPeZ(s|%N9Fp-}?Wl+SuaU2iA zWjaP%m)N7bklp1q5bb+~wi4zUA8~AP)!iy^m`QG)iA>MTwMe=V3FQE~)FKHk+4r6r1Ok&YsA5An zor4!wWQ&aS*G@{NG`~{%daP_* zE@(vmD|8f}gi)u+U=B5>loo=13wDYbYz!kaI7? zy4*`TL;xD4)W{%|9&6?|^(6e%{zjE6gOlRmQ2jR!JDc1T9;*7c&??a+ph4z5S@p25 z(e)c}u?V=Dm?VJ?<9Cbpfd z5cr5~<$E0RQtETuFdOQ|i(?XP&?Sitw+xg0kn~r&*?D?w?5U5FAKlf2maxPadoM4U zES{=g00kZZhX5>vV!LSQgS~N@(-J$U262hEjt8lWQf@bCEmB^xEZTu`b2ssqVIMV# zG%2_y)2RQTXae*-4oy3<*w&+@HSRIDieN;kZ9m{_pQQ1DZN2f)WQ2z?k?#bxenlaX zb`W?LnGPuQwgT`S{as+$XcB+(MierVtTF&ED(nhSW3+G}(GS}asehE$76H9BG+UHM z3Z&Y=8o0c&`ZsyRMgg;)rws#p#V?~2K|u2TPON>8)Y~1!aJ_1?Uf@kBH5vK+jFIkZ z);_|ePL&u1PkS#jc5rBnS@3+f7pU<~2{fXa=4G|ay9eqwo%~tE`j-9n!Sj-3 zJJyqMA_-@K*yoNZaf#b^q}>)UuekO%!zWM0F!2DQ*w^D4i85$SH)K5?UbWI~J?Za| zQd3(=ez<1#7YY=@CVuYBz;#TsAu!Fku^2zxCy_^IWTL4#fY_@AbUx;PaR2UAR4-%0egzrLJ&bEmqWynKETC= z=>_)IG19Kn;^tX#o=p9o^-?|ZXB+H&_TfsUPAPqhNl3%bc=|WD$w`_l#?`}INgYh_ zs1AJMI6Z!DsVC8fO+`nbppx45AFS?gQp0FUx+lufT2eSRf@?%_^;4mFS@>jMr{oex zwZ@nON^ue$-9|OV&xp7M&Qu{7cm%q58-5iG+0j`H{LM0hK{JH;9^1g(_y$1t*N+UY zi5zq41~K|bOa%ub7tV+M9_)upC8qjWk^vIo%EvtL7o&X$tobu|CR0}Y);o_6x%I_$ zxifp1VL|x4Jz(7M^i^r!wx`~@gX%@al$h=2)`%})v0Es4AP}Wl*h#;^oBe&;P%w16 zqs!ZRvt`L>BLy{}`6frTehk5!?=tM8ze`yN9zR^rskP%d`u zW+cYX&QHEN(0WvRgvvp~$$Lto@Vi6F%cs~ilhA3A@cP{t|37VNEo>b-+_PS$Rtkj zM74Ji_~z%QvRIwY+WvYh{10j_ALq7d{KcI56W>97Z7bwlsRW>0U%uVyPWAS#tOV%w ztmW7KdhCF2>1owL|AUFi;hd-snu&RE!i*}Y@yCH2ie(?gmLROR?`U6ac}=(ivG%{H zO22688!rg|}MB&)b)Z|rm; zFibBpqy*>NbNRcp8BcVX{@Qewf(v>fiImOfQSB8Dj8=1$<_UTx{WB*U$qu_q;*YCl z=5Q{9@c}1C-EiEG?W-PEfC_LFhJF~}#?p*ux>a-`rM+}wVJt;dtQMTa)hn0FuLbRK zz#R&TaI+p@J)EeU2K1%e;0L&?a$K~DvtO%9%~P3QR&t~dDl(-EBj`pJ+hGOE%{Tg} z5#PvieU6zNG_#i_+r)u3=BF+B6^c(aA7rXD>u*ERHzhAB_E=WND2R|7*v^n7a?lzj zC;e7ZOif)wmvJd|f5Om&i9lPXWi4grR~7+U_w zH=t?QLM)AI!5JOQsN!&NlxVQkR+h7xc&#ex6ArPoI_%Xs&~G%LV9Ll0?EfA#t7eZc zugKIN#>qThrEVKAK8UJy+FLc7PqTy`BVJT^zgHAiaKKihw#!FEwGrKhfLX!rrX8X> zfmTW{yfdEySF?&CDOPHYH7$ZSek(A+d9U|BsC-U&h`~Xovazi%^HLLG%* zMw>bRhc){D<&OSezAc)aw*k0Px@^AnR)PKp6z~B zYLI@}QM0NYutA2eH|}zJD?dm@0Wqfl^nF(nZADm@nk&f~0IX&fk9<=Bj;b-al)CPL z86Rv$0)57JnVLIkqDjJNdn-|o!f1mDq8k+9yngtRd+`sof2vs(AFEuM1JAWQHjn9A zYaRRNCiQ}kws zn+mlkcsIxKS8iFw``5Iz)6iz?9eCo|SRgI7Tk+Y|35$I}?FOp!=h(bfzQYw+xIxe5 zdV~JIsk0bS^8%zi^R4?%oC?fJx?WOSG0t%h-d1nT1&g)TQuL(E{z>K0u5*AJ#IlBtuG^Z2C8Td{0cCn64yd zXZVCr#{a|KTSm1NhFzkelp>|2MT$d#0L9&{l;Q=728R}k7IzJWBE{XMxVu|{;_mJQ zDNcZ(A)V9tzB{w#$6a^Uoi%^v-alcj@SZm(IqymKyPy5+eQPqxPo8sb^BU*tQHadZ z<&jlNtENeyv6ogcyPCebXKIXLp6NFZxH)Jh`p|4e;Iw*7me1d|t${t@StOorxr3XK z&2qDNd>mK$SC>XZ?t85y`uIJ}AT6p{{s=ggmx!sw?qay#P+yaft$BiiX#cce3I1B0 z@muz%M79on(nj3e@wQPelfDuMo*Hm@n=)Qg5VqMs1>;ruL#wwDM=-l6W&T>Ab(3gu zp8A-`<-R_;)lhFtlW{XBtFMiCD>!s>uKvEb@eI85)a_Ayz^>>)Rjts2^8SJ-N*kKS z>Z1gBywoH`AfP}3yD5Avjw8;As4zYj_tDR5(mP0MMKN~V;D;Bh%GPebAy1^)s1T%d zJ164xvm~VyF68Y|`7Y~A9es_~U^hc>i~F`niucr8q8*gjO`1a)>RiYBcQ^eo6-!9R zY+-{Fy3%sK=G-=aDm&SS)^jW|7DEjdS_8!%vyXH##&3nXsp_NWljtcPY2U?ZPL9Mp zaUDEWsaxMk>KZtG=jw`45b*W#P%o{Eum3UbMP_}i2Y1M0hibZc!DF2X`5($>GVc3o zYXdQFNp_lHlm{`~ku6w?7-|>(lHdmxJ=LjAm1p~tDWcsjB0{7TRM4Mg7BEXX%PP)p zlGhaT@>_DBYo;#su->A5Vvwb42E!0}3tOqWDZ24NA`Z6N#<<2>){PWot)(FTVD!X2 zYK6Q$!7ip-9Q{W6q4AF&`7euYcKqpaSG{mG&6-!wY4PQbtjdU0#AXtQu$cOs=JE@| zLU$oDvF&ZOx3LN`&t+I-);2_~e>`-)-ZcR<(%v<|ud=XCNEsvMssOKIWT;$S!^Mn{DN;vJ*;D zPcBFlne*1RknvGFp3+0^$!5TdgU2n%X3XVs?+BBv&1Y3lMVuy>wi?=)N)B`rj%uXr z?;*8Zmxbfmd6xQj&Zr5pf^6o#>-SeeCaMO=FBy_gS)Qo-`Lv?yH><3;^M}AmdL9&s ze0A6G50A+G7fv(l(=ryPDMZz0j@snm;=2!Ayng1n=!SM%6=A# z*z!J2KNhHW)J+(veDfpO-$zAvbk5pD^T}$My49f5lf`vQI*M7%>2f}7Tt^9#jXffT z!;#w$-IOJ(RquPsBrkivs6nJflEvw&lwL^!b|K&HAC#f_Ca*2+Kf*H+vo|H0t&J=M z6(-6c<&Fr)hN-fUPkyGSq(nfX&+ALRx(IG2^6T(C7)aAVdF)_abGU?CKq;5Vu}`Zi z0k^ci#Yy#mJ1t1wG(J#Ej75R%{=KwzDbLj*3g-m`MJWV#X$Z8tQEjQ-{|oxq%yKh7 zS+`j4Wsdz?c1ihEa^GkXf+Qqk08oj)D$+3MvB>&{A+SgL3+ky*KnWn3&$Zvdxf9l~ z&5Xs9D~(|OFE;@_q6Z&CvZBl-ECnS&F5{2=yZ6g z2dv)wqKvL~wlv`9GMimF`O<`jRIzETug^NVeH>BJI`Qw&FtnunrG0<;_IL&!Cw2OW z$o-o7(&(iRR>Q|jZ#od_w?YoW?Rspa)S6Xlgc`Iznh&Gz(nVTdI-#(yVQG~Fs4-zj zqZ7ACnNaS-3w-Q7i9nC0Fa-hgddYW~lP?Y%t!<4rN{Ybg4o57z>&q%z;Oi*MjVAC) z(bJ)!emcQU@%ke}J~(~lcU~RD@V`rk- zS=#3e8}p1SCsnQCc3x#U24f{h`(E?SySvUkqa_Lz)J)MnHqmglVOI(@4b*h>I8pkl zBco-M_*!!Ro1Wo>d2CL5K|z`4_cHIx&aN)d{D~WqJjV4JS`}1w1nTb*IRgPbS=I_j zCRyf1u4ry-lFC)Q8-XW$DhpDY=R9>tsb7qY|F~m=eig9oK)y%Xi)pbwn^`Am^_N4~I-ioN3(y_EfsJPZJz^>wW*x=x zb+a?01!d*^DSmRK`xEm$R3FN_nLv?3wdncud158gvQ7Om;n=A_FT`EODluLpX%pF=;cBL@?1U^3C5AmN*NIsbmiV;rW+VtcIk_DJCAAIr{YPVAh}C!~zU0M|-N$+e?T z)Kv_Gw&c@Ru?*o26^wqBPQjtL=8aqwB%)=J(w zYO|1O>)#}fK1>0jJh9A2hv5(D(CxK0OhDgYmIUY=j7->LDFkdFZ*lE1PHGF~W`&h-bg< zb6#7JAVNy_NgOab7&_$qX(%=GosL)`dhBGx!^(XXaho|uC(tw7eJ)TVvdlru5#)=j zQocf)(`!?oXNp;`{SboU({}Hd>6m(k(jt96u=sZ1itq6{wo6BZ5e{S%5@?sWwu{;u z7I^L+!ReF=#|zb6y*^qu?!b2Dz*Q_*+voY(Jp0L@(zE+pBgK_OhBGTK&?aBjN~}3s zD}Fb7^l9E%FM?msXJ_Vkuia@41SgEuZulW$mpG+X88<*#Dsc4`UiqWV?JP|JZWQu$ z?P*^KHq22r`7N~oEH!b81jz;mkGfDN*%TR{_y*QEA$#3tjdKM|4mApgkga@`Tj$_zTB~T)vBI{^3Z~&rQBQUxrg+n_Mk>RzKHV6DhB?fo zq9G){*UUUV*O+99lMoOw_y%I_n06pb({C?cudr(_`{ngxh8_B;<`3 z_rCrZ6KxQz%w;5CeSPTTX!cw`5uE9VB07eWySUVyeXA9~s^l>-J5336#~2-Ap-3F_ zns=eE9@ha^sNjh2*gHCULQFQ*uf&AR!8ss#k=6&6h`N*-5=SYA00YYUkvQG{ub}>G z&pEhgOF6H5PGmJvjZ?cO_#RSuq6=AC<;V5aR86i_pr4^hH4D^;RVIv4 za+lw;Cn-^@nHlYa&^E=HmNXrX>pDw+2xC>nV8p0aa!+$N9&%W5A!07=f3B=7yc=g( z{>(W2vuH=^GT@%y5JsRZKJB0FaDh`?AjLMaN&B%M{6gh}W~@T7xxQ;rOM94}{&Xm6 zt~a2!&d>c(olSv(;`IRkHbk)04s1SR+m2RFj>&??iuF-&AmnD9X$Q@0QAct@Jy00Lt*Uz5HxW@Qfl{?P3h-6{sEv+58oBzfb79vGo zYF&TyelBtTmFxWdqOX31S7gGD5uS^s%}(3&&xA-55&k>aTx&<5o7=gf2O&O4^Xb6J zgZqPfS)qGt2IsYltYoRds?JbEb8R~1sGe5RBz^p69XYpc|5cXIU$X@>UtFV+)%b)> zyIG%nr-%IIpT_u=C_7w^e%_9-jjVyG${R!rPy#a9GJT!{O9pJs2eE@ATS5wUd4%Yk zSp|LMrYXp8)tXd+ws>*~fk)G=G@mG$XhN!^Rtk!U7gn&v_3iw`;>v6PP zxk#yO=JGSL>W$|jGxV+>G?Juv)Mn;3N4`Dfm-vqJB~Ru~z@S&-OP1vx5z$WT;)u=e zXPk5bmC2oe;Y@mSv>=|y=Iioea0xB_D0qBLWf@&g_%8@a5Vl1fZ2V65bn_XKCGx&* z*XYn_Kr7}9&0F53++D1GW*VS_9M_~1P^$DFE-^D5j27{t>WcZI79na=T7=PS?nIl5 zj54d1;lA}Zp8ysV7eJUi*3_>=eK32Y78lFQ>M{+OApYg@=DjN&0N;Z@t5D zBdFe$Ndh-Ne!8(LrP=z*rg%B9x#`nyjuCDsGpu{JdRM-7xiVhh$>eS2Ce!7EfU0cqeR_;v&WFR! zDtTL{sqRou$@M(UJjNDa5l$DLIG0+?L~O-7tl<6icTwMvAzCsYUlkMmu z)JZ6Vw?u*Ufdp9DtiF>CcR>jysBtRr99HZT9?Ksr<~xVqZd32PV343BrI{z?xLzi9 z?ce(Kp~A?Jha_>vgLRBw67JCcC4>G1e8W6QznE$hs{USctLYLbfJi()MzmtTdf!qP z>AvEKWsFCi;epr`vWk*gy2$Nq+mI(0JaSSfbBO7$XB(k5ODWI4Rp6pFwDjBXF5^1Y z-`8`>!4`~KTdM~{aFf-i#jGf@G_#fU9!LGoYEcjOO643Xr#fET&6m|jl(?QBDJ2)j zY6`w4i{NOcRAe6VyigwUBnu>WlL~dkyYAmpxcehgH^`kC6keEJbO!w;A}LKD(sMkN{7 z8Ggpp$e*8y%-|1pksMe-=txE((K}5gkubfO=FZ-KNH(Q5PL->3)cWy>$bkZYd9#xW zH`R#sjjP6(Nxwwdtq~=$GzX@jM}rurvMQ8fZz}5UsFWn1LU#6SynO^@` zS4h$y6z5HFg#mj+fpx5&Ug-ww`#`JPgUsoSgD=DUp6i{%*JtdtS4u9A<1%UAe?7ir zXrU(craEKnsU+=%WszINthPN%j)9SkBg!}e)?QlM$Q=sjDS>lnOQss^eLO1VX5@l~ zZFgBA>24Lm344T-r(aT_0>8Q?gU0$MbSx9M-TkP<}|wK;lL zINPUh@hA^QB6s9q`}+Oe!zoAXcHUgBuI+WLxgVg|`^X6Aa|UkmaupuE7yApg7maaB z>?#VDx1Q5F7oFuB_sP{det7lO!#^A~fPOY?l zjWHlP9!fJ5tGsMx0GO)J#b=BYQzG@m$tP?<%!yu8L%&N$8f_6Hj6C&zR7`6n~qnlMUa- zt7e>BqRcW!p`zXyH6EcP#_&|nmS_qpo)0zeZk#Bs2C+eEtN}qr6N-7ezmP?c2d&TMHQlghCV| zy|ns1JRs>XQ+O^iU-15G1$HNTxTX)q4^q<3TTD`*Ib&Adjjk=0NsDn_9KqqFmN=6V zKKV=B*J-IxDSN1Fv!yIQQ$yMGJn(_E@4i!^7k(5tq$(tBRy-|fX>@b>*&v{s5${K&vG{unRcs4i6g3od2SFG5Y0 zFR5R|-}`|i!osz70&7F0ObJk<5|+jvZ4yybBsMMqlwF_!@?Az!!3~JghEAK_X4ETi zqp;f@?{xGZ7)!u@mR0W=Dl_)Lb(iSjP!0q#o;NSkzUfz-RXa6o1|c8}<>+MwIZ zP|F{bonlrA2TKd4Wn(I50XjqPm7jxyJW}u(Y9J?bNl%4O#KQz2zqVCjEJGFt_f| zx|tJ2*oFPVsNpo9-eDM&`NSS466tO-HGlh5yJgLU?Hg>jv()LHTtCNWmD}sZHJ%WA@ttF%QqIfZqp_TRM!D;Z30F z&v(>__CPqKp4+QGatvnt!t2Z@cyrCQ+v(YVobA_U>37}K4;plfQjRKfGFBU^B9;1Wxl(V}ueyPD zj8~}nx#GW|ryNRdzp5HsrYoj*m={DO#nb2ejL@LA9X~prA_}GlTiO(hMHly)!AZj= z77}k+_8$aLI6nD?`vlrnnU9iN8Bg-f#>h!TO$v44L`?l_va`$+s*O$;X|PHp{(5i6 zb8nO9F_rG$=&EnSskHQ*MaIxXol-BO7SgUB-#Gcep>lNwbocLdt-@F@^!uAt-+z_s z7lRu{!P8)d9dH4IBuKLZMord=Zi{IjPgWB0x&n4ZanHk{^c2+=PVa66i&>Rh?wElbocZ-@kyfF zSWaa*)h1u>>F~S*3)4SuCR)U)CwLcaa|CG!vy8HkAr#j-Hv)x@^27msQ+~u}yoG`8olz`mxUi5&7r&3GuAolSH>F z=;O~=ur;H<50V_Ja)c22Y^TU*oC6hIW&7FtZvepE^M`(-{CL^l!*cq-P*>SwY13Fm zAH_Bi`p^orUAV;1JOsH|NbaFtVZZ^3Uiqqi-?;Epdt;Q&%6wNANz?_@|2J~hiB_U+ zQwXB&U4wqPXhp7+`gufCpoK#wp=VmBw{ls%E~kK_7A;^y$ait5`}PxeoqXqhlvO_w zJR{j|vu8^CxV}^;V2@r1Xw{*9v7fa#e{4gZ{yf=mcFp2VDX+t?BbzQESd0$zg(wf1 z;zLoaDFp~^+!hf`Kh{o17kr-lelxH8W&CSn|L4-a)zGdtPz&;`2#MMy_oqFz*e-U@ zd|~XjW&whRzXB{OhX!qC=~+uK(RcYy*UywVA{vbzcUTO|w6$LZa*Oge@r{xxh5Rfm=E_Kplj3_(%{zg zggzFYcTV;c#yAn%*G0(gwOo%NchL#-y!hvZXGPbxw-NG;i5|?%PmG@ve1oWLp#jc_ z8Yjs(4&S?O>$H6_|Q=QKuAob<~yA-wzPJ= zeR3Fcnv6W=T)lI<%Kf`_)(%ee&`MH)29(}w5Y4gLpU?&fp2c9_WKh4MlGEx+l!sh5 zT!Y}ouD8LERtHNl@#SFC26`5%-T6Ez_N_zro3FbyDB6X3ROnds6V3`mziOmqCjLBu z#^md`5!Qh~J;qpT4I!~-PbB#GT3iYV;!;gAx%A%ec|{0`?FWJ|^0w9Y!S})Yx>$iB zjN2qc1dg64-s{i8>Uik9pniROvK(hRYCbs?M=O4@QGHfky2~OepYP!svEmx3rA&K* z1=}a@^KL`TzQ$T+hp_ouf(4Pq=(y>bGdmSqr9v!N8!_p#EWh8GyXc$iQ&~mabHqCO zFj1VRhuTW+l$6iTWEx}jgItMNW4AY4C`%G%dR2zkQdP1eWXd#W%oEkC(I}A1!K&Js zj5Bog(~Pn5qzXN9i!)mJBM~%UDu6`sWi=Sb3?>r6-|6?sq1r2xnOXkGFBnYv?YIv5G9a@-kw|H|A{u(42#tn# zJAfibpDU}jxqXgD>7ed~WB;qS{v26#y02l!-pKRVWXwI^+?YR3({_k9<%ydy44rqH zC!7^Qi!WMedz7V+$oq!7|FBnc`u#is<=!vZuUhf;%8QRnO^uyGQw9U3KVPNm&=S0% zaTtb8L(b$X3S=F8A+EDa4^}eu-RGsj4<;n9G z671Z#o9*%U5{+IJ+A8Zi^{~T90F?j&TMONVUgqOggT+5gi$pkXU$kx5?LMvAHiMCE z>WNc#E4waBB3dgBU8dj4gC_7uj#Uj=))Qj#e+O+-#iz*~e3Z-0Q?{vCJpr#2W*Pl% z+?Zke+yKF}bn3Lt)3j!zqLm(O7BvHd*xmrxDM8AR}^cq~()`Xe}JT`T4 z@mZ(YhJ4u=4}*}chk(x-e}sILp@}YJ49D3$&S`AOFo+I!loM0Q=cfc87_$1`t-VOo z=a=l0HfM+okr_BWZlhrjE?Oa>b&Pw~6@m~#GVdHH(MLDLxPc18_kOXoOq74EC#P?8 zAxDky7u$Zvh3ngeAjrw(BkI1EeT=@>6T8z=QP(3;5_dhBaXNW|-q zprxNN$2%5FHuqXAW(jlVVzS&$`aD(2=}qOW+Kl9{G|~;6l4nB=jW&me2K;h#P}3DX z`%pEIy!IBIQrau(DC_w59L+Tfe@OgJEQFLHj&IxALtt-(jAWg(jhr7n*d1J@DZ<}fGIQJV0aOgC42z{_W6K~(-puE9Z zbe>9jrDVaj8yHN7Lzw$~#r2Y}4=Mi;CSf`r{_2N0oM%HKn6D^$hpwY`1#R3gr=3-c z_%M`BUi;!q@U-ZieZ0Z4M9MhM;zNZKbF;I)hb&3w9mEDlIVR6)5k0(mf34$Z7|=*c zjU?C|GMF=}F$#DQ6ZGlR1CJIp3cL9JF$L*g(3f@0ZRfEpfc-0brLkSM9a(wYa}_3$ zC9AD(m;4Hdm71>1|G*gZ+HeZWw$-JDiQ)4XB#inNj3iLG!dTpecC+0`20yq%5eH1r zjg*cvl|^pqE6p=o?Az*3;i!6}Mb*%iqzoak&*Q&4uzi=P>oB_&H7A|3h}dRcQpecR zvDNuFje11&sQjQ}y(!;H>ma=OeYv8)s-PdWsegrD50$C}=;m$!uzCx;blDI>ZIW{8y1gHJh>&hCd zLu1Q>ocn5S!?ifr)#TroLFXz#kqHkkvThh8kOX_Sct?dBE7W?=JIent;{(84KF6dF z@ol8vuAy5-!0F~Ah)DHPx1pA$tI}Cx23>Nt4Yz6Mi=BeKzAMnK)-RD4wz`5r8 z-Sth!{@PqSpq$-E0_+hO9RXW|!Ax9MG2Xu*RJ$j!-!DqvacGTsx01|sCl%!cl6ceW zRg(Iw*7A$xckl4H&A}VqMch8GTHbtuDIJXID>G;ZT2uQ2vuI(p{RQ2;S?_i4+TVH) zqrNBa;u^g!rp79sN&NA~CWTz7T>*>wry(Loert<7yOEH67Z{B-Vd`tVP zE~HwP%3<7D@T#j)pz&Aun@0veGbIs~JVZdbV(oWc72M9D;Z=uuxCr|iCXQe+f}F>t zP?02zS;o=*`2BoCM_x z!LxqdUrdGWp&ab^D`*0kcVrJQZn`)7nkPnw-hXJ=usxp-g3UEqm$E%?Q47zAA~n@s zwib{$nRvw2C;M=rYB0!s95GJWb-)a!Q9fSiSJ=LeSsZHQ0Kc`zLKb)VZJ_mgmarS$ zU#{2j``%Jq7PsQrw^X2YQ#>$r7Vm4)q@+Y@Q!#%@2qscECT+ho-IVp7O722&Oy%ep z)tY7OHa6}lOg*Vkd_@O78S^PV=3KJsNL^dcph*b%3p$)ufDkhi0C9Z;2_!g7@mh&e ztyI^K!(U*$*LJm=3jRU|3Q*ctNfeU=_qXjV7al6%o3G`pI3e=!nQ;k5)xMh)vEYmd zYuI{yoXUx;Cs!ibuIHV48Zy>nf)1EAXmuJgt$l`irh$v_){d20Q!cm}41zs)S@X<8 zbqoybpS>?{+R$=z^&}m0Y!7blq9A&(!Y(A}`v`Pi>#T6>d}QimNY^v7X`s24)!)!` zOYhKpu+m8{>OB1j7-3dZS7g=dj34c90AHGFT0pHL&jDhs4>?-w2cE;b$FHmW*J7vp zpDlJ0<$%lS|5S_Jqt=7OnC6J&9c4VitfedHn%z*_g(2K=*}Ab|&HS#lnYc3drKZFt zuhH${-2`SK)Ecv$v1M*U;k~UlBw2)+ zI+X0`97qa+9 ziTShGrd~%?ja2VvKeKfbJn^S1m6VgK|Yh$i%RDIj$5&aVv3G3jQ=`U^HWt3GEc7Wd`iRA~&nnRE9 zh`*q6%K>(ip90YcHr4uVFoJK4zxEtav^`fP_*Hd4+$7Iy05DDg9!%%C?>1L~8A;{_ zoi3urvRLW^lJ^VRzB8`zY3VJfIB7Eix|w8OmuG!d*^cDYQu4BDhGol%=L8d}c1xRs z+w+2Vb0<-^sh{Q=E_SIr=h7P)a(Anz#8yO97>W*vqeHOw>OVI$2K+lGDgKJcCRfZu zwV3a5ygP~LR2$1GzQS`~c6!_~v))-n%vF^5stLRD#d(xJ!W-ABaGK@NH}X(_IsLGy zPux3B(1pvTH%J>E9MUwpU*7bhwl6HrOkA*fU zyEN>u!H!p8v>W44rSW0g@9K~BOU92~F!IGt9F~ijQsrB?zd7qL*F9!~_nS8#f4VGX=5Mb^Q>TVAy z@20Jtk}zHt?V6wKYS5ANk51Lbo_cf&UKZy4cG?lK#{@Qkj;krnI*G^MKTE&Z-j2ku z(ZjOY92rs}VW?(X9!SRWyKjrp>K(#ZI2}Ar4Jvyk^wrAp;}T}KRJI0#Y(6vRcLNB-ID(c2)7`TfYEZPwWJs5SRJs#m<8aoQ6O>g5_T6Mv?V4H8YZeo@1z7eIgxh zIPK2=(qHkA;YI^!l+;V)?YAuPR42&3&T+{v%z1ccNAU=jzM4-g=@h~BMALp&l=O*0 zmh?1qY7+Q5e61L?h9x*qw&+;H$Bxi*hiU#e%X1}cs2zS(R`WtLQkHMj+Ov({>Z7>4 zNv9ZwQPrGgT@y9AYgC$;=gie8!Rc{a{7>q9{Sn6rht>=5UhQGlt*Uv~aMCpK2 zQu+w9-S$SpV48hJS1vS?+wCs3?`Tn8Pimn}piD&|m`o8X+2HF?;K37-`7A49Gg32; z8gh^I6ZuiQ8-952^zZqS9#hP5^vHAwHq7Qr?tBH?fZ4|$d>IKc6T9Ye%y14?WA(?u zq(WM1PNPOmHxbX)lE0p^29HN9s93?+Dq}XW_Ry#c_h?LJyMun4Zcb2-t<#a`TtrY^^iYmu>n`cztAd;(U03Pb zJa??f_qS0r3R^81n7^lcEw8c}DEv6r5=PqmZZwz9As4qmoWTDKfvFRc-g3R|VHwxS`1cePy+CYVbA1c2Va8%SF&|&(-|3 zgA!|473T`}p^*z}jGBOzT@>3AS2x|b7o?OUIWgz5d0%K!6QNN;_s40AG*_J{e4E3`F5dAte7$G=rG&-)B^yhhZqkBt4c&-$>PsK##my}9tVt`)=AXh6;S}-LHxt`~FiPW053=wq*hlE^ zPPp|O%)ZnH=n)ME;8CT&cjbRKO?C1@P*qhpfu3c>w=d$<1eo{xb#KR|@WJ{G*T1)r ziy~Nm1%%!mmO?lBR8Y*#&<1HBPgs1B_$PATY4!wClf7`Taq|uK*t;;I{;OMGHX|^( z?niGKIJs_oQr}%wk{L0ILCp~=yorB@zovcP1J@$E;e5Cv&%~gZ_2j|CVb-O~ZGry< zMSfl)@6+vgoc_>a2!$UMazuGU+zZC8d&%Ofg%e^-+oOZ1zQ5YmV!dv-dA+^&a}*+A zUyJWSmEb#7s3lk;e`FYIk%p0u0eS2&YH3NZ{6mTcY}>E9XOf9caUxmg6h3=Mo(xG? z`blQ%Jy~57&tE<3QO){AD%wX$)hjTthFbKTe^$puF!kAp%;xD*?Yd^59&6j261RR# z`Btfe*U!qtva#|6qm$6hz=8OhmV~9A=eHFdDl@Sg$xhw4zAimC#l+IH;Kt`Yqymq; z_EPJW|JWxa26Y5`D@p_)jwO2TyjoVY4Z(0ZLU`T9omq#uFQ&KNq_3zq?qr*J;c8tN zw4kr{JKck^YAa&Yms+vZBLhq>V~=Oca@=tPwmYUsd|HIWpF8ER@P6Ra{qSaQ7hOVC zA7Rm0-A>k4(<+_~_h}OrFXpT5yLp^oMuiAjD(`qJH}3i87iZ489s)lN=SOWN zF#Yr7M;>F(MIeO5ya^uY^LB?x>|;wQV-?EX*6gp$RkTbpo9aM1V9&)_XkB=OQ)M@jZvY= z6|tF@=itL*)rM?a!Dn|6D(?^apYoBToHyS@IE$Ur+@3pCqb3_xB-}mKjXpMxd3Q(U zJH+06BQzg*uq5tz^AUeGH`Jl(HrG1C%Zd}hai?KZ^tNB5Lt#6uM-}#i=QuT@?OoGO zhi;VVkG&rYJ`F&$(|OTOMj`$9?tjfdZNdE`{EBvOj1uWsI0%T{QVl; zn&WvKf>$Q({Y7qBnrh=?e7($cb!c6=kKTEOjE#>TwIFOQ<)NhmC=3|AcFMg9yRw-r z>pwc&c%jp=tuWOJozBw)1T+7M>(B5O*ZWwg0dT*eja+ZtIOcTu3o4W=tp@J)N$6hX zp^?{rRbF>#qFCE?_SgSo%Mf+!B?07x8=3%hA3%UHZZsElqeP7IMAc`f{6CJVL;F8( z$icuNEjDp3ZYXm_fW(rs2uu23P+46>2j7!W&~1PJFZNe!LUZM9NDt5YAsAI`Raw@J z5+)Mqo6wEahif+g#Eut~)AzJTp!B+((Lw(j$v}tljJiMY6EjB=pe5{VGDAgKqLtU%>BFfeZ5UFDNT&sx1vg@DkXl$vz-t z|35gJgouR2>KDd`9HbW=kM|nytg;VuYNt|s4yn|@Wk((p<1aVHB6am0&Vv`ZCJ;?T z3b)OZlt3WpJ?h6p+(vr0F~M2wMl@<^S5Y%}R%+KTCkl$I2zH(Kc<+^T^yu?;THGo= zSU;=V{3g~6Y>`~pIag8#r>m#Q5@m~Sj0__M+Zy81_e2~*kIQUdxxBPnslnys+ZKLO zNn>0#^n}wBVz>EVobk;TM2ER6X6d*{_S^gSq35?L7ae16>Xa&;1ug0y97(E^yNws( z#>&5QqaAdANi;l69XKFIhp{zoYNZJ;kFZL>G(AHK&A={_}}_e>B^xVN|N3wYnkN% zemiSE7a}@%H}!GG)?8t!K@cAmKQ~+Z7sLit*j29cGj~TG2+T>M*w^Z<$YPi%>8urG zHW{tT`P(GBY}XP-N6V1Qnm6O+l1`<5h0pO|YT3nUX#%$OCo*KUC-wUN-b39jvp-PG zh2j;i>C|(j(S0^Nidyq(b5rsQCtu#lh$n0;jaAdn74x1qbFhx+F#`G|I9|_jp+#&< z!f?feA|$ro(P%GGsb6S-Z}AlL^?(;H1 zj+@08HJ{cM)lUX#*2T08Tw}gxIbuqVkP#t9QMh)N?KKe?;)kyyq{~l<5EiVQ>1&ER zRAcyQXsSIZBnsERbnA*|KthG9t-Y9%NmlHw7%`hwUCm{ojuUV5Z(pBteV9OCY3&`W z$tG-ryx=-f#cA{14g3hYcAjJS+uqf|kDktDWtPP`*C&lOLZU$;5GsTv!Yg@eHIbCk zLHo&#esfd!=A$zSGDxOka*xHf?FPtFJ8yC7#!;qa-*J%Z8sH)w}XrmX!?~`wS8gHXqV%B zwKgU1=d#l>N)s`wi>>y>IJu9;)_{b3R5o=-g6pH|_-7cK7> z?95C0h)J()i(rTg>?ct3x;2qLC#sPZB(jqdo^ibW^TEn1W{l<0x)!H$>@aOiYqYeT z^p=reY(z|>-xCa}z=-{Nr(ZW7FsvgN_cGg4!ITh;AW6aEU(AYVZ2~ML;Uzv>!q=5T z!RoZf>@O0y21qy$MCSEie?j_ZGvPot9i<4r@v5K~uH5q^@Kuu?@4)6o^}^ zmAT1*QC6NHG;a4(M1@KBkwN&mz6~xVVKiWW^fTKi0~Esr1<4t;;|8wpIKy5c32k>4(`-?tx5=ze@AV{76V|+M z9f$~b`+%8zJ4{v26S$>sI+wp{*N5VQe;+M!57y1x)u;L*hN1dv&ODT4c4vG?d%h*T zx-pslGggrAf#klojG zr_t9lafQherzL+>wIs*JVwEgIU(g?FjuoKw0cHhN`7=1#uP+cqk-4uA5Zob78N^q~ zsOx>XrD(cS--H0lTb5WS#jDLz^&yJgy{o8usq@@>*@x^~E$Zdqc4}Ly%Uh}R^`PrL zTu<`~rm2I2CvMJVZxFZ~&;G^vTqGLxWzobX7Tg0q{;nqok{ND$xxJ-ox*2s#($hl~ z;_p>UG9pg$odnIzlox%=@qS`fBf@Ec_kTh8PGP>=0CX}VGGl3e0-}o$yW1>F=ON+4(^p9|q z5vzuw0gzhf+j72Ymc|k`W>z^jO!eL+yrFl@G#owif$5wupPb^t>c{mrkS9d-%w(%C z_pETsFb>wvzd5mNfRO^ZiAGe4&ybcEcsY7HBlm-D$<~L>PP^1cncf!7$Y<5+3iL#9 zY)SaDc>`@1;D+{k$U96&9z&C@<=yF1@P}jayO;B8Z7L}2J@~{SH6HzqOUXKm{(cP} zSmazirhnhC6#fpet=TS*Mki7w%QvhQXRZ*Z0F&6HqrRB%1#pavh@1rTmU4?MM*jms z&gC3$jrw}_T>+#)1bQO}m{I%$idx?RPJdkW7V^Sd@}L`amxo%XUI#{rzoRrzhN1B3 z{$ZURb?L1SZ+g=2aWgAo1{)_p4^GZYr zT5nK+A1t<|uEJ08LY|(1sS_BlHYsjPZz0d9LpY&xzICTJa?t&s$X<$&`K8(>Dmu!Q zkKWRmu{fKUAwu`JNK2IvSwN01^uo)Mvh^lV{x3*R&ih?cXIi@hW)EXEbp{_Fe9RO* zOE*cSTA_9^qt*SpGl6e>9~_G@1;fFv5QjzArRgfCj6C2Ny6a>lQ^zt4 z1t5yG*SL=Q0Itkh?!Jei?s6BSmZ;0KK*-N@H^duF$iJZ0O*TPiV0)l_SO#2=3FvtL zzLA9Y3%I+AKk9`Fr^BX?sL$!0Yh+8*%?DW|0=POp2^^cUlhnkJn^=T7aL{iHi9OgQ zz#RMsru7i`zo6-VJ3nm-CivypWg$Lh}rNCB=qrNo;acU(6$T(GHEy zQvQObJta1I{(=e+MpuGo0zrR47DkbC)HrSGJ}%D+vOl@6`J{g{{Q>*7N@DuLen^lm zMh{w#c?5+QUYVsDn18IbvFp}@6Nfne(K9uv$`p-5yB3m)MknY5jR4nV9F;Z+>`$^D z1S)~nnC}D7aif`kPXLH9v!nPYp6>rJrtnYJGj9Uur#yG|Yn|EPaBs;?Y{Y}O+?qty z?^43)UaLP4FVU*sD#?`Zc#HU}9?ui!E%s--=XN&$EE5~wQzaIoy2z`=%f-)@yA3gG zyv{2M6$V({jvz)#ZnOnpDVqNUDgF76mz;rg;34U9kcKyL+16wQ1>SsT2VT2P7GI){ z-Q+2Oypb1!2_Ha2_l{mP1ou5o>ap zOgNyjL0;~H4UqBA4Ra9szq{qXzxfKXEhX{p%`cS^rxm-zshQ1e1sOO^*xQo$yeHkH z;I^}p=(o3E62_D3#17yS;LozzD4cV#yZKP*je}xr{Nj%K{X)0>e2H+mtyPx>D&UT` z!2Vm@3S^FCfL^WvHxls0*6t{5KZ&F)U4s7Jo~lo1m~qywr(~FxZt_!fk9)a8Kxg-& z*kF&IvgYSk(t#7C(pksmX@HB5TaR#Ge#Pid3l!;8z1Cz;wN!CG+ike4HBa&)EmLz! z*02!TlTIT)od0pL^dk*wr;%t|EOM7(%3c{P+LOmF2DEy0PX!kDl)AuA`!0>)v4Wq| zg3vm5p#L`uZoA_w1rMk>rvA4T33odt*b<0?NrY1}po_nm!Bg(o=Z0WDWH)&PeHzzS zM+sQ(9>Va#NOv*C={x#SkHs9jwK|u;$kJVA*>&H-N%e%Eku}dgfCR)17LIz&bi_zD{C@FqNH{?AeVy>x^X#vv^P4&+|Rr z`+n}@c;4^tc>nml@B92QhvT|j*L8lj^K*XI^L)?~ugx^9|Dazu6Se=@1+b~)W-l-4 zn2d|az_*ynvD|Y-StUOjNQLRK8~4EdkRQ?wJT4|46;IZ@kT!x*DF!{31{^#+;SX$vudl>gd_xcW6gsTk zlUZS4c`6zf8S4sZ&u>g?2p7dZjeCza7xJtwf9(a4bB}e0H%gf{=ii!mz%jc(XCz#k zyDomBCT6!SK94QPFT*GI5Z_o$QlXLc3FJ|)?^>)8P31aGyQt>J%O3Hcpq++zog=;S z7Dk?f?gMUXwnsgy-LZJnB+{@w(aDk&>UsUFH7_l7xP<(H#>ad_^#RU^O|qAi?O{G zXMVZG#Q3MRJjKiLRSo^Z1STaH7X2ZKACZDlo~s4x6{uV42S8n)&igdJ+fMjgSEF)j z7qZ{ASgAT8QAs%@v7Y@(*DWVCqi6giBLTBG`IA+WUk4qT3y>(YWzW(}>clUbX8KW* zrG{rdK8^t=Iv(q0fBh68s^WZR(V*d?`zdKR$K$+AxhpnT(wc)OqBmIamd&4V%lB@i zq&xaJyASNjI0CQqX@768o_Y!_sKEu;{U7u^W)Oz6TvqpZ=J)QA6GxYUmvR7mF+2OI0YMEX}&UP)gz_xE)OK}$Knx3aVD4WTZ7PFmK zM*DU&c*hn?m#Qrp#&Wdgl>6jXf4*6^_nX2k>X%e~Y3pmA`vqE4s-iu6<%5}5 zJYmj$Nxg(;w@IInpd3xV%v;`%waV2>sMQ6X9v?|b0 z89xeZ8vdBNy5~z{_7sj=OK?RCgmj&GFQ(h-b>d2J{rQ4j-i7klKri)+8C6&_N+fRq$jk}{N52piATbTlpW3v&(FE(Uq_j$T5Nnamn|C=HR?}i{5a|B z-h+w1#MAZ|dj?gdE%)+~?LE&q3lZZlZL@|8XZ@0HWJ>y_?COoWs++~X9E3IUdU$wz zXI5bA^|b4+gui{s89!<;MYngIES<(2*yNH<1V6Nqdju)~s4s!r^hk07J`lLu+`+O_?-4N^`RrvIWi1!+{?3NuK#dL>cZEX3nS;^QcDJyYP$)4a%oG z#m#NOh`o{J(I&P32YSwiFl^6tn8;0eYvWHSMVReuw$pm)V-~Hd-7cs{EC7OHm<-2U(vKsh+jpV1E;r?&z3oeoFA1%4> z7PK8a5`VYSRT-TDX9?n`?X4t=gsrlN4If{|ek##xNnxpl_xJ7${AqH~>fzq=JSh#H zJl?WQm_H0};CTUOz(()CC^!{z;J5GhpkdFI?}rmFt=EmE2BZOV`j#e`IaVpEFwgCLTU#;kZ{M!*ZR2h9Tx(`QKtA~1g z1$5lo+5|LULDGy~zBA`Xus*eOkUSrBDq|Mm3YG)-8G;m?&vb)n>21@$41Ev#?B z@+faGQj^(j;@=^VQW-hIw1$~SP>m?^WKa4#P)`~eq!O__ZrJ%?uKRq?p*=611j`;o zbKZwJyt0pfBpsONNCs35enoSl=SWVrF9Pd|z(*{leI-;$dtw{x?n~}87_QxQd>6km zI_i%Rwq4X}(VacO#zn0B-1dE9f$vjai3YhEItgGbKplIe+Cv;!;3dWlBiI6*x&rPJ zDUsh8OlUPeuz6TYMrD=N!v$Bj!#AsSzX-e(32ghg=V^jz$R57?gomm;@{yH_1*DcM zAIlOABBpv5N5ySiNz`%9 zr^;#&0khwi+sakz3Ni8N&GxZw*3aL{IyO27Tcrga%|3H^ebfh5XR5Q`fVmYxe1%$y zFd9F@6E3>*mwP{RU1*KpR5YK=DrsdtA&typot{lm}#5PN*0Cf<% z7xMzoXXVTu9t6j_bPV1wJn570Gp_Bs!S!&#xQBvWf4~CUbpOiLP(x>_vkc03$LQps zKvz+kW!2c;Q$Lmj^jI}eORl`5L(=ot?#mi|va5$peO@{g^n=0HqbgDQZgdNVvhI=yG-cT9-1UfJSwjGvNDL@~vJd8mBvkvh4B3wTR zEYc;sp>@cx=g66gq2YJ7>33fG>8ED+Gbaem1S=~~oxOj!vOwSr^yR5J_TkbWV!RB2 z_{w@6{5K_GYe1EtXk=OFn>{pLgaJhs+blKuW2Cq2DXJ1KdQx>r4s8qC@X0C_#IMi2 zs!5;i7lOnQV`e2nl<2X2^7I9_c`zeVTP@mWCvTj!jUYO*2c`}RZW#4hIWNUHXg0~X_9JbQ?Z>xIZ=fT>Ot)lGyU&r1 zzkn@@t6oa(YaN=Ew$vpRFSA|9*YR?nU$DO-q;#8S!Y3!dHsFJEO#8UY%9pY7Ko_Hx zla89)&nI|#Ry(C%#I$3diFh-BS7hPkHz|Q#QtUW?M%r&IvBILT^zEuM6&LfXe6An* z+5DBXJbEif?eL_X$hB^+#YMg7hAGdkZuim;qjI;K{9iDu7&t}xjL78+*qvxCb!iCD zp$_GYxFUuT3HA~{nF}shr@rm(d%eOnwvuYKmL>7CUY)DasyMZT`dGu8&`At69xt!!;>_9 z^WOws&WG`_V|D0RCt%uIlUK)_{8QKx&Un8ZI8mk(gLM;+yKycku-+vp@)|!YF6DZp z=>W|-Pw8B}KCiKkGikS7(}_`&y!);b$4wR13f*|MOH~6>Lyk;!?}CDKorPAcxhzxY zb=e0mPd*E}YeIfD{OxCxvO~)<(~LMDujR0L%jkG=>S|Kv2N9;nUwC2f>UP{-sH-bj z$kP%%X>t#i?<#K`)BQ@@A{!xAXQuCUGO8r!D^J1g!C8r5QYKT==(S1im!VfGnwuxi zgdXY4eKIYWnxfb%lQnzgb?hsS#nXd|N!Vt0wVoIgq4N*g=U93CdGA?e`gMWrYOh%E zRn75jBBd|3bbF?{J+_ZQ_CnR(?Q@G}$rgtR=ie=TZ9w2nls#rZ+vlon?ZQj39 z(rqiav7jZo5!*d9_fdau1+Sv1j-1wh?h9?=5?*@OZ&DR`%T=h|H5qclF}=r%SxL)k zi(($k7p8i7kfX>^*@>!~pHXUBqMj-CTzQJqZNdfW zg&TIlHpxsk?)s%k@ptx`_euO9J;e4P@A58IWS&8AhT$Q7(_8g?R4wYxR?rXp-_ zo4;|=7VPx?59=8%_dR9aa*jrYi@~p+WaBH(>e4N$@ems~VTHHVWJq4xh|a3CE+1(+ zdU!S}?=d<%U%u-LGjqnp&9`o=F76l)pRS z>_<`CCB5g8g?HqL5>a%8beGW-{o9o!?SL7<@gJRn<-4IC&r889N$;r$Mg=Q*7}r)5 zG!U|09Md)KpKNc`$Wz}y4zppol}OcB(Z8t^VETb|=T(J?ZqYkD^`x$PUs+aliRaxR zWD=cVV6CCnBCvAo`)=6G+i=OJujO{1R#R~T{C+&lVDqtyqYh< zs$cc412`A{xH+|63WzJ^6pCTT>6?ZNAa$v-TZ`Xc9SeG9!Tvgm1O}+}x?xV9g95Ha z`@kFYFDeWusbS7C6g}n^VyVqzxH91N(#13@*-85YLZ%$ufos-omU@Dd`?BTeX_$$=XIbC+68x2#c`H8-V0Dmjd4Ph;c2UK zb*zE@I$C53Sf7H?#p>kz1%qlsGufWr27&v9QjEj985^0^l}{#c(^|#s&TYMn!~6#F z@V3}B8oFw;mxEq`9ytQJWv$ooeZMj7O8;~YEgjkm(ljp<>L7P1+G-m0AvB%A^JL|` zw_#zaLfmWmCusT|Z4Tx7@c#4Fk%cAl7ECuFWLimTp$4G9KCMM209Zm-3gxN(bX*7O zk0%s%_QM|p$dewT2*Z!z$wAh~x}b@p1;F0`tFzpg%`T89**VjM%S>=XEFbQ{{I>S0 zJ_U#pCrL6hxZOb=mbg&MPH;-Sr_&G2%f{F-4dl|!R1i~zEV1l$D$@O%OSQd8Yn3m( zD_XnT60>RzQ#@thv4hZlrjYnW@hLFUe^~|Z4K3f)FXP1xCBB}S2Z?`K;E!yB0k*OF zZ8aeNuz2Ty8wB5&-*y`tL3+*3#_-Puim5M)B|TYLjjB5PQuP8Q6j*5MF%ohck|ljm zkz^rb$X)_wW!)ajW0f`S>2VH!B!IUE=g4CCY*>ths51-;atzD(Ayp8dK!E1;G6(!j zS*v>c?NlwMefw*8TLbd`G#XzKxcqGp|6$SmH-Y7ACm3>FP8I94nXZj#NLDWwbNETS^5kt%VbqANoNr zzz)tgK^kTi1?G4t$g@mr2R(17@2_}9hbn-1psseK%FI1_+PGJ zK`zj@8pDlQAg)iJp;x+ke;Lv=S%BZA{SWZ9{(SlWb8Lis$7`RtbIoz=W5?&-ke?PX z^KhBfl0X&%OPuI;#ms!g0!0y?0_UvV)*m5$D*C)DYMcs>h=xYj_Tp*dpn^aK4!RNM z!rL>4mMFaU^JGi3#!dW)_~EI-fw^Xw5NrFXkgjnaI7PVO_XzFaz3qXudl3}h z?GNeoX?^n7AtR1AgmF+;dqAhbAxvNA7K}Of?G`NA1)2hEUQ!XEX%@l%7)=DQe1?2= z5#gfRFh=!#tanr4?c7^%ZqNJ{jHdY!y&8?AeMi%$(-;ER4L3D0jN68cmG*hUph5bG zI>~pg2JV-ZXbrQM3+jMsUG762a?px2w4VA}ipEzO%`HMxy5g~Sqx#%LkN_2)6x7CB zhnH*^D@j_M6hus3=R4JV;+;iEGDmCB8{bd{o0GM>byW|TvEgH7RENQMdMZ53SG%mp zH5XC*Y3BvLZ$<9V=oIYZ0`lkQ?S3&9ZXj}9U7Ytk9H;a~P)o)dl*R5%2SAmxU|+45 zTd*lDfUlPn?J`(u&8)zg<3Pl#x;C!KxT0Ubr#Xfs`Qnbl<$@AX6on@~^hg;X#lN3e zqJ%$z+7qBZ-dDZmhHqucj#|rNy=bQ(w|N6GIys40aX@dx0-_IT(JoiwR{wdW@q94| zs1&E24XYW9A4p^mP7fLrn&gFU;b~x1q%Wp1PT3f4O8?_3!(M5S*1`3hXQv){VVa4A z%m`ty+1QK}IWp|s8SBQK47MAfso~b*$f^+zjCJZ}kZXfqQN5~P9QThH?(dCqo7w=J zbO6o}ZYB*{uSf=$PcOiU_3({Yh&rVAQYc4eCB^Fj3^sTx-C9@Jx=*lorU*z3X!}8J@w8gO7tGh`F7p{nFr{1eg05J{AD};7 zV|ye;1VzE(*jIWK?vK|K!RyxoQ6T!F&cPe6?cv82v0`EoGvV6DIEj4c$Y3+RIC&1eRb(tj2~2}hLC&H?Hg0tS)qFG@K{HcVS%!Xzx7KIe&feH4>HNfq8BbFcaB zcm$OQeQnnMZq7K~7{$IRngT7S7@zBIU?OSP=S2TkG|@U}<=s4_$lz zI%%%xxd+XU37P&Jj4yugE&6BI$`;I&9Z+t~W{JV3MLqKwL5TXObcpnun*JBo;U$3Z zujbUW`x}z%lj_GmKODnpGShh8vICj>gJYl`C*;LN`10*PE_FIk_kJU-Re1KU%-XMr zS96gitkV(nLkObBTb?ag&GCN%DMGuPk6XPBrY)NkphEUP@xI^Fu>LE{(x!E@cLu1k zkOUK8d)AzQ{(&0pa^@%eZ(;#yHUeT5)MJfm3+;KNFl3Zs%}xr^#A)KjgiN7V(#Bn`V`U1(Bb$DSfM52MujXHn691kCzdUpe2EH7^vyrZ-O;$covkHd~M!u z%(#LF%g{EnvVjKW+a8g9;cXU-6!W6U#R#U(SG~4*9>^m*^5;Jv%webTq*vkWl))jy zm$$_WvCR~RpR}2HqwvJ<;pMB@_T6OKNDodE1RRBow_ut#AtI>A19A%ouf`|P>au=7CMzWzN9(3wWyuCVPtZ}^L@b7Fz4Jf9tXymHm+@ef=FP7_b#$vO^X z^4U4Shu_pRq=cISrU?HRq90NBPsbVBt;Axz?1H;_l0LYPVcN&Rc;ZZ*p)30XNiy{@$@dBf=$#JY}Uq|`PmLBi3>wHoJ|Lw@$Ybx}PPGj;%MDkDCp4UJANNnV_za^3_~(%4?8x_d3a zBs+xc6KZBOjQDyW2sdNc87#jP&jsoqbrLGtph|^5gL)pwejR&?-)yFmrx|RQ4mN^G zJ%^%-BI!%nC>l>3Qv>ZBo?(w*tatezmrNsn3}g>R5X69)fH;k$=yYbktOg!tSezF9 z#2=5f1KtW^=qGv^_EL=X_W5^%DkX{Pqp@QN@a5jM3_h`I_oo=xbqwut9B$Qdd*%Ul z`p;~C!<-QX{t~`zYcjrO-iEbsZ&eoH-K9X&1s8l@@1=smk-+Kg?~850-Y5bBJwa?B z^}r1Q)TRuI)(C*k`aK{Oz8mOnUGy*lyiCaeQ)hs1W`=Kt+WXkt8uwwA6ceCZ+7Q@sipDh=NNM?*A1^rZ}d zS*$T53cxK5^v>iqW_1f$KPe)N!zK(84Pg8v0Z|DlQhx$@X>3GHwLvRj?OU&oXPnY9 z{EZj*Oxn+yPxO3%7xV{OaAI86I%*o}2i%oEV}>Rj2Bc|!gQi{Bey>j*%qOxci>i=8 z8>DDR(P0Lj(Rvx}atwOa5xxPG3w2~$fyVYSqJY#(1B1kW+eG8*2}A`$1VPZQ16aC` zf7?l_UfV_nJh<)V)NHc}{9DDa()%9icU%a!x>wwuDV13bygNW5| z+GAi0>2uP#fJOU_0xj=82M3bzXE&=GO*$ltTy+uwAP}}-jYpu`%k5BmI+`XGx&`CE z%G?b7$!T13{PQQ_e|eqhzYP>DAnPCK|I=GE`!ftie?jWv{}(LKzp?0yZ+$zBHYc_ z)$P;+0i2)koA@WgJnr}_WwNFSiipXG6Y#SF1NLucK0|_zyW@3AWv?q4#_hV8>{aZ8UVek_nJ!%`hfW^D7k!-ggLI<^zw<8TGo3l36N!>p& zU~2yk_#nHkGUp;91>868AQatcLV%2T4cc4_sM14#vd|;Hb4r+5(Vbm5!f6!4Pik80 z|JjG^%({)%{9o_fSwX-f$Gcg_?szxl6)K|IGOQh#wcsiDYHBZgy-Zft z)uLh3`hv54oC-uIKG0_Ed!IwcX><67@K+CBTtjh`J!GB|^FK$u?8nq=e0&(8n3m`4 z#D7?vJ;)_`Tg~I9L7}<;<#}VqmE=GT)k`bs_0Q1>8}0P`)U=gCbL!14m~T7%161j>%&gFrVx&WOL~~-xP8kgH zYT1I_bP-aK6ojqXf>|Q4P(R&inI-vGOm-D|E%SWl zzPZg_1$r)2wb=nVqnCn8%6BHuv}H1z)1BBdal_1{LLaIr4yQxUgsMP(f_vFnJme)j z#Zljn?^556?DOf`gj|k?@#{J1lJ-u4*?#ThcU@fHsg6{rK(q?@*#YULPV}td7dN7M zkOP5rQUe#}Hm?=)wj!}8OVu6~7x4wqWSjxNyG|GVV9hn+j5N|A7hOkgUsD}%zcikt zMB92-kqq^UdQTNG1{R$(HhA~Fuk#deaKET9wAoolY1?=7ncSW=;2pXndm?X0Mz=%w zGh(D!{(Dv{a(GZBEsvSI*v0lx)&uowCMG>Skg(BdZv2&6lT`qS>2!ZR2T}5Hj+WyQ zs?Z^s`3Y2ozMzwLoVA64#Y3Q?OWTVlwFJD=9)0!P z_?~x(SA~cTr~=#QE0`fff`GF|jGm{KXnAxO&Lm#x*||C0iZHWAft7st0#A(Pb7#Ix z@YS?*YtwyHAcshci)mBv6p!(1h+)|*TmwF!y;tx03@g+!h zZpc#X#dA#+&l`8Tnpd4;y)s!!O7Bdvc?Qht^o4?Wd7K@0=rl;F+)RF!{s+PrrxlNN zaWEeMYKI&l_QiIihnbv6HQ7cR$iSQNYicz0l?<+A`_b5qUR5t(${pqJ0tG<;>ZjPF z_+3}!VEz%nAOQ7lZ)cGU?ae&Xm!x{(zCm86X2r{v7}!>Dz{FBV^wk)Y-V25HcF0Kz zadv$QwQz*7K6hh@oCgKPQw{043P2Y1H@$5)epCd9#CK>MXSjHpB?er2?);tJsX5_5*n71}H1cB^P- zv8*vGz*9WOXpmnDJ!7^D@DfLVn||}qMn_;Z!f2ysZ&%|?S9A`?4*>tvFPzPHgd(DZ zIXnMQcCy!0JXNgrx-pN2~j$b~RGiM{R9(gIkiQqcwQ0ap-2Mp)hmnbx``_h4}x zNI?bJcB7Y<{%K?dBwK)Oqk>3Ky*RA|UwF!E5%d7Mo3-8QbHnF%S_a+x&qsJ3x5YG2 zZ6UxMM5*z1OG}{=^&VK^3@87{;Gmmhet+f3Hoyq%IAfXN)d1r1@Qq)zY{npBrE>$M z5~pqH82EbPN*dJ$0a|BnKz}pL7w2E8_Q`$V%XtU*bO(+ieRs7qKyeOL^$N zT?69Bc>g;`vPRc{{onG`FY~(lIrvuy#bx|P#KaXqS9lqN-74_nhw_8C+1uI?=f!#EtWa$Yxk{=Q^( z@~CZD_>RIOyGHlFBaRbB=4D83>$UwpH6y{PJGz94KH-@}VBB{y4r-sG3a1^p+A4VB z<;L+DFK9K2S@;7fzGL z%>xnF93PdU3C!at-Ed;_7Oa?^&W(D6BceWT!NyJYt~ZNM(tQYt^9TYaoWVztE1(@B z9^n%tnWbbS?*L1VzjT3|=g;9LiT-YJz^QoQ>b?1lO8krSJ@r#);u2xx8$1ePourtL z@^aUNUMFcxrR1_Q8|cYZlqyQ5d0f+Ya=KA@K>N5m^PY22M(wJoRaZov+-%a$8C~(| zDs{q04K8xzI73j6Wc)=@KCCTzEK)^DkBgj~80m6X)>?5w(B-T{)Wb5*qMv)NgeqVz zP?idTYbKAoO^5V}p>^<()T4}n?s;%l77d{AB;KVW>Sd91exh*am5-lZ^P4#s%kW2W zME8xwzcAJTW(A=>P0XgnZoWc%9L?m6BkCJQnDgx`rFf3AKih1ggxluW_-f26bGS7< zJeJy?u{gDSj^*2Ox;xKj-Wv%62{)?~wqOS^)U&{=`$Pc_@m{JFL(XJew8|7Ws?o!`yu$f^VMSO&m?84PMiXPVsx{KPqxZ~o^oHSFL>c3dy zd*NKvt+<}kdXE08WLHFaCi-^L(2>r_Vg@FcCbz2kIGS1B`8X*MQ7b+0diyqBI6To3UlH4Qv=_wq#2Mcat8S`0z+_bg24l48g=Wdt!%1-!D$5Z>1jPaB z3uQz%d_hvQ`XEv+f&f@^8@?$IXMzZDhb>rr&Vg<5#z&9r3fdoVjv_V=4};iM*(gZ$ zo>c_Ph_j+u-us!W*9Qk~41DRV{dH!4Ou7yi-*Ly|%I1O8OLr>ZF{*MDDZ+Hrs-Csg zW%M@&f0ttic5mf?lbbDCH(1{Hjo3+x#YNa)7N4!ao<}M#BQ{vb5uuEIE7a4zF4`ny zJ?3%h@siTsHA;#8;SqI;o+Q>M5E7KR@?66u>$;&*QOxk|#w)N;LHpa7FA|{dwT^ma z#Dz=bo8c2x_Czz{dYsn?yKe}=Y9^^5Soe6HV5wq4GN%~#LSWo+^7(pLGS8v)rIv!S z<-WOPCtB~l#Bw)Rsj}hTsid_lRKCBV(G=}Iv4$*2@f?%dPcg2C?^I@XfyS-9Rw34l z%IvNp{Y%F>#z<++7cct;_xKD>nordG9Njf{vroQVcqC4DVNhRPPj>;zFfbNVZ2 zW-wse0}M>uf^nrWP9Vu30+@E6$jLZFM$()gZS%i~4xb zB=#a)v)#rAOurDSFw~9-0Fjk%!a&1C184JJ?p!{%>nto0qK{MIw)mzBLm z#=00hdKQ_!9TH-dZvFR)QMP+7n0?=1;UbuwJqUZdAGUcuVq+R)EQ*)r;|W#VS4oLc zs>}gOMISztzFaZsT4O(8(QvdvRMwLGqEjwZauU%qb)YOd2% zxk@`p#*MSesKYAsG{Fj8&G-)?mzv>5HX=Fx|*Nyy~4Wg=}^Z2 zkea>duS%GM20UpOr1m7*-aq4nHL$ne%f@u~19KAnm9h)KZIE76LhfO}0(Nv_CFJK1 z4G+w2;=fpHX?(1F+;((f(M#g|-a-#8?bnSwu`zd0)%`IA?voj73z^kV&c858#e?JZ z0`S=Eznv|GZ^%{=BRX%!*h3z?aVYIrmEw&I6s|uNkY|z6Av;i}-4%D}O0SG+_qX6_ z*j1VC?Dr8c(f@;gMBJk-*s_=ll57+JvavaAX-KJ{76f0(NZ;pir~w^{I~v47vwb#K zhk#?&Tz49^Gxqu>8h5&%as1F}8$)oHd>`)493BN{4e%s-lJ9jfcqw?(_DWl)aV4r$a6cnKG9L1JkCc0%I1(1>4ZOo@=yO znR9-=)7(> z7)7%MfyH)5fI4x2EKdR(9IT<(X>ih>6jEeuH9t{;f!;k_#owW|sXyNyhE>WDeD;em zz}@^Y2c}E)&KgcVzXglK5#t#R130>tS5gr@kqRQi?V=RmorIp=F4cH}wX1Ww+fZ4r)%QTn!^(8wVakO%H-J{RFcG``z`Zz56|8fVbd{z9f(uR?e@A> zp*uKmr|Orkt5Ca$aNJDXXSW5?x1^_QRSVUa%P%o`o#rDSKg!TJwqQcg*a#g}ir$Qw z>0W^r8jh&K=^3(8e6vW_AbHAztPq;e%*(t(bbEva*JJIqafe;T3M8kG&9_@2Q>L_7l#$E%w?Yu9uOZ zYx(U9VegsIkVpE^Uj-|l$NfT+8-|j_+nv;2g^sVZitN*Ef8o!FRxLAh%UL&z(+~2U z8DUeEM$(KZ+*EDaU3!!|7Bq?*hLJ6W(_D%DO1zeYLg6y>rO(~RnnkRS%}x|_Vrw4i z94P)=7S|z-f)mkS*`p3)*QRTrJ{PMW@LJ@@rI=MTS0BZW43U^aEv=mc75nB_>6fV2 zl3Y*+NA_Lw((8aFG%fcf-AY^gOqC)RZ^7Oh5$8be$8?)lVs{uV^!zQ@%!}>ywI%@q zJzJK>!3hd#caj~BPGp>@D{~PZDRKQQVdC0c{vtO;$M}Uqzpi1RWn7%qaC4KE&+WyD z`Ee5T1^*LAV4f#YJpy);rb8k7u#ztHs99c?jW5QKxDzjg4nMKlbfx0y*riq%PoavD ztbR#emXdg_%90GLc@#I)1X5aCFuR2jMp{Ly#os_xM8G{mp9s(!--5CFW{o|2O0eeZ z{I;1;pXPonbd04y*Xm8^$JEv%uU#d~g!XyKaD)ox!uII!%DLzk#P=y+C-Dje6ju$J7fKcv*Njb70)J(QS(mPLTU#wh*5ZnNYO6R$8@}I&av^w%EtU38T^EWp3= zGXtOenlAe{()h0!SI~<$r+XwYvKelXN%!BBrHmyE(FfAweH13%)KIy9wHyti6-}5g zmzJ7+9x90gSs|wNh; z9U{k=Mrh5_F-oWbF|=U;VNN0c|s!+wS+~Bs_dpqU1j;!wWtB>q&tYP-i z^OR+%20{Hc=P0kKYC(+%mdb~tqzne$e3-Re4sn!nd#R=Z6Yj-QW!AH-?dmGUitWfh zU)uRzPc%e&|1WH6)|B}Z#BIYP&hP__Ge0TvU#icy2e9W*5H;kA#HWlCLEjZaLx9q(ap2C{gsB}hCjV~roS@w&@<|KQu0CM zz^yn#>%N^2Aur78YGe)P*w~y#8S0wVA+d0QGN+qX1>q%4$PC}=P{x_3gyjm!z6`Xd(kfLC|rOHsEiSRF$DbvAN z^&DSsPD)LFgA?m?OX)*byN;JEuLVR4xUa+=f8~arUukOOxme+Mi^W3UQr#@Wr;(E_Hr#oF(gahKSH=-CZKRG(`*v!11L{oUD z?w;+;x{g`W9`SlGve0^Oxp{b*3*P}vbQj>}M~y)x;Mu}zUU71vQ>>fnQJRWH3+p`k z(9)~NgO48A#xKOK<;BwWkW?_B1k#6WtYeTl@A`g<4>pd zz~x;&<~>ZcIy9M*tKXG9wfXti``(W;o|lx1bl1zwKd-4+My%i{Iyj&NPeDKl&Wr#h z7>D|oJ8#q4MKMaihko;WB^LR;5`zpJScygd{_f8ID_#(vTCig1TTV0DfPP!E<60g0 z7t$2lQ&`9RF@212!bE>&Qqnv_EU}g}-5S@%J>AP~sdsBsplSb=%c^c&w@p`+u_7(7 z65W+o{T7Ng=zc17q-)Rq08v1q2Z1aiVa5VLDz`29{zIzb!d9N0xI@dnuT_}`v(`YIy z8{nN(9No z0$)9_tNJ%Xj_bZl=ADe4&eeQqi(cW5^a!a1_an$TDVIV6uRRg|{-3ooPd8f8j|n@l zp~!ZW76jPf0Mer<5Yucrg9fPbvwoUo1c(**!@W;#^X~vs1e`C;>{EK>a74tN>hQ)AlOB}AqE}2bS;!POP*T}iEWHP7d`6Q0w z&^nh7uk2YG)KP8CQ;}HdrExS6%4$&|KFFi0oB_VX%#2)`nkqk|vs+cN<-Pt9KIISP znl2{}8&_PgFS*#`YRkP)b};SzlVpw+t*`jU=GEL34yt5-&;aryCaThwSOYAbU6|Dc zyDuZeLd;ryd!UFZ%w`|EWJ|w}8M=E2Z!=OUf?k zb!QB&S)_NpH`8R^tu66fZTtwH0!%1qDwOHW43QYDNWKgYL~nLIOl+;KD^>E4l3d(OA@c6m^UU^!<2vjaOuz|E` z#%FKXldW-}^6w>DwZR`$9Ki|GboL}E2J1;s+?fq3fl$O1MrbQ1I9e4{eUVK0Qb<~a z)S~P=Nd~bb&Px>)B*|FeJVJ|$s|{zo=?Ara{+}Jpgnf_PPH zpQ9M(G`tTmq8A1o_jMz?UK;x*t`9ZzdnIFh-0V08o+LR4TYN8KzT&2S%AU1G;+Guf z=jxOP-jHYe#*D;x>yHH-!Hx!sQs1p;fW%5Vf@TUQ7BTps9~RYfnv(_We?4WNAl!sd|^{GhUm}o;35Vrrz@OOLVNiJg}kE-`j_5)%; zwF_qBhCd!;Te=z>h3b8(u)1KXr`!?gJCqiFFyZrYeM9OnwSI$p8eR$dvTKK(=Kojd)UJK|-;vxD zdWJg+{BKC3io{-nJ}8;tnB}q=6X`EK(8QS-XzL@9F?b=?1TE=num9z!Yx%WiH5FE- z?!wlriOyo1oEfSN_rD`)PQZN<`xp3u2PPzuS~SlLgRe8Ay6j`b7VJjXSjp2x#{}D8 z*z(7mI2~(&%Wc!QO<{4nIS~gdcRG%LMn3Hgy3jsGk|V#C%y1y|$z6EK7;6*Jo-Eh% z7`CfL2|9P|K3#AsSk3lQue)KAxyuB0wTth~7R=lm>EGF__Aj#YSJ5q;8x|n0KYcKs z5Bh;VcDn8&U2?-L#vP|M*;~BVZ@W0StavIW|NC3}=cgxO{|hwt7-pjv;2aQPXpSYu zz5oP0vzl+NTBc(X8&*%@=B;?a(xPUE=rjk1d(Hb3_(vmFIUO`4=XX4g z(;3}wuDjowt7_8<_ckz#FT3GibOG4L^e+yu?R!Bcr-=VhakooB(r@qI)g8a8Sr&xpk+`patrFY&QaQ~}RYyD-W z=T;!U8HV;t)ww#3d%p(Iir4Y+x1W)XMjBIZ6p$mu#oRJVBU>cx^idBzd`>@empNc@ z`f>XY_A&1P!zLuD!n!*(@gt}_{EJ%rS5ox7fAqfz=7J>Ao&Q$2^KM7L{sR`!<^Q49 zKNiFPrTOq5YW;^=f3|Y|qqnvV-~Xu7f0)MqQ4s(86@(t>2Y>DgHadssyL#gTtiU#8 ziKFt*3TSqu#Ia+Egeu87lhV$DC9KQ4BkrC`^D$=)Y5V%BXEo!rC$Gsnz*eEZnmHOb zjV|&zkPI0H%%jZo1gT@tFSHc~)PUbw;2=MaWb7l6Agdl#5nn|Jrjrw3X)RxKet7ri zP>W!QqV4sr+FBp06>L8!q;#xVCR7b4dYyqG;hqM;<_`H9){byj>bs}g%m9ycU*(C1 zQjyagJhL8nA6Pioi7~29oS2aMPIq%N{&yJ5!n39anTR&j3Zx|!BV-YT4+sZWDe_r*GUOul6ek%<9wBEIbtKy{fdl@FMW^BP8HR(!&V=dOlMl6~n6atqT zhXm?yJV6`*XDOycT)p2Qnx*=Xi{k&_?%n^H{{Q&l-tTlyLJkqDoO7z2%4tQ;u@GX| zyO6^gfDT5i9OH+AgK4S-TUg+d7sfDUPqkmPhf&Vbs({2MlUOvC3fD+7)WK>!+Sw z3&n34rk3w@F`+b_bg&mC86((!f!L^?Cj80$Z*~u(%6STp6G4($%*GB4yS&9o^k|rV zZ1MP9&xK5*Z>q%t@**;OW~xjxRs(x|QT-^_1fbiRo7~!OSiTfm%xt5jrx>a^Bh9E`bhuZEPjt65e=aMW ziRn#Gcj-*w$;3Sn+^qfi5vuf_X)s5)Y!&%h?XmjV<5d?<(;TKdO_K+l}rB+MsMp4FRLf<~|W2C{u3 zyD^8_qZn{Uh8SIkrW~c$mA~N)ndD8=W_BLbj(PbEHO$@CS93IZY%k5dapU5&+m+Gs z#1I7W`p!z>O&CE(#nmlyc?EOwdy0XBY49vbs9a$ZZzE*ww*L5MY3G{`=o5eyhPxf6 z@j8Ix$Z2B+2*Qr*RC3Ja=s7VkNx^hIoAK?$oJp~J&eWo#3x}G*f|TYw?hI;$3vkaV zTOSl7zzeS=Y73aZ`wRtJ*og-X)Jft5SF6+&<0ZS&n$^ zP*D?qCci)N_Bs%nFXX3{>MQh;UWnCIe;o;XdQtWIF-KolHDl4P-y=yNNv%lONtD$n_z`6G z*Z^6P4LcIwlbcREiQHdz!CEloD9M+A_7eQWW|6mdPH*qDwn@I?sY-DVXOi}TE@LH$ ztGXz86AwDh&V@`O=(t*yT7_|(P;k;R*)a}z{@;J=&93PC$1j_i+Wp1n80&jpaXQsP zxum$5V|j(V8_bh~yIAOa%TDpc*1wS{4tj%|Qgb-B(V?=i#qyFXo!NWAu|sJT3`n15 zk8=dr1vGFn9(&xFV}{Zg*9_;{(h7#4_s0L3Ov~I=5?Pwdgf!mWww7qfki2;UZ}edx z`rbj4+(F4Kt7e)f;inCf*aSbuB;<=lqx7Q6LD%6mCr}0#>;_H=kj;XshCa+0JxhF> z|07LY;=t*BU5xihjd<<)z_5)aBTaiZd)FEQCfst!{aWVCL~^0h4N4{n+}JWlikiTx z0WoS=VY8oNy)uX68&L`EvoDtA6*f<$6HYlrgO zA2iFs6~FWkYny70#mJr4k*6(&jov85KsiI3D_bb1fbG_48mt?fi2Yj~Adq8=G)A?E zX-%M}GJFNnqo-AM&dFsYo)31`U(Fw{oKUPPm-=x$_DiO-k!*&!$6)w78=%qK%$57k zL2EGN2uhosMN5{1h_lBB+)prx(Q@peYF9sBk+R%MePN4IQ#*k(j~5{pDocdmmi%J^ z%}d?9!bvH!KI!wLe^T{&S_ui&sv-PtOV;xJ%XA_5RO;zW6~$i7*n49Cyrte&_`5~U zRHIv0X#KqWRQ}gO-7uKqldVY7zKmap$d&OA*|V=oa5cCqS%kt;&8ewpo!g<@cm{3& z6k~W8@H_Z&&$AU6ghgz^&d50vhVIrq>;o(-emeNa&WO;A?>@@j_iP_ugLQaCkH))n zBSTlgOaH!p+9j~&z0tOqeimhYkk=`NvS1><4pp+_Ked{cSA5He5psoiovXik@6e&P ztmjviTi>^NyG>*}Te}Tgy4yB)2_sw?z+`IGbp#qumZJK>uXnYc~P9 z;`tGgJ{Woo*3gv8l;WN7!+`Wf0%+__)taA-YMxS~wS`x+-4wIHLm^+n!BMd-kZR#d zYjY8;TZSGUbH!nP|M)+e$?6d?N&io+rbU}uF_!nZ+D!< z@p~gGi4rMGd6T9Ve>eU*^gc=P|9*_LF=4UQ`c_^GgIhwYjCG0Zl3kb3ELEE7(8O6y zE6uuIn_cs7-{Zabl(PSldHSX8qr^E|lSBW1dEBnVeAZs%HG_FC;VWR02J8GmF0i#) z!>y+Qzak_)*Znfq3?CVFU5BY%ia1iQ=O6g*?3|f+=%p~j`3=FpWH0}<^SAo0iCW#~`dP*YiJixg9wrTp={P(rfrKtBCk-GTKJ;J~_X*xc@c9W|P8GI2nNaz6 z>>=RK)}3H-C_J|hymtfi9K^cc4k!%EqWn8=9V8LG5t6*~$%_I5srD>+wgTen1X{Ha zyeL;n8(h@OBR1hboDS>_4!)+4;~9^fkTrC>8=E{UlsyOXT=)`J4BUenhRI^5t9{j#>i2~o_|WCu~VPPieD-C`U~^mqre z2;FT}Ey_Oan9Cm~n>nx1T`Bl&%u4yQxuJ*o#*B)^QXiG9aLVzG+naYc)H&gDQCfuT zKWq7QvvGZ0 z$k5Fj`Gd@x8ZzFn?o5bTzRvn|Hp|_C0b)6`b(kKk*KDmS-Vg9Glom}%Ka8P66YIsD z{lT6#C$zW$L$(9+Xe_cO?^S|49^Y)`kZoBnd*k$xsA;PDk5eo`#+m3^q|+yComscF zm=)6?X$F~VJ%*NC4V~J@*Eff}T)wezO8?>Wf6~t1KHm=yqOEKcb5yyQ_A$IbI;a8m zTp#i5-5utyEOuMhly27QuO%xL{%69kZ!5;ce9{v$I1-_?eq|=5&f0zZ!x-kVmeNFW z`fjd%u{|Iv-SM!F_&8|sZ233x%lW9ZLnkm^+I#tZ`v z^lGa$&O>^D4pfxbBIt~Iyt-Bt#$vqPOfD@+B0$*H>@=&YyrX@r{o&^0G-#NR>8Uor zRU=LG3t%gzrBf+Ml(W!91ortKTny$I>KLtHiMC=dfb)I==y;e9=U4uuy@Hv%cY20UR|TofRk~JL zLsC)JfWT@3V7v`A*trW~i5MR%tkCQ)m<0N~GgfG=Q)*nbocEQzOBs)r)5Fjli-jk%lN z)6_8ZB-7>7^xxKokJ~0>L*%}N=AP}Od7RkwPBA=;;%CQt(WG<+C`VBWwNQ2|nJgeO zyDlx&)MD+YjM@{NuTC)eI*?W8IVY^(uW=7)#tJ#WqCxXBF!rehr|4jd9f}S|7a`Ll znll1lhV~#7ay(Mb%^$(Hs}jzq9shU9_SRRye1~)MTaghu#%6FWFH3lyVF1OtO0NY@ z|Df2X_@tV*mcJe~H&tlx2GxSToW&|RXm5ux;m&Lr<5WLTh5ZxIwxSdkI72!vV>S99 z;Ow%_F`7~H*D|NF99-0;siE6k3RBoOSZuT6L>1@fyJ#p%8zN*G;^d+Ak8Uk z|5%(#=Os3zn|vDoz4{`a&`79LmFgX@2KnX(&oOJ|9&nrX#w@N~+~5DrGCOz`BFY$C z12uqpW@fu=E0LN*3vHshC#&Ke>c7E$y}f#x5Bl_$fgiDdYsQ;O>Bqd_X|RuZhlMN* zDbVe#ivyFwkccbx#2eCqqQFkgC^vC4-ZzLw{2@LiSBnzk&tlo%p0PO(BPYCGxL;`($hlrF&-q|#X~iRFr4Xjbtm&Ir(lqT@U%(+Yrbi6J$91BK zbFH3^)fQ3<)v2$FWE!SE-}x5yBomr^#5FbROCpLlbH)M4!h zZ#$3q=n5ogcAZ6jX}!kQbW5g9e82~&%4%U|Lb=(!^{lvl zQyT%zk&|3uw#EXqjo-Kne4Kl&c%-x|>S&%}_FL#|M~M^RR1h*l{JZ#6_^A9VHNMQt zZT|o8yWP~XwQ-s0&>5fkdX3VUpXE{`=9%hedA)4R{kMhA?=XDZK(+!?zM##2A`UFYcIQIn=Z>KCp?z}q!LnRqLNw{c4fH1lI$*vUPY z-Ze)=%EtFC50ZNS)@*-IpWzW;l9NZS_fiBF*)N!nIF_S^a>$~=?rB3g-sh(8;Kta7 zp7K+Lm-SZt$B@NACytU-$!4#^rl*R|9pnHGJjmZrcGCDKz))2FLer-mCaI8od8}Q= z%fEH3a0Xg;;g)N3$F}VJ?(D>*58z)0&0Gh?3ZafAv)tLCokw#RZi5Sb4D07(?h9w{ z^pAhtwpzNsIa_p0|Gr(j;`X4kFD~Ab~(!8nhPdv;7;P^`y5d4Up(KdK;3 zykpDwqs%20Zy$1`t+LXy)2Zj~GNbV+KIU?!5`pDTB%`^hmrhV!UrYYbjt5;|{N6mu z;aKaOve9tgD8H#^Flo{0xz$ne^(n;KTYj?jC6?LI2_C}E?~fG3UCy0lxL3<}A0N9dnZ)4q_99+#%9YXJK=2;-IhBhvl=5V1V| z@6b$7H?RqHO0AI(H!!g&vyQ+(;!w)UCto0oUc&i$@=!id<2B1H?gQPG#W7QwBxmDQAycx0&iXsn(!@7q3%DG?WJ3 z_c+&tBZX2XGRouq<(dJ1beuX`dbNI)E_ zH4t)^_3T@`CbAua@4HbRu*+E(w!k7b4p>GZkx5iVDO9rkrxx$VKKk#_ z{R+73W4ROQua4|RKKcMW<-x)0c3>zKK$`Va8gifiNmb}Jfy8PKIdzLViS8@i`}-jC z=4EBX^U7m6Vv=U1t{|Csjpd~!>yD*CNLJoXTXwnPTFI_2r$5BAGHAQj9gYuZhCuWC13M5ok}^u^q7g|>j%@F6#%)dLkz|{3Ixc`N>QnY0 zc9#`n>pXzbu+X^mFr&LWx&HQwJ0F|L#L~b3NSZ#YP7~-)METYrdyJXWiBCGkd`XY7 z0q}Q&XI=zTW||(0J8qgKHj%zfUmx!G`n=t+H2o_z{*%D-eWyNndb)%+aPyo+(l)=l z%(I6D_(^3onvzC)kWiW5c~>j7bNbJne&(RB#kq39MI%-O2Ky2f zNkiy#J3jRj6SI>UklhN*I3aCnA!{1gm-PA5n`^^o-jIdvx75g2m$s$17B{eQaw9|P z;W}T5ugM~-J;L;x2D4lp{P-&}r^?h))X~~3Z!?oEY;}MKFT7s`fS4*)Yt!VP;?gzB zUtY||*)(s8Z_Cd~Nw;2VkQf4#@ z%|693`jtbLU~?E|-O@M4t2g;r5ttNxEqFy2AMy97(6Ww$|FLgJ;qR*}hD*GT%VzIH zkhrYL&BfvDjW@6CMoBi|?`mfkfx^}v(=d57e zv!(3*(O*}1H4HfQXnX!d#7Z}gpNvaXM+E2_5h6s|qwhC237!hC4ZHOFXM*u@Gt{f? zEMG~dGjI0%EQ59nH*vVxWyJ2Xi{@r_E7oxCks}>NLvd5 zu`bv?@Jpfu3RVH!#w7mKxBvqm;gySYMHxI_EnW7SOW_GQjND>fnrFsyLVEbW^`+If zwKeXJ5xPN*AnrL~nrI;no1Skrpnjp}Jv#unBlW_!&i-PuL3h%7v|EQ_Cvr#^T-<)P z!rlCA#c9oXNv@WsZpAq!=*;}&(0OOLvY9{0gzl{~;VZqyz0w$#ROf$(=+DGnX)L27-s28xiwq%FE#AFos3?39cA>2!PkZ4CNTE1hnWB-oW|~g&%b_*_^46$G>zl{@=9qs1w{RqEgSw8VDez_sl&_P`*zSP8bNzw8dX{ahh@5&>k zK}i*}%f5|sFc^8VV7gq>TU;lgAuMQ+=mTaeg6W5;xOkrI6d=m?9haTh!TuPxVQyS$ zjY{qAshx9sU%HVXqu`m5mB3C($-Wm}g=xyA-{zR`zLIPJ>%?(&y47O37(1C7RTN!` zqz9n1s8EBWUK4-J?&I6k1EgldKgK7K^)6V5CrbF1gbp5HsMsGXEE9%PJYL{9P}Jna zepce^(or(iTANpfl

zStklTbCf*HjXtNX)qedH=f(H(RuvC?kOzKDN#d!*4-n50 zy@`j}xo(8~}C~3DkPgLCK zpTB>9@l3vnujl(fqid;RHck;H3JqiD7ART%8aY_Mu&@a1Nw~Wldy?UfA}QpZZuITx4Fm65 zlsM3_#J$JBZd3tt!>9e>XhuOF&tOd7d0}=2^WD`Y?ymeb3TVP<27!pO%{n<#pCZCKIjte?YggVI773Q7F{3Qln0zm z$0oQ3bq9^WA^vTV&_U4?wAQ-B<_CR^#d(=-i(|cDX=kKuHCGE$wXW@G@4m|L2@A{% zp1`+fKIq%?PP0PxW?9y*8AK0sUI7ZqU?gx4wl1}tzJl`=Ev9aE&^TL(`Pg{Wjs2$5 zXYe3zA>UH;r<@b~?P2n?sGLDPGua!N*IGtKi^LCdFpt&w`e--w&vR}f1g{$ek0#FK85_k{e1StIt&zj=L_y1wb20#NictRB{LQ(vacPvPD;N>$de0KQl<4T&*Ql zxjRlqesLan(7$Q9ZD_()=6IujfEpjyFn0S_XnbVQxFpLno(4(KSEXXkIJdF0?Befb zYQ>!hxKv~nsrUK2P*vWYK(nPUlFLSv8E_v)s8gQzgVF#7B!5ZZ#ucstDZLjoGtyTi zi?~9u8b>^76b=K&mH4Q{Rx4d=I?`UMV+T=N50$^0W4l{Oc!3i1rUf(c<zsZc`S41Oc^vcFtngh+KfHh;u+hcQLS12ojPwe`0u#!>i*_BH`@8Y~raXh%SBRhtwWgB3+t>*qLqRQcHWaW((j z$IrGe?7m!9uIP7ob+zlz^e5O^@DnWQe-_z~gaOP8ZOjFINBs~SJGtLok&RhAGVKp; z3=TN;!yO(Fc|k{x+bg>5V+Xxtq@Pjc{GKie-y!r-j-YIr%DqGZ-X*rxfTM)g$a55? z#xJnz!!HObKSrbWotMgCuWv`iW&*#}dwudcZ+a9r!VyCcPQ&;^ATb2kvEZ3tHxKja zovN+t7Wo@L*2C0;Dre1*F#6SjXBv4@9vQckrRO_c5NS?BAx#xP_|fUyFJG_Ot$!_P ziuf~HV_A@#*=D20Aq`vn+V$059HZ-m1oONP%5a8?0Hp)`lJUpr=W$%8Hnt9&N#fW9QO{+;d`!ZUZUp zCjezaZ>XU-dxpRE1#L)RF={A1Cis+3yFrOt>8pL+b=Go-#-L1nZJ~Z()Q4j#Ix+jk zH1&+O+v)|rFC>P`(mqV&!+;C9xlyOr>EI^^>XC`DR+d}qk)UXu7F=kjq?JYQYGHRx^0 z;!k!aDauu+qwxw7NURSFf2aLTrClZ*VHcAs`m`J z3>dQ|h=Tf2wAWn84`xB(d^)%bIgX*;_F0}|v$3}NSvM?fORjycy#xu5XQ?0LT^esR zkm?kf9Rl#txG=ClV}VtN(Xvl5W4@bIO^PhZ%(&h3N|`o%Uzdk#t8$>{5vZ>=1Z+Z7SxekbRhR{}2c zPEr@CoE|{K%s>XPqK0z5tzN?|A0P{$Xcy^N4+H$t##NxkT{rvRmdHqx@a6lyj;2XR zt`99GOrQR0Ho-d$@U+3`e)8W9Q#+J1Tq(djJl(DyMy=Qg5jg9o)5OwMo#vu^TTxD8 zXY$=jVwB*K*G_xBmm*$XG~HzZ=$w|dj^mgXE>8Ue6yAAu45d+RRRD&{1Ix4alyJQ-kzXt#+ewXO zO-=PI(a=es)i2u{o0+~kgTII3=_8y#WL9tI2_QR*av1rz2gVHOoww?7EV{`o?*>#Z zx>3BsWAO!!5`~?qQ9&ZK*Gm=%7tuG>sVBVh4s(k-IM;oficYgDIA*>i;a~eIp`8W| zEzTy-llsXt$mvyk>!;tVYDLPzvilhi8ie-bs#+PijVy+7w-Z@(vZit5>{=M_)Rg}p z82=htfjNb%b|cNt&2+pP9;eJ(%YK^u%#6t>6u#-;cxaq=3MIe<^`uL1t(dq}eMC9D zo@>N(b*Y3t_$A;a72EC-QW_KbO}6FD@T{t_Cb8|b>kEk&-@cCIseQzA4+iN7QsCI& z_`HR?PIS{O?oHvJj-C2x|71r>A^P)whnfhfXhQ%~rk2$)mIvHFHjKNk2_#ea%UjwQ zaqn#>^-G%Dl2lx;J?fTpRxiGl+8LsEo6UkG63=S^huSF59Ji+0ReNc$=nmvhr%>(L*B3 z5x9+KoEz|nGdOCE8FhHwEr`Zvs55aoqT^=}ru+7}k5*D#dzEghFn)x3~*SjW4cC%WyEk!P8@1l3!|Jfj~f>e;l zcqaz{{a74l5e2x~LR9UkZ{V~UHO+Zts&@jSwo%zyLUQ#|2iCR4whR_kQGHsT%x4-0 zZGL5;lY6N)8Q7_s2=r)1lh&TKH1+)+6|wGAqFTXQ

#oq&!A$=#j2YG&KxE`sJqH{?9_|CJHq!TysGfvZo3dMOw^51<=<*hwfi#; z3MXuAP7YECZey$fH-mx50cy^h=?G$>z7@w6J%PS5jS{S0g*9N}K(s>Q3!c0M6%M3~ zAcdXAeon}ZOImAZy12Moi%h0Az0EXRHdYFAbT}o$H!q*w3t=lmlGG8Pe(+&^jWR!J z;pq^8BkZ8=h*8FHc{SurOZDn+zg@c_-*OE|2!GRSmP*t2$}h6Nvwb~ad4`n?!bS(f zyIXfRR^RDivEOb!;pG!8J@qqw`@6|nsy3U)LypC6iCW;)poz`P#Uc>;zWZWZW0u8NYu(2h-ej?*Rs_`ds@dKLOFwEpfKMW_VIJ{FC;bM^S* zgLb^h-#@34gIiFwlcpVt??<`5XPeG$Bz?@ZfXc!aetK^tF{98 z5BH@%H~vkmJ^zpP_`lvqG`f)91DLbz{J?K;%ePaPF_5AqCE4qUKJkJ!x#MQ}K<(nI zwXfBW@=ktkIg)#mFFJav^CMGzLyDt?9Js|;j;BSP>Jw`~+C;W!@}mP1b$3~lA6q}Q zB&@yPrH}Poy)R@eJ0u))>#LEX#1{?-Jq+kp1bG7=QQB$X__M349%6CtCpI(e<{t~I zJbI}3`p|-4{D}B!pI+a+C60^RF1!G$DpQ=~s|GEX&EC*O7>h{c?Ap&ZRm{5W&k%we z{h?R`uGv8gAh8fQ0py*) znmU})b2U%+;RDOP^pz?gt|fJvCyP?~PV~kJu_dV;WeprRuJLz$6R&`U_1UT@ALp6% zdX-&Y>GFW(#<-c%jKIULuOCY~3ZKJztz+uFHx7U!9RyL$K0FLLkDRt*1|*7c9O>wp zYTy3enK^EKy80k*sQ!S2NNvX!LL)barZJBMX0W}|lIZ|ZbcERWk}{B6q}kXu%5|#v z;ZA}R5PGg;<1j>!RPRwpIZEM&pom%@hfE0Cht6^c ztu(UKbsO9aUN<#NwS0=G&4}2+++>HbaLnmAo;Whynk{cA#Rm5QY7|Lsq(}L$Pyi?l zNk3~<%MZ58lWpakDGWQ;`6T5LykI)}VrrS){Qw7?3_F7Zl-9d2z`X*bHdnUyd%vs5 zc$PQ=o8+&5jAoMa+gwLXBBw&ROT~}bm~dkDU)uzepH8zbyIkR27KAB0I}*a!x`!{C zg-wMdZ0@9suT5!m4CAgA*jvaowWcl+S~6@)@PSkGrSeTi65n-9moCvGm*K}XfW<(h zlZgBm+34V3D2ocS3q?|Kkn55PvrkXG{!wR9prN+=_bsU|MJ-77h-0zHs-Kq9S91N+ z&>2~h#j5=Lis7)od+2`em6C%?qBx=ko-`T$KTIT=mBVnNhtWXs`=CBd424n66)9Dgtc>XrsX($roj^rHCpF1{anzj(*QVwky#>ZkV)u z%Vrw$h5p_X9lYN1?P*?OfTl~^K^w3pi&A4~b909*K z!L_fLqYP>1N(_|GtNtXYJ`q^=Hk>$`Tmu4Q!d;9Va@m>+ z7M({HTTG~H&91k7(JCmg*jOR9wiJcs^TG%%`PX;VmAc%2#kz*Ou8dR$SoxN&&iLYA z`EC4RCGTBc6v}OG(e&dF+uie%Q|_3YH;@?5z%w=3;1~eT^d*vdSi;N(WI!+a0)x;u z8;KKR8(T9)^SrODK3#Y5e-~MH`-9o({_x9*B?OE1CJpgjk#BA2fWu>$CpiZRXi+4w zdw=9PPi+<0(Ee#=)Vv~}V3#ghoAu|IT07n6eM^Rp*S^bKTizZm%b216vt24be;EpW zoMFK+9bkF0CCj-gOo1+QG-&nj;Q#51d-!J-O=70Zt z_T!JUS6+Pf!7w1O8ITEskl21HjPdoiD}fnXh%Zl2*MCSGvUepm6Phwg@v-V5l6kfN zq@8#$c+%vu%5^DbY(Rc#P^7ze!@Xsw`|!3!RbYi-<^Gc_i?TVDu~nt!J(DkifwBXp!$JQj9-zH4g0s$JXkOuI6GnH}MsG)G_XwR2^|sg7B+s(_gsND}!9VY*$c zYW8?-W;ljsEA?&y^+V^5kcMV`ZsKI&TLkYex{hNCyge9?Ju49Zkt@%fRJtsjfaMg z0S!MNhL!MexI=fKMd0=TywmJyw)pmyjMnx51f71rwC2A#Sb9@lN~Wf@`?ZZV2CkQhny0kA+t-60B!eFd2)oQZK;}~Aii!h579<0X%t2xEbJoJY zLbvn&!7FZyd^HcN{_#8dP}q{G)LY&F_HRvoy&e*LwMceyAQt7)DfeBi-F}ho{h$Ru zF*OBsC>ZH%%XhNn8@m`g^Io!E_$gm7AwHzQ;(v*3MN?~fn-wl<7G*!@$w>h@lMY8~ zTlU=Alv=Oo?6Bs>8XRr$xic_@RSJO15SRsvuur&Cz;Y337p7KmASpaOMtu6CI!5R_ z?Lu5rx))|?_+N})KVv}FwyIjlLMQvFE%%G4YWkloI)Vx7CH@6uhhP$6lHBuN9zoSe zy-zNkgi`2QM%%1a5ZqgZSzRS5qv`ei=*h3S-@igWV`Dl!sC z$UFe`MHI#^H4%_<(5ly)h*~>OXGdRKs?*te^UwAH=Q@ubWN}r?P%1#6Q!>rJC6ZPs zNef8O8l*=;S|-#*6%kq&Ju>@`MkdO?1S{X%{&`O}(=_#=)<(&X5Pi{MVqVtaAzmlR~l&feXv%)lNG+G0> z-?O0JJrdufyOPkUhg9fBRKX>p$m`7^V1B4;LEBW^Ki>JLD=*$l8oeW3DS82$^ihwQ)YR1B>Rx=v&4&ja8+$j4 z%iSHEEvm@-V@YZIU+HZGov!0ksal~eEwWhuFw2wbqmHahz`vi=U||Z@;;J095fOrm zFn)!8108B?|8q*?(Nac1uQIhp%=YExK26+zDf$6H!`(dRS=MRADH}EDa+sLR-@3`H zz=MWP6*MKkDUnJP=IR2Utp}1QxYp*yD39Sjq(&Kc|4T9-a~{%3v@=)TG90_8xbFG= z_0Mb%{%6v=xN_P-2GRS2*Gr#H(8C&@%;4f@2n$acq@5R;+`>%#&X7r04Qp4(HJk*SuE6)R(^?XXHIiJP@vzy0OnE#X-n0kWAwblH0{8hUj% zLlsVj2GgpP+u$T1XD|X$1M`)8zm%Nh=)Mtg1yA?7;-b9zv!m1$PhKl1AxznZ0ZPn8 zmJt&StZCxRI#BZxpUQ>Ps`PLq0T{!(SCW{3Imfl2{Z-Bm;t6$Fnb#MMNgkL&Bg0jf z+%zq~uO7^na0-INYFE0!O*r~HCWQuj*?x@SuO5e%ZeYh2vsZehK~wGa)EZOH;An8F z2c&LX{%RNI*qiC6^Lan^GGd*JuYg1CAWjGGFrM&2W7aJuY$K0z6{*+b5)z+YK6P+WZxZN76oDt%gCM-&_e!vrP0o7^JvcwL%RH#K8GGfWHZyud+BNQcqjnTuIMA{=lR z3AphdrV)>_(_xbUuR4EnZGT415JYmtPyB|KmVj29QZ0_7XQHJlnFw*%~Yvuzt&43Qhu*`C&i9! zMO)#Xv+Dm}KF{OGAv;*K;mOHHI*6(kTMe*;{~bzfY)gKvs&5@m6A%6~eonRfA>wD< zWZop<29geaDjD6zsy}#(@xhRe_Mt4^yCKcY*l#~$tU8Hk zTn%Ycx|BIQTpatX3eQ4oi@iTv4(dh@R8*OHn`CI#B1BZ^ur24;>2yldoj7a+aoHTvY53$7c!-pY6&p%B*FILGsrct&h(*Y%6Gv?U@~mtR?3rlX8z6JkSK_8n$KeGE9WY(> z6zMa{5;?8|3vy$I7f}}`Ixns2@J`{|qIrU!0et6U$7JfPtLt6$`z9ZZzC^s7(=fSs zRqg(C13Qvsc!1@~F_j(I6;$lWHAgYh()=X3uGEE%v$qyytu38&b^TJ3oW8MJbZ@BB z3=;{F7|sS|B!@Iui(b+tFX zQ$cs?jekPJpT5h0eGO1`{8(1<{#8+X1uW9gxr{y;)Ed;uicWH^f96+QeuZE;y6ivi z8ctipnZ6r3A_w@IkpB3lU$_O#*Qz8QNF;@ zA(D~l8;xnCHGz2?D}5$fOxo^Kwdk!*=V7K8SL84Y&(P@_5d;V&$V;>oB%~5OBnr&Y z?MF&~xKI*yy2pEjS95>s?{(0YkBSMJAzsSD6sgXg<4m(pkQlNClL|P&ASaSjpRkQ~ zyO(!hHdv-oTh4iZ)h3ykJ@WCigSP3%BF|+(=MQSY3x(h_hAO;4v>e-n0pMExSu|%J zKd}dUg0imLw~DVH-8C8|4Sp+qr74)DWR|~Prf7Onxu=hWA1E7w-cPBXmLx!4|F3ZlVyn)u0UPvqqf3$`%whlNa&wkg! z#JBQZH~fk)Cd0)Dtte65#Ev%X7juP14U14&lgMYv2_8NyfWq%m#rUWvpsycfdrh=! zaV(Hwi`S9HwB3{^yvxWoTPB=B87%3F`hYKKvhw%3wT)=>c^H}|_+(}9hG6v0)~Asf z*h2iq3Z`ZqbE;iEQnZR@O3>XT)FRXVJM>^eUFe7xA$If6iDm5PM7Q31#{^B54g1`N z-tY&obQt;(#AqzFzb29zrO|^C4gp>8%W**$M~qbYiM?lT+Wwe}-S#SCIZG=EJz#G4 zXK<^dm+!BL6C*6-lzl-Fs)mm9drmqU*19=P(+(qclb0LEt}izY@z$RC9b70IPaVJ4 z)|7aMF(k&K9enf$dj3~$mKA`HUSCrd zX)N-nKIc4sp2b~z-j>CNs@f+B%V&s`E+BcZ^4)O3R?`rbh_V^xLK;*kG zwfvS=hl78YWRPa(?mUT|QCCbzob=p_%CZIsg+SgwJ|q^8`^y=n4(NhnBBA#{J(=tt z$1LmdlXEpB?E;@&Qz^Mjs*opK_C@9$N4wJ7qO+_+2U!%V!${XEPtx70%pI8n7Mxql zV&m>-L9?9G|4Fyk?QtzMrYF?BR~;bfPp1BT^tkp^Zh2T)nv*5RIKN=2GZimlPZ=F7 z8lJ1mL{#~96g6>dt~b`;YpI)l9aCFdnmlbbg!2d$e1O%5(6(OMk$rOk27yACq%kqH z8a-+nk)~?cPq7)>sgOekBd&Y52Ps2NRzLnJdu2?+k|W~D8UcihP3rV)jye0kLq=?^ z1=wFmd+JES4l!Q4=n9j=HDWZC>)oA}DE$*7+7v2J`%0UXlR)$hV4u3Zx1dkH4OLCQ z-w0f!5Z>pAu$M&Yk+DumKka)0qSiDd9tx81WB4)P!nc}!Q%oubLe(GTKgjj0&Qf}% zu{GxzNJ48I#1kI_WQr>?(v}H|3)!NppZ>LCF&;7m9>^amD%CFfRy!3I*0k&U40BjF z-lx_x`+R+`kcEcTT&(z@yZLzX#-8E_cgmv0hk5zjj<&=HiKf+SmM7f8F?sY!aFym(D%szT1xx(3-cp!ye?^obhX#CLwZC!OsolU?{V& zme#y~jrQHK9uGrQsz31VKQnhRs&~gX+ybVfj$5S&KQT)PqMDAwi_7npV2F zUw&#+A&cPDs_mHTbRGI5&si*-kaqn?*JoMBf&Q)Mm{S-Z>`5249<4JzEDZjz3c8l> z)t^@beA78%AB7$@6WZ!?l#|27g7}%AORDPMRGkg7bp00sRjddmx&MZQ&PC1yg{CFy zh~31O&cbolB1Jh68(c2hSDx|}b`rDj0Vagl0R&$E9b&~Z$gw4CXRiGs?l^nJnecr} zMVjI?DiqnKT=J4eGi`WD``XR!XfLx6@(?;mXvss2A$;J?$OqV{5z`H$&Bf>*dnHL8_8175Yu1Yj2q7>%tHST41hI;r+<>fiU5j4 zhJ8Rf`dAw~gO=)K3=-gqRIl!<;c+7&-lcQ%uItPZmbp|)=+||`A+HpEvP)Lx5rE$T z1j<0T-pg2|cNeA6EEatfiD5N==SczrS$6zFs?`83B)|FYvevG${ zEU4-qcy*_#E79S#Kvgw(0gG)gEnvd?Ko>4HGAD{;nPu5(c{F$xE}18ve`;0-8Y{Xy zWo=S3cB6Cp>BIY}CN0_dAeDtQN-wryw;Lvo()o@SVi)uXk$*{_Cys6fLvP}(G8uEe zVP{=`d>#)kdQx_?h8nc25gvO@p7HJUcT_gxj{^SYc$V9QcW5i(TubP3gyH>;&BXih z_zKxhIj^NnBb~L5NNci^&umA5thz13)Y+u>H|q=7Mk^o>BePv zPzM?cgMY|;RA*V8C+*x)y(>7N`H?iAC*i6mtDkAcei&Kx@5@YNC;_lDFl5F2NP_(bIGBa~FO=-~7oN_KT_!>-&jMN-a zX>veP$`KWz$$3gmElnwBQzR9|5pqt=%sIgcOw9p>ETurc{r=a{+DB_$*WL%~S_dA( z`}%M{_x-znL!AF-dGOKPuD_K{9#55`8~4C!BMbMvbPBO?tW4jXlF)an?4)lM!h5l* zU~URGP^hliF<=|m@w%eoyas>$jJmO=dH8B=D>*CoTr;_9z47++y8*pSnlJi@0LB?y zljVC0z?`KXTAbW0rznK6$ctoEAe20ly~p) zli)ifNB}JfFDf)f0&FPK$3gK*`WUUlki}nR3`Pr2a_v_{s#NHV8z~oL0%{Ff46)fd(C-hC3W*_oP+X(F0b=&JzI;>GOC%vvh<66-h*^Gex8usW? zNwFf*W}0!cAmNPI|I=(;kB>pVD?I{yAOW%AMdKdld;cdTamw4>2^w!DOn8lDC_{lW zPjjvUEw!>`=1t*3J1@IXhC>n)Peo*HDb|hJ^>NG$yHCfM>St7MF`peu;5B#CIJZcQ zJspq_q#o@BG5uLIsv_3V!*mALr>0M$*}%rbe-l zAnd<9I9IP5cb@0Lm1jIvAgi8D-vlOOC& zNp5YUw7G12O;t4qP`Df}FY*KS_*7XgKGwM_8B3sty5ZyXd|F0NJ&zM4#rvQ&zem%J zMFOv+|4BmzdHBD_|Ix1Be3W!7Gv`^h7B$vG@#S&WV%10@eKlMiw`E%=Ux*CS@@tux zPi2d9H<&cG8mbJ7-g#?b$Ejcj)198q9O8mg=d{FO9T9bFrSe}<+v#vylN|Ob)kkO3 zyTvOH9k^V-o55l%Kup-P@oZ1o3|m|2>r`L8 zxcDf3H&gL%XEH>~86>a$k=>-QwmKlv*km>gY5>>KptTf|W`~Y!z^-Qu%&7 z!d70(P>VhZrI`FBms0`bP+$FZH&YFhW-yAj4gN(BaIMpkYVhar9y$8|IPU$*ivn&j z@I;Fpa*hPTkhUKAOMj%vk%>;5%+pj07m9q&>)L9<&4deAKf^Ufk_Yn0BklKcR{t^S zT{wR*O8z5o`l6|_f`9$-z-|^Fuc-bU(HZ8pDbV^b?k^9J3ek;ei+R~5CBILE7p33x z&4xbkyt?ycq`ul>4^WuggYY-Z?1rm%Lv zF0!TH->7-H#;wYW8=OS8$7#<0w~Kd%#+EM^epUepG4Xt(Wfd{5N*!N+1tJGlaQEbK zLqt$eU;lyjnUhHV@rLJ~@cv`arJi#ql;_Or|2k%~m$(}po~8iT4Hk!}EscpOn?0D( zL$%<_rgkC`*N4cj)@Q_GlXIadsN7UFr~A(@D;j1e^(wx7{r3-k4sdMUrH9pL()OX; zvg0;>4T@t$N5RsUkwImbL>8mNm6L*O46P1UH!(`v_r}@n`vVErBL=*d8b)@fp-@9*IA#G%Qnb)?AiTE5fN2p(`Xi=5)s5pkcv zsx&UB4N8ciAddXE%V$;w!`X#+^aC9A?!hrJ1nkMir_6f^&@xWVp0oGq zo&W8ktiR(MVR~4kPDoPznZ_})KZv=}{;dU4kLX>InIOs9zeoRx^6Wot(BlO1Y$ zskSC(1l9j7kSZwej^vN~Yn^x5gaGWbHdic^E4KmY!-Wz8Q4S$V;8P{Aq;fDS3cQ+Z zoRaI@S76|B`l;igEe1n<2kBnYd0yR@emvn)VHim`;6_TCV31o;~2 zn7VP5$3{(vkl0@g3MD06(0lUn6ijPZMctmf>c_jC>RGxdZvl5Li3G6r zvfJ)S>?JPNG{Tcm_rZNlt}Tvz>wYqJ`N^XGz;)t=#zrrXpS?U* zvK2Z$VePpvH!~fD)(TlxQhUD{<_-BsU}Us|WQ9g6h}!*00*NvVoaK~QQny8XYlZi( zpsOD2i?NHm{ZsXL?XI*L9b)G*wL2$VQeUY9Unw3pOqJtGuuVA?aIQsIgaCXt7rH~x zEgIH&3Af%pi%f^VwEox#J-Ys2<393ob;|NHsWScT(hgD#5VCg!bA#~_Au9N%fOqe5 z?ck&lUSj!?E4?GX`EI=9)yTOZPp?wpM_TPm6`cmIu$s9#;OqfRe1q;>aK`%;(|ZHM zdLbxFa*G_x*i!%1EfH5I+sZxnYs!x`#NB#X+*@0GZUZ&&B{wmJlv!4;i;kev`<&eD zGmT{jXyl}MC0DvRC43!ar);*`c=5%M1;#DR&6 zWjPVw66wY4Z?#0TkA8N$kUja$&v|`(+aM}aqy^d}BlYY|*$*0u#>kyF?F1cMeT4hs z`A-z2%~O&$J%>NI`rj_e*yQ^kM!i~cJ%`-ZXU5yjy*G*1O%qXuy^o~zvm7O@A6IYb zi2@W0tO$pycVK`6ohNic_RjJU%&oM!ifM;S%_C~roo?V)mD(&Cv|p5I(6e~`$`-dx zWApnz?Jo*IaRiPnBARvti>|_?>m}ijkaeUxXU-2>c(L^M{D{a*K$`wt&wJ!!VOn{* zHk~O}m;511W6ApdWJ|Xy*efE$?`A%dZND>14s?TCx)~(Y@WH({s+E8KIJi@ME;vT$ zI1EkVmqj60ORFgE0O}-F{n-UK=@$DK3ChC>OJt{aW#^2Y2|tSfuqJt|Lu|ibS`>H5ZM+n4r!~9Gn)da;tJ=&5~)h{brl#| zo9Di2uJU*?ksRm5a7jTyDY3TJ&tEq_l@ZBI%08lDKQmDQ{DjYekJ_>tsK+tp^ZQd< z^jHcO;Ur9nIQmNSNWSml_=yyy)qk^{9Ioh0o=infF7;3rUfo~RF$W?Jm>UNKCpk-P zplBdFsatQ~4={++$ociv7k7MQQ8-#{aP9jIO1)uGknqpw6hm7&lYS`nuI$`3za+CS z`XzP#S632~HqbSTBTlV3O^FG1S?o5J&+uV~sOdaUUtr6C%CL%B-%wK@P(iWq0-1_i zoHLjaPr$_?YmjC26gc`&=mbuaHxJ|93biB#R0^l=5Bpy+JpH!UtDc>?M6pfpuI|-J zFGK@y_0t5vvq&$cZpV~)vxUM5>j8-gES_|?e(=+*Og>aq2$+H__5F+?OQdb0`H;Vz zo8T*4h(L<86*NXJ$I3G$WH9~hDiUK@^&*~6x90&)H)%I=Msqm$8*UKkkMRLq&AMpo zDo`YGAxm2|Wo4Hf77twNpLv$RT^rv-O3h^rc8Y_pj|(0Fi))1y>VdDnp&G%7$w5|; zpqd$jx09_|EgGsWvpa2o`eZSWevCxi3Ucg#*t$ zU!7~4J1u~<@SYX%()({dG1d|DY@nuZv*l91E425hRwW**?juSYTvIzVnX4W{sy}M>a0EOP#sao7xTTJbZw<-&)M@A zp_6T<#Ic!Wl6RAqzw_(9@$K{B0e{je^Gxmib#(tYHR<`Wt7t!$GOfbcdIRgA&KFmE2PR(sK_>L;Dv zzwj3!km+Z^Qn43-y$&GIIRI?gU5q7;@nYt?6$6?JR)t_&@Zi5=So0vH$Y%o&D<5+h zT8|FxvbdRjyrW5WQ}rxAl`X>8=fSt0CU%$+XOpp(Otdsc%gGM7*{oIlq zY=|=`$`N-z(}{tFJ*pczO*MbKHNNUQ{`*8$^JiZXyC`bilV~2O%Jk+Q*7Kbm33kT(%F|d zq;`Y^R*nbfI|*)caPjXjUSzSjV4Wb_NAD+%(m!E;tgoF;IGUPwa;IQSXNf@$C!F*z zXW@Bjh_$5(q&-isT}6YN{oDfdo(Hqx3?{WmGLt>`jrI@u-KD@WNo`g19f})Z*+G z{&)N$_RUA261~A%HMBSF+RE&Wh(ril52DmqDHjilk( zKb>SUZLZo#qSo{L7=xKM!}fe9drH^>o@^zM^>NsFW&BNe6zj%Aah9OmFPU@MTts59 zGIZYE#Oc3XcT7#s!Wqlb(=Jx0iIL~XuZQ*&$IicqU8TlpO!T1Pk+bbWFhf4QhHH-P~n!=Uw5{RJV#o zJ1yJnd%82S?Qn9T(Nab8FX-#K*7e2*8Gg&<>PJ1S9gPFO^TI<{BdylM93qSw-J`yb zz@Bkp1u~^QW=oyZde^z?YeVQFo{|G^tV&=2lOr6foVe%kA@aXnXMVUO{wrS8f7kJK zsq5V=+XBr~i1Q6%cm|)f)CEhX?E;@$!R^oZNZW^XMYE>Sw#_hw)~?0YLi&#|d7vbi zMZizOy(9zfCi^rVm!$PSs;54y*?EeSaG6A!h_XOZ77>tc;B(@$+M&%sG^gft_QI3@ zc0C#>Gp&if7{BY*=h*#W`kZ;8Xcz~<1YW@@96{CsPs9W<|N4y!_i^?$m%9uU{unn) zt{kVxX_R|sOMg81s`4%?+|$_7@?maTb$S^m-45_aYMSl9`zSTS;rtsYxBg7?(&FvX zGx}W=HGXre+}2j6KWbS3@rj(?^c?UDM?b;OH6RWOY?$JR?k2)hBc)HNj~%)^WrhLq z*~vk~sIC;eA9~Jcz+R&u<-#eu^r%Y%S5Dio{w(fre;#wj^Hs5KJH;)J_z?mxfDS9l ztU!p1D=~YX2K<^8{XsR(hL7lYF3x*y2As%(!tHCUPsFRLT-yw2@VQwT5v3&*o#qHZ zkDCV98d-zMfKCa@`3ZnliB?}*^sD?r&vC}cx}*mWs^)4FxJ8e9H0)VUAU&-d}%ZB^Gn*JbF_H+IK##P?M%!o_Ae&pC&MRx z6eN6n@&6J*=l{uHQRDxHxN}aZhMDcjG3|ss2WX6-d96ID!7iHAZ+=v0q!twEoj*gL zxYg?NPeX#EWw_4#p}u!p-?cQ&WBceYu@8RpesQ$l!j86o>_O z+SEmdf$B`xAb{@;fs<0fF?8E0At&Oag{Nw3>c?Bm@f^BVtNp-nmySF`J9tCZ&~)ME z-VDaHjdZiogNA>zs7k^x^Fi?JqQc7C_Yv;g zF(xY}xqa8y{ZT2KWkrrkJ)w4g&wfAm3h8jHNjaKp_VSHx9bIK8s+iU+H`Hcn>&0~t zs=dQI?kleP^0PKF+=h4!Xpv`oQt9(sC5mBerMIRXL?xzNHF371kQd0ep=KkRhi~Vg zFmK*EDl7yFd@KZr6> zNavWgd+0gV@}O@?&!bxxbGQ1B{^AkrTKEph|1w;s2KHV$=N||P&cFA#BdfORL;4nU z<~z3hzg?zUJOU2oHjx-$^Rw&9TI$%0`Ydk4fKfMH+3Yqo$f_d_Xub9{0v?pcyNjQk z=mMxG)T6>Lpd)X`)~NfY1-2a7)Wl!?V%AujqK;#c>-T_{5@EGxaF6Y=nd<{eG11;r zxy=Le!h>2xsWLn(W^6Lxlo8kDoM>S=_o~IY0!frh+4_4pZL6d{U-)z7f(?5<=0d^U za_w}oy~dUB%bg8ou>z^hs}n8znUGk|Q@pN6x&-FNB;JW5Y4mS``oJhgZ0i))RB(EEo|cM`3ns`;xeFBVu@PhWu}sb2#7Kryb2xQ) z&#XK7`kgz{$M1^mUb!i$_?vb9lxC!ONFFINlIF67vh_E=Gqr`=r0C?N_}hOk4P)dm zDw^bHt@>JKlE<%#q#DFlpk4U6S9a46-{t^T zU6#g;;AFX`Pq7fdvrYn-t0cuCOf~WmcU8~h{OkRtlb3^<>^&VvbBtdXXjI6Ks{6gk z_$|=})bFr4$j1sk;Rx1@7q!=IL2yaOp(}zoO3$h*JAPg)sBF50;=D`c-*l%vA7sA+ zXlYTmU=7&j(4r^5wlN1BLP?<_@0t7fI#uik;Rsc;cTQPXZbYD5G7CQ{{++eXRy&&& zvsQFODVLx-$>_hm#~4QE3lAEW`^w1+Wp;8blv(|M0GmUcIA5dqrB(IwuYss{RCaN1=JAoS%|iEkrAke|tI*QhroLp6y$VM5ny~ zm>|(CbN{Oh8!H#R2L+Lz2)2!Av)i++`KKKee7|)o`~oh1+FZ_z*+ku-3?_`Z#6ES0 zxe=RxmRJ5x@b8#F{n4C$c=+M+JK?1sHsW?D6Pzm|C!;VeQ8p{vpn2if5V%jDlX&7yISN!tC164N8hykY`kk? zd8in!^ncs|_fUV=E9v9$T-xPVkS@{@%(%Z;H$(zoZ-fLKB~GLmr$8Z;OR9}^npClp zz_Q`}BpU!NuJSI8&zu_7 z0Ur|BG}L{?Mup6wv|a_HEKtJJv38M?#mFB4of)4N4zav%)mvXaS`uHFCT-ON;@C-u z3oOWT!qYoBIE|{tQl1+CV2!kI)hpiGrb-Rn%lE}iM+~iq?@eH%AKpv&0)M^Wa$mob zVe7R*;M{nv&T|N1>WIxlzhQFv=kp7>R&6uD0^~UcDwkRAK0D=3B#)Oo+G^PAYzViB zKZ%sO>ZNaT5J(4+hs?dAZ*<5DHo{xg)~0P3 z%;tp+G)lGU!jG~(ooW8nKiOv%E|ktA*j{rI&*<{c^@3^Qt5oAL>IsAxY&Yg!+XqH( zB#}0m&(1e#$`Qj9Kru5;S>XlAxBh7kIz!3p1zz#LJZL$vrK82pico<)Wv8b;LekQQ zDK2kWn|kvD_3Qd^%4nsY`1I6SxUJG)hY|I1TJm(ZmIloAWx<@r?! z5llZbpzy-rb7Q4cK*Q{dysMOGTGLqDP;JAeL&KuG_d2xy;9hm)9EB(GP5}rHo5C~a zLfR1W0l2e+m8)(tGX|p;j*q}`AAk+CU;fEPazjHyl6H}6muQ`2&tWyN=f`2WOB=S9 zqj}`i*8ZpsbVz7z*ka_&_%%~+=SRi1^q(WS1^lpjfS8*FcLnq*@MpYc;30Lmr>o1b z+7rS+kj5%LAu-;nPVk zr|Ro;F`E~(GwN68nw^Iz8<5B=8x^VA&J`#KrKgQ3*V9FRnIj)p8rw#b{iPTCHz{kp zeofa{2hP`88)?5jAM!ysQ9r}3>+TKh=6MKe@oje0BXyLx-(s+55UBv2U=YXyqu95o ztT?C$pf&GCJv)(Z5lYpnKhIx2_c~K2{YW>m!1w!=k30aq+54GGh!Y;i#31(KhC^pS z9QAmrCdRpkp8Y)cBWq=o54H5yv}~F+W<`^8bWR_7`)t7G2G{WP4^R*=Wj+n=g|z3A zM12v8o*kXzh-1G&3E;!PHsn;h3z>LrQOH{GFR3$3t^0VgF^7KLM%p^vP&59+t>QlB zeqhJylZ&E{%Fw4h*INpQxzWG2y>ii$KeCMlYprx*I3v$KscEveYSrQYmx28OT1KnzSKnyLnuj#-gI+mok*@E1r%{(%1vJTm)F&i>nF}uz5NLEYnxr#2k*}&SS9lH{4gM zIglUbLsN0bTJYQfRv!A9h1h9IIq$TG6P&LRV9fJL=>A=GB0-Bcmnmkw9QZyUZASW~ zI;|c!Qr85koY)>FH;DNqn)7A;8dXtY>=z-9aDXkiTn1Ox9iHiy8!?t^jDhan8n0hz zztU)@it{^T2wtbGc_n1HIRs*9%*FIDM1NmlzxTob&R;vr@P=krKmlc)dF|Q&5{JCC zIFi+;>6iC+V?WSWUK7gjdRVQo9oFC@*vr))MsaF>!heAOPF5OHB@O7J_T^7RvQ5Qm zANHSd?c;uaK~~pNY6)Ca`>RV07^VTvDwA1mA_RfXz<;~G;mMxmT!*l&eHH+l0g6}O zLjV15SGEtMdTFz{Z}6olmS#P!U)#~u&l(0G`n^hco>IB&f^6%bq7}rd!2-{iB0N-< zJ!|WbT}dba0!S|ZKaH99|BvtUf6eYY3^Wn4*zh@$0@j#^o^u*Lfj%a=^Oo7()Q)-wXwE&A*y1NOwT$6IabrKZ4lkn5!Mv zc^k~vBpqY@%0JJn$M$8*l^%Z6|D8lwWDu97y)Be19)Nv%7tKJxI((kgm73^=Xs1oi zZr$L_G=!94z3{~=DjK{(aC&x=Pwekpj}uiVC6V&3>5GvunEAVLr;=UzHwBGmq%~j{ zB(jHFy5_-zJ)WS7@h&nU%2>5p&e&`RNN$-XRcGr)Uv(VrylEZ4%(z?^>7rgIuP?21 zTSt{ zZ43V@9F|seRbLKSb1V=wR8@xe?a#R8J|^Q&GV(A>FV$+jJ7%fi=Cth=*vfDZCjPcA z$6~Afx6;$?ofw(j*K8`Nz5`lnK0j3CfohVC`}{Yx4KFV6j}(pCFpbg{-D$o2G2k3jn5@W0fn#x@?pDOC#vPb{9wxX*5Kjn z;+1U5c#hi6LUKx8xjtNrpWBa7nHe8;vKRSWqk4SKFe!<*m%zCON<>I(v`BNs+NkF! zzy-VZ3nJ-?{dc4UaK@9^&G5^P_){&)IbUQIoGL<2imS8T8iv&J#{@woAL+wW1$J zzgBkcg81rvgU-`Za0Y^lym`*78|P*AUm#0R1(VT6ccPSgz&nCWV@q?Oxv1W|^)DH! zy}F}WMsLa&3g?kb>ItA!>(P)9x)oDBRk$A;&ZRsd`^&RRyTt~TcqNz5g+u`4Df5s7Ob za_utKnvF6W@L8uKZqHm4OBW9$kmUt3rc7Zxr-CIc=bQ3sCfvFBw$?qaV-~ihE8xRp zr$^r9UQcTI8$6M4;;Gncu*c)RFLp`gGS%hA3lu!(1}J4lmq&V!y$+ZtZydx_NyO)v z#?JHJF{jPvtrA);lpwdaOv;fDx9UUB?hu^nb2R3IpRSx!1gu(B0n-HCrJhs(3fte7 z`fblvC8xMMK8U4*VC9$2+d8z<5l_i*w*5-bdshYGam;OsuG-W)m&Zd@&Ib3=Ca%fk zYh}Tv-Nz?FOK+S_{?$5K#Hevt7^W9ItS&Ws`BFGqUamXzFr#d}*+ydnGh3DP*MU{a zmgo4)*_Nc0VNqN*A$sk1sXoK+Z3oo25g*_t-$1z-vp8<8ruyHm%8zY7X>^EC zbbAgai))joeVABVn4=x`HQU=1lcz>at?V_*(mNE<)w(m6_u4z%`<3cKVyuA$?fjp_ z!=brN!k?7l-_(>Dm}irg*3V(ofq?{3&>6JkdeA~s6uejrwC4k?-w&J|P z_;i8y)ei+!=};AC{JopMegjxqLcXg#oR z6V9BTj=@7bv8^MV{ZB2#-nn5u`{7LfXGDEeAn(sIH}rWVpN{^8a#gPn$zzwOodO3k z{@iF&uI&_d0y+mo60H`WOjW?-_IRG)~zQEiD-at21iku?K=wz~H$k zlw)RnKdNux((8+Q⁡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 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index f11fa32..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -sphinx -recommonmark -sphinx_markdown_tables -sphinx_rtd_theme diff --git a/docs/structure.png b/docs/structure.png deleted file mode 100644 index f791ce2bd8a31c9eac729fcdedcba24df1e556d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59225 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 KRwnoK<^KjvVpcx@ diff --git a/flow-debugger/Cargo.lock b/flow-debugger/Cargo.lock deleted file mode 100644 index ffbd9c0..0000000 --- a/flow-debugger/Cargo.lock +++ /dev/null @@ -1,1015 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cpufeatures" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" -dependencies = [ - "libc", -] - -[[package]] -name = "debugger" -version = "0.1.0" -dependencies = [ - "tokio", - "warp", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" - -[[package]] -name = "futures-io" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" - -[[package]] -name = "futures-sink" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" - -[[package]] -name = "futures-task" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" - -[[package]] -name = "futures-util" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" -dependencies = [ - "autocfg", - "futures-core", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", -] - -[[package]] -name = "h2" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "headers" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" -dependencies = [ - "base64", - "bitflags", - "bytes", - "headers-core", - "http", - "mime", - "sha-1", - "time", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "http" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" - -[[package]] -name = "httpdate" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" - -[[package]] -name = "hyper" -version = "0.14.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", -] - -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" - -[[package]] -name = "log" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "mio" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "multipart" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050aeedc89243f5347c3e237e3e13dc76fbe4ae3742a57b94dc14f69acf76d4" -dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error", - "rand 0.7.3", - "safemem", - "tempfile", - "twoway", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - -[[package]] -name = "proc-macro2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags", -] - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "serde" -version = "1.0.129" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" - -[[package]] -name = "serde_json" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" -dependencies = [ - "block-buffer", - "cfg-if", - "cpufeatures", - "digest", - "opaque-debug", -] - -[[package]] -name = "slab" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" - -[[package]] -name = "socket2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "syn" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand 0.8.4", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "time" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "tinyvec" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "pin-project-lite", - "tokio-macros", - "winapi", -] - -[[package]] -name = "tokio-macros" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.4", - "sha-1", - "url", - "utf-8", -] - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "warp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/flow-debugger/Cargo.toml b/flow-debugger/Cargo.toml deleted file mode 100644 index 5116b03..0000000 --- a/flow-debugger/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "flow-debugger" -version = "0.1.0" -edition = "2018" -authors = ["megvii"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -tokio = { version="1.10.0", features=["macros", "rt-multi-thread"] } -warp = "0.3.1" diff --git a/flow-debugger/debugger-ui/.gitignore b/flow-debugger/debugger-ui/.gitignore deleted file mode 100644 index 4d29575..0000000 --- a/flow-debugger/debugger-ui/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/flow-debugger/debugger-ui/.prettierrc b/flow-debugger/debugger-ui/.prettierrc deleted file mode 100644 index 0a02bce..0000000 --- a/flow-debugger/debugger-ui/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "tabWidth": 4 -} diff --git a/flow-debugger/debugger-ui/package-lock.json b/flow-debugger/debugger-ui/package-lock.json deleted file mode 100644 index efbcac4..0000000 --- a/flow-debugger/debugger-ui/package-lock.json +++ /dev/null @@ -1,21437 +0,0 @@ -{ - "name": "debugger-ui", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" - }, - "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", - "requires": { - "@babel/types": "^7.15.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz", - "integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-map": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.14.5.tgz", - "integrity": "sha512-spfQRnoChdYWwyFetQDBSDBgH42VskaquRI52kbLei5MjV7s3NPq30/sh2S3YdT20Ku/ZpaNnTVgmDo20NWylg==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", - "requires": { - "@babel/types": "^7.15.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", - "requires": { - "@babel/types": "^7.14.8" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" - }, - "@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz", - "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz", - "integrity": "sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.2.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", - "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", - "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", - "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", - "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz", - "integrity": "sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz", - "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==", - "requires": { - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", - "requires": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", - "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", - "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.15.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", - "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", - "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.9" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz", - "integrity": "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", - "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", - "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz", - "integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.15.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz", - "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.9", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.9", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.0", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.0", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" - } - }, - "@babel/preset-typescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz", - "integrity": "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.1.0" - } - }, - "@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz", - "integrity": "sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==", - "requires": { - "core-js-pure": "^3.16.0", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - } - }, - "@codemirror/autocomplete": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.1.tgz", - "integrity": "sha512-xc7BqgTrul+kW9RpM1zB9hmmILF6GOgmz2B6UQkTv3bbH+sQ9LV0edvCJf/QUphep0mpsjLu/e2cAhkVdy6kZw==", - "requires": { - "@codemirror/language": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/tooltip": "^0.19.0", - "@codemirror/view": "^0.19.0", - "@lezer/common": "^0.15.0" - } - }, - "@codemirror/basic-setup": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.19.0.tgz", - "integrity": "sha512-Yhrf7fIz8+INHWOhpWeRwbs8fpc0KsydX9baD7TyYqniLVWyTi0Hwm52mr0f5O+k4YaJPeHAgT3x9gzDXZIvOw==", - "requires": { - "@codemirror/autocomplete": "^0.19.0", - "@codemirror/closebrackets": "^0.19.0", - "@codemirror/commands": "^0.19.0", - "@codemirror/comment": "^0.19.0", - "@codemirror/fold": "^0.19.0", - "@codemirror/gutter": "^0.19.0", - "@codemirror/highlight": "^0.19.0", - "@codemirror/history": "^0.19.0", - "@codemirror/language": "^0.19.0", - "@codemirror/lint": "^0.19.0", - "@codemirror/matchbrackets": "^0.19.0", - "@codemirror/rectangular-selection": "^0.19.0", - "@codemirror/search": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/closebrackets": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.0.tgz", - "integrity": "sha512-dFWX5OEVYWRNtGaifSbwIAlymnRRjxWMiMbffbAjF7p0zfGHDbdGkiT56q3Xud63h5/tQdSo5dK1iyNTzHz5vg==", - "requires": { - "@codemirror/language": "^0.19.0", - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/commands": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.1.tgz", - "integrity": "sha512-6c9MlBW3UI13rCEqZkhD4etzWpxQKqeYKVn7CygsQ3LRtVprhfQxRts/K4vOcefC/Qq0VeRzYQt6crUPsOpaVA==", - "requires": { - "@codemirror/language": "^0.19.0", - "@codemirror/matchbrackets": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0", - "@lezer/common": "^0.15.0" - } - }, - "@codemirror/comment": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.0.tgz", - "integrity": "sha512-3hqAd0548fxqOBm4khFMcXVIivX8p0bSlbAuZJ6PNoUn/0wXhxkxowPp0FmFzU2+y37Z+ZQF5cRB5EREWPRIiQ==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/fold": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/fold/-/fold-0.19.0.tgz", - "integrity": "sha512-cHbr2hqKe2pMls1Ia1a4IwXly87ljpmvPUKkul6H/Uv9kCwpQLOP3dGMPXbMGm/1hGjBF/0wnc+m2iba9iJBTQ==", - "requires": { - "@codemirror/gutter": "^0.19.0", - "@codemirror/language": "^0.19.0", - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/gutter": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.1.tgz", - "integrity": "sha512-lPZJt7m3s1EIaUzkqYIr0vARnhh4ZcgzaLFaSweDn2IFIFq10TOnYzsuXJrgD7KfeU0Epjgznyg3VC0utHX7uA==", - "requires": { - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/highlight": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.1.tgz", - "integrity": "sha512-79y2xrl8e0kyfdpH7fBRdQoUDSrb54iSP+bLyzN2IPjoNw2NoWfYsiBrkc/zeCdhJYAtRUzgBKHkLPpjF/FKRg==", - "requires": { - "@codemirror/language": "^0.19.0", - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0", - "@lezer/common": "^0.15.0", - "style-mod": "^4.0.0" - } - }, - "@codemirror/history": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/history/-/history-0.19.0.tgz", - "integrity": "sha512-E0H+lncH66IMDhaND9jgkjE7s0dhYfjCPmS+Ig2Yes9I8+UIEecIdObj8c8HPCFGctGg3fxXqRAw2mdHl2Wouw==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/language": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.19.2.tgz", - "integrity": "sha512-Zz/gVezTknHhH2HcaMsYauxz06+3+IFU0nhhZmdTMcGbDL/ryQI2R543k9Zc58wA31lGa6uN+JzpZynEcGBwMQ==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0", - "@lezer/common": "^0.15.0", - "@lezer/lr": "^0.15.0" - } - }, - "@codemirror/legacy-modes": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-0.19.0.tgz", - "integrity": "sha512-GSPdBNUeyF3nxJ2lztXGp2UoQjn+ggK5z+Kd4tflziecCG1+8mcdudDgFvxDuaTGWyM34S7Ldb4Xv7/XodZtBA==", - "requires": { - "@codemirror/stream-parser": "^0.19.0" - } - }, - "@codemirror/lint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.0.tgz", - "integrity": "sha512-XjCIVJi2cUNlppwz0eGu0F93uFKJq1t2fupBQlDMr3hLmIxIRWjhvy66+Pw/ziH98XA8meLEGQX29umBAvym4w==", - "requires": { - "@codemirror/panel": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/tooltip": "^0.19.0", - "@codemirror/view": "^0.19.0", - "crelt": "^1.0.5" - } - }, - "@codemirror/matchbrackets": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.1.tgz", - "integrity": "sha512-jBEW2Uu3hWcrrkwkauaikCAE7s5liCwbccFa6rLK6DzwaynOqCKJGyDsbkfrhikofNRc1yh4V3vwUuxt2u4QbA==", - "requires": { - "@codemirror/language": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0", - "@lezer/common": "^0.15.0" - } - }, - "@codemirror/panel": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.0.tgz", - "integrity": "sha512-LJuu49xnuhaAztlhnLJQ57ddOirSyf8/lnl7twsQUG/05RkxodBZ9F7q8r5AOLqOkaQOy9WySEKX1Ur8lD9Q5w==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/rangeset": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.0.tgz", - "integrity": "sha512-3J6Lpfyja3Sf8kMJyP05mDYK9c0N8YiHunvZbDhSq6R9/ViDYxsfaHfl/eCILRqswFMUsebCKA5iRhjXw4LeoA==", - "requires": { - "@codemirror/state": "^0.19.0" - } - }, - "@codemirror/rectangular-selection": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/rectangular-selection/-/rectangular-selection-0.19.0.tgz", - "integrity": "sha512-KdvoEweBgVsOcqdYFEinYGroS028pwUPkO3REzQC7Z/hT1KNqZUlyfoi6WBv3Gzp8b6l8NNA+rLnnYMSHlcGYA==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/search": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.0.tgz", - "integrity": "sha512-9yFHX3XENso1dzUPkHNZU96IMCs/cjDg3JTF6qiInaCOxo5cwuRn95NIem+jlpvx6fQsjstzSR55HIb5R5fb7A==", - "requires": { - "@codemirror/panel": "^0.19.0", - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@codemirror/view": "^0.19.0", - "crelt": "^1.0.5" - } - }, - "@codemirror/state": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.1.tgz", - "integrity": "sha512-5NR6/h+pVp7d77F4rLpNWcYvARCvqXa1uayoNx06d1aEm6wy/K+3lxTg7taB/qaEKd+oCsSHjRL8oSE1Fm+nsw==", - "requires": { - "@codemirror/text": "^0.19.0" - } - }, - "@codemirror/stream-parser": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/stream-parser/-/stream-parser-0.19.1.tgz", - "integrity": "sha512-ZoQR8oIDUaKyGm94lYSUAkfrFw7Cqr12MaIC6UAQter7GHYcN1A+Xa1z8rY0wd9Yv+w1yoDLY0XvpPMt2CEBzw==", - "requires": { - "@codemirror/highlight": "^0.19.0", - "@codemirror/language": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "@lezer/common": "^0.15.0", - "@lezer/lr": "^0.15.0" - } - }, - "@codemirror/text": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/text/-/text-0.19.0.tgz", - "integrity": "sha512-SxXmPitnMxbFriiJu3yYAq0V7I71SXVbOqFuoJ8BjXUml7DajgXIia9YeXTHovjlGSfisXTnYFyP6kVyRp7TMw==" - }, - "@codemirror/theme-one-dark": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-0.19.0.tgz", - "integrity": "sha512-Xlk68ARreanFveE+KvZJY4HxecNr+VKDOR61O8l3kzlQ0qvxNXA0KAp1xu4p32pA9jzJqJi5haIgdfWSZogXZg==", - "requires": { - "@codemirror/highlight": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/tooltip": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.0.tgz", - "integrity": "sha512-JMe5ubrH+5eqjrORfgVUwccoARg/dfjPzuW0vmbjmFWu/c7RQQIbptmRBl1aa7qzdauQA2N49YUW4w67IaMIGA==", - "requires": { - "@codemirror/state": "^0.19.0", - "@codemirror/view": "^0.19.0" - } - }, - "@codemirror/view": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.1.tgz", - "integrity": "sha512-CxSM5Q9hK89CSX6mpT1ZPDq3kjzE1Ynx02l12M/MVTLvExge/8Ly8L+NYbKHpsR/uRtNc4E9V+dep+JXYOJYqQ==", - "requires": { - "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.0", - "@codemirror/text": "^0.19.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" - }, - "@jest/types": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", - "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@lezer/common": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.3.tgz", - "integrity": "sha512-TLDp0BX/XAXhR2tleyWM7TjQ6LXVkkh2PcAHPu+fgi0xcT9JmI56Gh8zgMhoztDJAzH2ItMmufzVPVeBwz9VDw==" - }, - "@lezer/lr": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.1.tgz", - "integrity": "sha512-NnFhj1zyiyFqrZWFEBdxHoqtlFLTbXumMXLTO8oFSfR0jUaRSW+bQKwLqfNig1twyKEuSGpvkk2D27oEPFzFog==", - "requires": { - "@lezer/common": "^0.15.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@popperjs/core": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", - "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==" - }, - "@reach/observe-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", - "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" - }, - "@reduxjs/toolkit": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz", - "integrity": "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==", - "requires": { - "immer": "^9.0.1", - "redux": "^4.1.0", - "redux-thunk": "^2.3.0", - "reselect": "^4.0.0" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", - "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", - "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", - "requires": { - "@babel/core": "^7.1.6", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.1.6", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.1.0", - "@svgr/plugin-jsx": "^4.1.0", - "@svgr/plugin-svgo": "^4.0.3", - "loader-utils": "^1.1.0" - } - }, - "@testing-library/dom": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.1.0.tgz", - "integrity": "sha512-kmW9alndr19qd6DABzQ978zKQ+J65gU2Rzkl8hriIetPnwpesRaK4//jEQyYh8fEALmGhomD/LBQqt+o+DL95Q==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.6", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - } - }, - "@testing-library/jest-dom": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", - "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", - "requires": { - "@babel/runtime": "^7.5.1", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", - "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", - "requires": { - "@babel/runtime": "^7.8.4", - "@testing-library/dom": "^6.15.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@testing-library/dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", - "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", - "requires": { - "@babel/runtime": "^7.8.4", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.12.1", - "aria-query": "^4.0.2", - "dom-accessibility-api": "^0.3.0", - "pretty-format": "^25.1.0", - "wait-for-expect": "^3.0.2" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/testing-library__dom": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", - "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", - "requires": { - "pretty-format": "^24.3.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - } - } - }, - "@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "dom-accessibility-api": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", - "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "@testing-library/user-event": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", - "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" - }, - "@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" - }, - "@types/d3-array": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz", - "integrity": "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==" - }, - "@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" - }, - "@types/d3-scale": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz", - "integrity": "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==", - "requires": { - "@types/d3-time": "*" - } - }, - "@types/d3-shape": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.2.tgz", - "integrity": "sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw==", - "requires": { - "@types/d3-path": "*" - } - }, - "@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/node": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz", - "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" - }, - "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "@types/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==" - }, - "@types/react": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.18.tgz", - "integrity": "sha512-YTLgu7oS5zvSqq49X5Iue5oAbVGhgPc5Au29SJC4VeE17V6gASoOxVkUDy9pXFMRFxCWCD9fLeweNFizo3UzOg==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", - "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-redux": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz", - "integrity": "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/tapable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", - "integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==" - }, - "@types/testing-library__dom": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz", - "integrity": "sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g==", - "requires": { - "@testing-library/dom": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", - "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==" - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==" - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - } - } - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" - }, - "babel-eslint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz", - "integrity": "sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", - "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", - "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.2.0" - } - }, - "babel-loader": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", - "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-jest-hoist": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" - }, - "babel-plugin-macros": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz", - "integrity": "sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw==", - "requires": { - "cosmiconfig": "^5.0.5", - "resolve": "^1.8.1" - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", - "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" - } - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", - "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", - "requires": { - "babel-plugin-jest-hoist": "^23.2.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "babel-preset-react-app": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-7.0.2.tgz", - "integrity": "sha512-mwCk/u2wuiO8qQqblN5PlDa44taY0acq7hw6W+a70W522P7a9mIcdggL1fe5/LgAT7tqCq46q9wwhqaMoYKslQ==", - "requires": { - "@babel/core": "7.2.2", - "@babel/plugin-proposal-class-properties": "7.3.0", - "@babel/plugin-proposal-decorators": "7.3.0", - "@babel/plugin-proposal-object-rest-spread": "7.3.2", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-transform-classes": "7.2.2", - "@babel/plugin-transform-destructuring": "7.3.2", - "@babel/plugin-transform-flow-strip-types": "7.2.3", - "@babel/plugin-transform-react-constant-elements": "7.2.0", - "@babel/plugin-transform-react-display-name": "7.2.0", - "@babel/plugin-transform-runtime": "7.2.0", - "@babel/preset-env": "7.3.1", - "@babel/preset-react": "7.0.0", - "@babel/preset-typescript": "7.1.0", - "@babel/runtime": "7.3.1", - "babel-loader": "8.0.5", - "babel-plugin-dynamic-import-node": "2.2.0", - "babel-plugin-macros": "2.5.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.2", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.2.2", - "@babel/types": "^7.2.2", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.10", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", - "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz", - "integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", - "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz", - "integrity": "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", - "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/preset-env": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz", - "integrity": "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.2.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.2.0", - "@babel/plugin-transform-classes": "^7.2.0", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.2.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" - } - }, - "@babel/runtime": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", - "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", - "requires": { - "regenerator-runtime": "^0.12.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", - "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", - "requires": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "hoopy": "^0.1.2", - "tryer": "^1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", - "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", - "requires": { - "caniuse-lite": "^1.0.30001248", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.793", - "escalade": "^3.1.1", - "node-releases": "^1.1.73" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==" - }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "requires": { - "rsvp": "^3.3.3" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "check-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", - "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "requires": { - "source-map": "~0.6.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "core-js-compat": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz", - "integrity": "sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==", - "requires": { - "browserslist": "^4.16.7", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.1.tgz", - "integrity": "sha512-TyofCdMzx0KMhi84mVRS8rL1XsRk2SPUNz2azmth53iRN0/08Uim9fdhQTaZTG1LqaXHYVci4RDHka6WrXfnvg==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "crelt": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", - "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", - "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - } - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "requires": { - "internmap": "^1.0.0" - } - }, - "d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" - }, - "d3-delaunay": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", - "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", - "requires": { - "delaunator": "4" - } - }, - "d3-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", - "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" - }, - "d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", - "requires": { - "d3-color": "1 - 2" - } - }, - "d3-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", - "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" - }, - "d3-scale": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", - "requires": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" - } - }, - "d3-shape": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", - "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", - "requires": { - "d3-path": "1 - 2" - } - }, - "d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", - "requires": { - "d3-array": "2" - } - }, - "d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", - "requires": { - "d3-time": "1 - 2" - } - }, - "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", - "requires": { - "execa": "^0.10.0", - "ip-regex": "^2.1.0" - } - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "requires": { - "strip-bom": "^2.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz", - "integrity": "sha512-ml3lJIq9YjUfM9TUnEPvEYWFSwivwIGBPKpewX7tii7fwCazA8yCioGdqQcNsItPpfFvSJ3VIdMQPj60LJhcQA==" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - } - }, - "dotenv": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz", - "integrity": "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==" - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.806", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz", - "integrity": "sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA==" - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", - "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "eslint": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz", - "integrity": "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.8.tgz", - "integrity": "sha512-Ovi6Bva67OjXrom9Y/SLJRkrGqKhMAL0XCH8BizPhjEVEhYczl2ZKiNZI2CuqO5/CJwAfMwRXAVGY0KToWr1aA==", - "requires": { - "confusing-browser-globals": "^1.0.6" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.1.tgz", - "integrity": "sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ==", - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", - "requires": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "2.50.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", - "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", - "requires": { - "lodash": "^4.17.10" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz", - "integrity": "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==", - "requires": { - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.1", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^6.5.1", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1" - }, - "dependencies": { - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - } - } - }, - "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "object.fromentries": "^2.0.0", - "prop-types": "^15.6.2", - "resolve": "^1.9.0" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "requires": { - "merge": "^1.2.0" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - } - }, - "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "requires": { - "bser": "2.1.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.0.0-alpha.6.tgz", - "integrity": "sha512-s/V+58nLrUjuXyzYk8AL11XG8bxIirTbafDLMn26sL59HQx8QvvsRTqOkhq4MV0coIkog1jZuH/E9Abm8zFZ2g==", - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^2.0.4", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "html-webpack-plugin": { - "version": "4.0.0-alpha.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-alpha.2.tgz", - "integrity": "sha512-tyvhjVpuGqD7QYHi1l1drMQTg5i+qRxpQEGbdnYFREgOKy7aFDf/ocQ/V1fuEDlQx7jV2zMap3Hj2nE9i5eGXw==", - "requires": { - "@types/tapable": "1.0.2", - "html-minifier": "^3.2.3", - "loader-utils": "^1.1.0", - "lodash": "^4.17.10", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "immer": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.5.tgz", - "integrity": "sha512-2WuIehr2y4lmYz9gaQzetPR2ECniCifk4ORaQbU3g5EalLt+0IVTosEPJ5BoYl/75ky2mivzdRzV8wWgQGOSYQ==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", - "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", - "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", - "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "requires": { - "handlebars": "^4.0.3" - } - }, - "jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", - "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", - "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.6.0" - } - }, - "jest-changed-files": { - "version": "23.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", - "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", - "requires": { - "throat": "^4.0.0" - } - }, - "jest-cli": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", - "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.4.2", - "jest-config": "^23.6.0", - "jest-environment-jsdom": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve-dependencies": "^23.6.0", - "jest-runner": "^23.6.0", - "jest-runtime": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "jest-watcher": "^23.4.0", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "prompts": "^0.1.9", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-config": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", - "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.6.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^23.4.0", - "jest-environment-node": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.6.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", - "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", - "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", - "requires": { - "chalk": "^2.0.1", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", - "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", - "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", - "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", - "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", - "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", - "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "invariant": "^2.2.4", - "jest-docblock": "^23.2.0", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0" - } - }, - "jest-jasmine2": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", - "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", - "requires": { - "babel-traverse": "^6.0.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^23.6.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.6.0", - "jest-each": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", - "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", - "requires": { - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", - "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" - }, - "jest-pnp-resolver": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.0.2.tgz", - "integrity": "sha512-H2DvUlwdMedNGv4FOliPDnxani6ATWy70xe2eckGJgkLoMaWzRPqpSlc5ShqX0Ltk5OhRQvPQY2LLZPOpgcc7g==" - }, - "jest-regex-util": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=" - }, - "jest-resolve": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", - "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", - "requires": { - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "realpath-native": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", - "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", - "requires": { - "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.6.0" - } - }, - "jest-runner": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", - "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", - "requires": { - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.6.0", - "jest-jasmine2": "^23.6.0", - "jest-leak-detector": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-runtime": "^23.6.0", - "jest-util": "^23.4.0", - "jest-worker": "^23.2.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", - "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", - "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=" - }, - "jest-snapshot": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", - "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", - "requires": { - "babel-types": "^6.0.0", - "chalk": "^2.0.1", - "jest-diff": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-resolve": "^23.6.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^23.6.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", - "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.4.0", - "mkdirp": "^0.5.1", - "slash": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.2.1.tgz", - "integrity": "sha512-xdhEtKSj0gmnkDQbPTIHvcMmXNUDzYpHLEJ5TFqlaI+schi2NI96xhWiZk9QoesAS7oBmKwWWsHazTrYl2ORgg==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.4.1", - "jest-watcher": "^23.1.0", - "slash": "^2.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", - "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "string-length": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", - "requires": { - "merge-stream": "^1.0.1" - } - }, - "joi": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-11.4.0.tgz", - "integrity": "sha512-O7Uw+w/zEWgbL6OcHbyACKSj0PkQeUgmehdoXVSxt92QFCq4+1390Rwh5moI2K/OgC7D8RHRZqHZxT2husMJHA==", - "requires": { - "hoek": "4.x.x", - "isemail": "3.x.x", - "topo": "2.x.x" - } - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", - "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" - }, - "merge-deep": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", - "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", - "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "needle": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", - "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==", - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "node-releases": { - "version": "1.1.74", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", - "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", - "requires": { - "cssnano": "^4.1.0", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", - "requires": { - "ts-pnp": "^1.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.5.0.tgz", - "integrity": "sha512-RdsIrYJd9p9AouQoJ8dFP5ksBJEIegA4q4WzJDih8nevz3cZyIP/q1Eaw3pTVpUAu3n7Y32YmvAW3X07mSRGkw==", - "requires": { - "autoprefixer": "^9.4.2", - "browserslist": "^4.3.5", - "caniuse-lite": "^1.0.30000918", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.3.0", - "postcss": "^7.0.6", - "postcss-attribute-case-insensitive": "^4.0.0", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.2", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.7", - "postcss-custom-properties": "^8.0.9", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" - }, - "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "pretty-format": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", - "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", - "requires": { - "@jest/types": "^27.0.6", - "ansi-regex": "^5.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", - "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", - "requires": { - "asap": "~2.0.6" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "prompts": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", - "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", - "requires": { - "kleur": "^2.0.1", - "sisteransi": "^0.1.1" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-app-polyfill": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz", - "integrity": "sha512-mAYn96B/nB6kWG87Ry70F4D4rsycU43VYTj3ZCbKP+SLJXwC0x6YCbwcICh3uW8/C9s1VgP197yx+w7SCWeDdQ==", - "requires": { - "core-js": "2.6.4", - "object-assign": "4.1.1", - "promise": "8.0.2", - "raf": "3.4.1", - "whatwg-fetch": "3.0.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", - "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" - } - } - }, - "react-charts": { - "version": "3.0.0-beta.32", - "resolved": "https://registry.npmjs.org/react-charts/-/react-charts-3.0.0-beta.32.tgz", - "integrity": "sha512-Qi400sol2X+NPHWH022TZa6T+GgjqOr1B2ilcAx6bzOX88UQzpuogBH+fmXNh4gGua+Xa15Y9TURV0r33fX3Gg==", - "requires": { - "@babel/runtime": "^7.14.6", - "@reach/observe-rect": "^1.2.0", - "@types/d3-array": "^3.0.1", - "@types/d3-scale": "^4.0.1", - "@types/d3-shape": "^3.0.1", - "@types/raf": "^3.4.0", - "@types/react": "^17.0.14", - "@types/react-dom": "^17.0.9", - "d3-array": "^2.12.1", - "d3-delaunay": "5.3.0", - "d3-scale": "^3.3.0", - "d3-shape": "^2.1.0", - "d3-time": "^2.1.1", - "ts-toolbelt": "^9.6.0" - } - }, - "react-dev-utils": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-8.0.0.tgz", - "integrity": "sha512-TK8cj7eghvxfe7bfBluLGpI/upo4EXC+G74hYmPucAG8C2XcbT+vKnlWPwLnABb75Zk+mR6D556Da+yvDjljrw==", - "requires": { - "@babel/code-frame": "7.0.0", - "address": "1.0.3", - "browserslist": "4.4.1", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.6.1", - "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "1.0.0-alpha.6", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.0.0", - "immer": "1.10.0", - "inquirer": "6.2.1", - "is-root": "2.0.0", - "loader-utils": "1.2.3", - "opn": "5.4.0", - "pkg-up": "2.0.0", - "react-error-overlay": "^5.1.4", - "recursive-readdir": "2.2.2", - "shell-quote": "1.6.1", - "sockjs-client": "1.3.0", - "strip-ansi": "5.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", - "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", - "requires": { - "caniuse-lite": "^1.0.30000929", - "electron-to-chromium": "^1.3.103", - "node-releases": "^1.1.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - }, - "inquirer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", - "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.0", - "figures": "^2.0.0", - "lodash": "^4.17.10", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.1.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "requires": { - "ansi-regex": "^4.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-error-overlay": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", - "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" - }, - "react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "react-popper": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", - "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - } - }, - "react-redux": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", - "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", - "requires": { - "@babel/runtime": "^7.12.1", - "@types/react-redux": "^7.1.16", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "react-scripts": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-2.1.8.tgz", - "integrity": "sha512-mDC8fYWCyuB9VROti8OCPdHE79UEchVVZmuS/yaIs47VkvZpgZqUvzghYBswZRchqnW0aARNY8xXrzoFRhhK7A==", - "requires": { - "@babel/core": "7.2.2", - "@svgr/webpack": "4.1.0", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "9.0.0", - "babel-jest": "23.6.0", - "babel-loader": "8.0.5", - "babel-plugin-named-asset-import": "^0.3.1", - "babel-preset-react-app": "^7.0.2", - "bfj": "6.1.1", - "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "1.0.0", - "dotenv": "6.0.0", - "dotenv-expand": "4.2.0", - "eslint": "5.12.0", - "eslint-config-react-app": "^3.0.8", - "eslint-loader": "2.1.1", - "eslint-plugin-flowtype": "2.50.1", - "eslint-plugin-import": "2.14.0", - "eslint-plugin-jsx-a11y": "6.1.2", - "eslint-plugin-react": "7.12.4", - "file-loader": "2.0.0", - "fs-extra": "7.0.1", - "fsevents": "1.2.4", - "html-webpack-plugin": "4.0.0-alpha.2", - "identity-obj-proxy": "3.0.0", - "jest": "23.6.0", - "jest-pnp-resolver": "1.0.2", - "jest-resolve": "23.6.0", - "jest-watch-typeahead": "^0.2.1", - "mini-css-extract-plugin": "0.5.0", - "optimize-css-assets-webpack-plugin": "5.0.1", - "pnp-webpack-plugin": "1.2.1", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-preset-env": "6.5.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^0.2.2", - "react-dev-utils": "^8.0.0", - "resolve": "1.10.0", - "sass-loader": "7.1.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "1.2.2", - "url-loader": "1.1.2", - "webpack": "4.28.3", - "webpack-dev-server": "3.1.14", - "webpack-manifest-plugin": "2.0.4", - "workbox-webpack-plugin": "3.6.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.2", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.2.2", - "@babel/types": "^7.2.2", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.10", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "react-wait": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/react-wait/-/react-wait-0.3.0.tgz", - "integrity": "sha512-kB5x/kMKWcn0uVr9gBdNz21/oGbQwEQnF3P9p6E9yLfJ9DRcKS0fagbgYMFI0YFOoyKDj+2q6Rwax0kTYJF37g==" - }, - "reactjs-popup": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-2.0.5.tgz", - "integrity": "sha512-b5hv9a6aGsHEHXFAgPO5s1Jw1eSkopueyUVxQewGdLgqk2eW0IVXZrPRpHR629YcgIpC2oxtX8OOZ8a7bQJbxA==" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redux": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", - "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rodemirror": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/rodemirror/-/rodemirror-1.6.3.tgz", - "integrity": "sha512-tqBL17eNOKlJhehNQ7uRNAB/Np9Wpc0EvvKjzBqG7oNSx1pU4+5IIPIHyPFGo3mzPAXgQXNgN9Co07V+eGTFeQ==" - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", - "requires": { - "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", - "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - } - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "sisteransi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", - "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-grid": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/split-grid/-/split-grid-1.0.11.tgz", - "integrity": "sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } - }, - "style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "tar": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.17.tgz", - "integrity": "sha512-q7OwXq6NTdcYIa+k58nEMV3j1euhDhGCs/VRw9ymx/PbH0jtIM2+VTgDE/BW3rbLkrBUXs5fzEKgic5oUciu7g==", - "optional": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "optional": true - } - } - }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", - "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - } - }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "topo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", - "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", - "requires": { - "hoek": "4.x.x" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" - }, - "ts-toolbelt": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - } - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vis-data": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.2.tgz", - "integrity": "sha512-RPSegFxEcnp3HUEJSzhS2vBdbJ2PSsrYYuhRlpHp2frO/MfRtTYbIkkLZmPkA/Sg3pPfBlR235gcoKbtdm4mbw==" - }, - "vis-network": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.0.5.tgz", - "integrity": "sha512-+pun7tQP5UruDo+4GZemeZXoD9fIEApWp5IMwHZ8J29kAGvLN5CPJsqAwaSlty6vEVfmIElfOMZk5bilSRQU5Q==" - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-keyname": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", - "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" - }, - "wait-for-expect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", - "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.3.tgz", - "integrity": "sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", - "requires": { - "memory-fs": "~0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", - "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", - "import-local": "^2.0.0", - "internal-ip": "^3.0.1", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "semver": "^5.6.0", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "3.4.0", - "webpack-log": "^2.0.0", - "yargs": "12.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "requires": { - "xregexp": "4.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "webpack-manifest-plugin": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz", - "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==", - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "tapable": "^1.0.0" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz", - "integrity": "sha512-ypLo0B6dces4gSpaslmDg5wuoUWrHHVJfFWwl1udvSylLdXvnrfhFfriCS42SNEe5lsZtcNZF27W/SMzBlva7Q==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-broadcast-cache-update": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz", - "integrity": "sha512-pJl4lbClQcvp0SyTiEw0zLSsVYE1RDlCPtpKnpMjxFtu8lCFTAEuVyzxp9w7GF4/b3P4h5nyQ+q7V9mIR7YzGg==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-build": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.6.3.tgz", - "integrity": "sha512-w0clZ/pVjL8VXy6GfthefxpEXs0T8uiRuopZSFVQ8ovfbH6c6kUpEh6DcYwm/Y6dyWPiCucdyAZotgjz+nRz8g==", - "requires": { - "babel-runtime": "^6.26.0", - "common-tags": "^1.4.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.2", - "joi": "^11.1.1", - "lodash.template": "^4.4.0", - "pretty-bytes": "^4.0.2", - "stringify-object": "^3.2.2", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^3.6.3", - "workbox-broadcast-cache-update": "^3.6.3", - "workbox-cache-expiration": "^3.6.3", - "workbox-cacheable-response": "^3.6.3", - "workbox-core": "^3.6.3", - "workbox-google-analytics": "^3.6.3", - "workbox-navigation-preload": "^3.6.3", - "workbox-precaching": "^3.6.3", - "workbox-range-requests": "^3.6.3", - "workbox-routing": "^3.6.3", - "workbox-strategies": "^3.6.3", - "workbox-streams": "^3.6.3", - "workbox-sw": "^3.6.3" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cache-expiration": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz", - "integrity": "sha512-+ECNph/6doYx89oopO/UolYdDmQtGUgo8KCgluwBF/RieyA1ZOFKfrSiNjztxOrGJoyBB7raTIOlEEwZ1LaHoA==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-cacheable-response": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz", - "integrity": "sha512-QpmbGA9SLcA7fklBLm06C4zFg577Dt8u3QgLM0eMnnbaVv3rhm4vbmDpBkyTqvgK/Ly8MBDQzlXDtUCswQwqqg==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-3.6.3.tgz", - "integrity": "sha512-cx9cx0nscPkIWs8Pt98HGrS9/aORuUcSkWjG25GqNWdvD/pSe7/5Oh3BKs0fC+rUshCiyLbxW54q0hA+GqZeSQ==" - }, - "workbox-google-analytics": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz", - "integrity": "sha512-RQBUo/6SXtIaQTRFj4RQZ9e1gAl7D8oS5S+Hi173Kk70/BgJjzPwXpC5A249Jv5YfkCOLMQCeF9A27BiD0b0ig==", - "requires": { - "workbox-background-sync": "^3.6.3", - "workbox-core": "^3.6.3", - "workbox-routing": "^3.6.3", - "workbox-strategies": "^3.6.3" - } - }, - "workbox-navigation-preload": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz", - "integrity": "sha512-dd26xTX16DUu0i+MhqZK/jQXgfIitu0yATM4jhRXEmpMqQ4MxEeNvl2CgjDMOHBnCVMax+CFZQWwxMx/X/PqCw==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-precaching": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-3.6.3.tgz", - "integrity": "sha512-aBqT66BuMFviPTW6IpccZZHzpA8xzvZU2OM1AdhmSlYDXOJyb1+Z6blVD7z2Q8VNtV1UVwQIdImIX+hH3C3PIw==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-range-requests": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz", - "integrity": "sha512-R+yLWQy7D9aRF9yJ3QzwYnGFnGDhMUij4jVBUVtkl67oaVoP1ymZ81AfCmfZro2kpPRI+vmNMfxxW531cqdx8A==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-routing": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-3.6.3.tgz", - "integrity": "sha512-bX20i95OKXXQovXhFOViOK63HYmXvsIwZXKWbSpVeKToxMrp0G/6LZXnhg82ijj/S5yhKNRf9LeGDzaqxzAwMQ==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-strategies": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-3.6.3.tgz", - "integrity": "sha512-Pg5eulqeKet2y8j73Yw6xTgLdElktcWExGkzDVCGqfV9JCvnGuEpz5eVsCIK70+k4oJcBCin9qEg3g3CwEIH3g==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-streams": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-3.6.3.tgz", - "integrity": "sha512-rqDuS4duj+3aZUYI1LsrD2t9hHOjwPqnUIfrXSOxSVjVn83W2MisDF2Bj+dFUZv4GalL9xqErcFW++9gH+Z27w==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-sw": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-3.6.3.tgz", - "integrity": "sha512-IQOUi+RLhvYCiv80RP23KBW/NTtIvzvjex28B8NW1jOm+iV4VIu3VXKXTA6er5/wjjuhmtB28qEAUqADLAyOSg==" - }, - "workbox-webpack-plugin": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-3.6.3.tgz", - "integrity": "sha512-RwmKjc7HFHUFHoOlKoZUq9349u0QN3F8W5tZZU0vc1qsBZDINWXRiIBCAKvo/Njgay5sWz7z4I2adnyTo97qIQ==", - "requires": { - "babel-runtime": "^6.26.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^3.6.3" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - } - } -} diff --git a/flow-debugger/debugger-ui/package.json b/flow-debugger/debugger-ui/package.json deleted file mode 100644 index 78f4233..0000000 --- a/flow-debugger/debugger-ui/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "debugger-ui", - "version": "0.1.0", - "private": true, - "dependencies": { - "@codemirror/basic-setup": "^0.19.0", - "@codemirror/legacy-modes": "^0.19.0", - "@codemirror/state": "^0.19.1", - "@codemirror/stream-parser": "^0.19.1", - "@codemirror/theme-one-dark": "^0.19.0", - "@codemirror/view": "^0.19.1", - "@popperjs/core": "^2.9.3", - "@reduxjs/toolkit": "^1.5.1", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "lodash": "^4.17.21", - "react": "^17.0.2", - "react-charts": "^3.0.0-beta.32", - "react-dom": "^17.0.2", - "react-popper": "^2.2.5", - "react-redux": "^7.2.3", - "react-scripts": "^2.0.0", - "react-wait": "^0.3.0", - "reactjs-popup": "^2.0.5", - "rodemirror": "^1.6.3", - "split-grid": "^1.0.11", - "toml": "^3.0.0", - "vis-data": "^7.1.2", - "vis-network": "^9.0.5" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "fix": "npx prettier --write ./src" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/flow-debugger/debugger-ui/public/index.html b/flow-debugger/debugger-ui/public/index.html deleted file mode 100644 index 27d3726..0000000 --- a/flow-debugger/debugger-ui/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - Debugger UI - - - -

- - diff --git a/flow-debugger/debugger-ui/public/robots.txt b/flow-debugger/debugger-ui/public/robots.txt deleted file mode 100644 index 01b0f9a..0000000 --- a/flow-debugger/debugger-ui/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * diff --git a/flow-debugger/debugger-ui/src/App.css b/flow-debugger/debugger-ui/src/App.css deleted file mode 100644 index 4e3494c..0000000 --- a/flow-debugger/debugger-ui/src/App.css +++ /dev/null @@ -1,39 +0,0 @@ -.App { - display: flex; - height: 100vh; - flex-direction: column; - padding-bottom: 1em; - align-items: center; - justify-content: center; -} - -.Area { - width: 100%; - min-width: 0; - height: 100%; - min-height: 0; -} - -.BorderArea { - display: flex; - flex-direction: column; - width: 100%; - min-width: 0; - height: 100%; - min-height: 0; - border: 4px solid #dedede; - border-radius: 4px; -} - -.tabClose { - border: 1px solid #dedede; - border-right: none; - background-color: #d4dfe6; - cursor: pointer; - line-height: 1.5em; -} - -.body { - flex-grow: 1; - overflow-y: auto; -} diff --git a/flow-debugger/debugger-ui/src/App.js b/flow-debugger/debugger-ui/src/App.js deleted file mode 100644 index 32a413e..0000000 --- a/flow-debugger/debugger-ui/src/App.js +++ /dev/null @@ -1,75 +0,0 @@ -import React from "react"; -import { useSelector, useDispatch } from "react-redux"; -import "./App.css"; -import { ResizableArea } from "./component/resizable_area/ResizableArea"; -import { TabList } from "./component/tab/Tab"; -import { MainSwitcher, DebuggerSwitcher } from "./page"; -import { changeMainPage, storeDebuggerPage, restoreDebuggerPage } from "./app"; -import { AppHeader } from "./AppHeader"; -import { save } from "./page/editor/EditorSlice"; -import { MainTabs, EDITOR, TOPOLOGY } from "./types"; - -function App() { - const dispatch = useDispatch(); - const main = useSelector((state) => state.main); - const dbg = useSelector((state) => state.dbg); - - return ( -
- - = 0}> -
- dispatch(changeMainPage(EDITOR)), - }, - { - label: MainTabs[TOPOLOGY], - onClick: () => - dispatch(changeMainPage(TOPOLOGY)) & - dispatch(save()), - }, - ]} - /> -
- -
-
-
= 0 ? "BorderArea" : "Area"}> - - dispatch(restoreDebuggerPage(-1)), - }, - ]} - children={ - dbg.focus >= 0 && ( - - ) - } - /> - {dbg.focus >= 0 && ( -
- -
- )} -
-
-
- ); -} - -export default App; diff --git a/flow-debugger/debugger-ui/src/AppHeader.js b/flow-debugger/debugger-ui/src/AppHeader.js deleted file mode 100644 index a0d6904..0000000 --- a/flow-debugger/debugger-ui/src/AppHeader.js +++ /dev/null @@ -1,217 +0,0 @@ -import React, { useState } from "react"; -import { useSelector, useDispatch } from "react-redux"; -import styles from "./AppHeader.module.css"; -import { Button } from "./component/button/Button"; -import { Input } from "./component/input/Input"; -import toml from "toml"; -import { save, selectEditorChanged } from "./page/editor/EditorSlice"; -import { update as update_err } from "./page/text/TextSlice"; -import { parse, splitQpsNode } from "./parser"; -import { update, setBlock, listen } from "./page/topology/TopologySlice"; -import { changeMainPage, restoreDebuggerPage, storeDebuggerPage, changeStage } from "./app/actor"; -import { TOPOLOGY, ERROR } from "./types"; -import Popup from "reactjs-popup"; -import { useWait } from "react-wait"; -import "reactjs-popup/dist/index.css"; -import { useWebsocket } from "./websocket"; -import buildEventListener from "./event_listener"; -import { append } from "./page/chart/ChartSlice"; - -const Spinner = () => { - return ( - - ); -}; - -const SwitchButton = (is_on, off, on, onClick, disabled) => { - return is_on ? ( - - ) : ( - - ); -}; - -export const AppHeader = () => { - const dispatch = useDispatch(); - const [form, openForm] = useState(false); - const [perf, setPerf] = useState(false); - const [url, setUrl] = useState(""); - const [qpsSeqId, setQpsSeqId] = useState(-1); - const stage = useSelector((state) => state.stage); - const content = useSelector(selectEditorChanged); - const { startWaiting, endWaiting, isWaiting, Wait } = useWait(); - const [parsed, onEvent] = buildEventListener(dispatch, (event) => { - switch (event) { - case "disconnect": - dispatch(changeStage("")); - setPerf(false); - break - case "connect": - openForm(false); - dispatch(changeStage("dbg-main")); - break - default: - break - } - endWaiting(event); - }); - const { send, connect, disconnect } = useWebsocket(onEvent); - - switch (stage) { - case "dbg-main": - return ( -
-
- -
-
- {SwitchButton( - perf, - "Stop", - "Perf", - () => { - if (!perf) { - setQpsSeqId(send(qpsSeqId, { - feature: 'QPS', - command: 'start', - ratio: 1.0, - }, (resp) => { - let is_block = []; - for (const node of resp.nodes) { - let split = splitQpsNode(parsed, resp.graph, node); - if (!split) { - return; - } - if (split.is_block) { - if (split.id) - is_block.push(split.id); - else - for (const id of split.ids) - is_block.push(id) - } - for (const port of split.ports) { - dispatch(append(port)); - } - } - dispatch(setBlock(is_block)); - })) - dispatch(listen(true)); - } else { - send(qpsSeqId, { - feature: 'QPS', - command: 'stop', - }); - setQpsSeqId(-1); - dispatch(listen(false)); - dispatch(restoreDebuggerPage('')); - dispatch(storeDebuggerPage()); - } - setPerf(!perf); - }, - isWaiting("disconnect") - )} -
-
- ); - default: - return ( -
-
-
-
-
- -
- setUrl(`ws://${e.target.value}/debugger`)} - /> -
- -
-
-
-
- ); - } -}; diff --git a/flow-debugger/debugger-ui/src/AppHeader.module.css b/flow-debugger/debugger-ui/src/AppHeader.module.css deleted file mode 100644 index 87dc94f..0000000 --- a/flow-debugger/debugger-ui/src/AppHeader.module.css +++ /dev/null @@ -1,35 +0,0 @@ -.AppHeader { - display: flex; - justify-content: flex-start; - padding: 1.25em 0; - font-size: 12px; - width: 100%; -} - -.AppHeader button:enabled { - cursor: pointer; -} - -.ButtonSet { - margin-right: 0.5em; -} - -AppHeaderSet:last-child { - margin-right: 0; -} - -.PopupContent { - display: flex; - flex-flow: column; - justify-content: center; - align-items: center; - padding: 1.25em 0; - font-size: 8px; - width: auto; -} - -.spinner { - display: block; - height: 1em; - width: 1em; -} diff --git a/flow-debugger/debugger-ui/src/app/actor.js b/flow-debugger/debugger-ui/src/app/actor.js deleted file mode 100644 index e98af4b..0000000 --- a/flow-debugger/debugger-ui/src/app/actor.js +++ /dev/null @@ -1,50 +0,0 @@ -import { createAction } from "@reduxjs/toolkit"; - -export const BrowserWidthChanged = "BROWSER_WIDTH_CHANGED"; -export const browserWidthChanged = createAction( - BrowserWidthChanged, - (isSmall) => { - return { - payload: { - isSmall, - }, - }; - } -); - -export const StoreDebuggerPage = "STORE_DEBUGGER_PAGE"; -export const storeDebuggerPage = createAction(StoreDebuggerPage, () => { - return { - payload: {}, - }; -}); - -export const RestoreDebuggerPage = "RESTORE_DEBUGGER_PAGE"; -export const restoreDebuggerPage = createAction( - RestoreDebuggerPage, - (focus) => { - return { - payload: { - focus, - }, - }; - } -); - -export const ChangeMainPage = "CHANGE_MAIN_PAGE"; -export const changeMainPage = createAction(ChangeMainPage, (focus) => { - return { - payload: { - focus, - }, - }; -}); - -export const ChangeStage = "CHANGE_STAGE"; -export const changeStage = createAction(ChangeStage, (stage) => { - return { - payload: { - stage, - }, - }; -}); diff --git a/flow-debugger/debugger-ui/src/app/index.js b/flow-debugger/debugger-ui/src/app/index.js deleted file mode 100644 index 4e430f0..0000000 --- a/flow-debugger/debugger-ui/src/app/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import { store } from "./store"; -import { browserWidthChanged } from "./actor"; - -const z = (evt) => store.dispatch(browserWidthChanged(evt.matches)); -const maxWidthMediaQuery = window.matchMedia("(max-width: 1600px)"); -z(maxWidthMediaQuery); -maxWidthMediaQuery.addListener(z); - -export * from "./actor"; -export * from "./store"; diff --git a/flow-debugger/debugger-ui/src/app/store.js b/flow-debugger/debugger-ui/src/app/store.js deleted file mode 100644 index 5039f30..0000000 --- a/flow-debugger/debugger-ui/src/app/store.js +++ /dev/null @@ -1,59 +0,0 @@ -import { configureStore } from "@reduxjs/toolkit"; -import * as actor from "./actor"; -import editor from "../page/editor/EditorSlice"; -import topology from "../page/topology/TopologySlice"; -import text from "../page/text/TextSlice"; -import chart from "../page/chart/ChartSlice"; -import { MainTabs, DebuggerTabs } from "../types"; - -export const store = configureStore({ - reducer: { - editor, - topology, - text, - chart, - isSmall: (state = false, action) => { - switch (action.type) { - case actor.BrowserWidthChanged: - return action.payload.isSmall; - default: - return state; - } - }, - main: (state = { focus: 0, page: "" }, action) => { - switch (action.type) { - case actor.ChangeMainPage: - return { - focus: action.payload.focus, - page: MainTabs[action.payload.focus], - }; - default: - return state; - } - }, - dbg: (state = { focus: -1, page: "" }, action) => { - switch (action.type) { - case actor.StoreDebuggerPage: - return { focus: -1, page: state.page }; - case actor.RestoreDebuggerPage: - return { - focus: 0, - page: - action.payload.focus >= 0 - ? DebuggerTabs[action.payload.focus] - : state.page, - }; - default: - return state; - } - }, - stage: (state = "", action) => { - switch (action.type) { - case actor.ChangeStage: - return action.payload.stage; - default: - return state; - } - }, - }, -}); diff --git a/flow-debugger/debugger-ui/src/component/button/Button.js b/flow-debugger/debugger-ui/src/component/button/Button.js deleted file mode 100644 index 96547e9..0000000 --- a/flow-debugger/debugger-ui/src/component/button/Button.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react"; -import styles from "./Button.module.css"; - -export const Button = ({ red, bold, icon, rightIcon, children, ...props }) => { - const c = [styles.container]; - - if (bold) { - c.push(styles.bold); - } - if (icon) { - c.push(styles.hasLeftIcon); - } - if (rightIcon) { - c.push(styles.hasRightIcon); - } - if (red) { - c.push(styles.red); - } - - return ( - - ); -}; diff --git a/flow-debugger/debugger-ui/src/component/button/Button.module.css b/flow-debugger/debugger-ui/src/component/button/Button.module.css deleted file mode 100644 index 8052a6d..0000000 --- a/flow-debugger/debugger-ui/src/component/button/Button.module.css +++ /dev/null @@ -1,105 +0,0 @@ -.container { - display: flex; - height: 3em; - align-items: center; - padding: 0 1.25em; - font-weight: 500; - text-decoration: none; - text-transform: uppercase; - white-space: nowrap; -} - -.button { - padding: 0; - border: none; - font: inherit; - line-height: inherit; - text-align: inherit; - border: 1px solid #dedede; - background: linear-gradient(#fff, #f9f9f9); - background-color: #fff; - color: #444; -} -.button:first-child { - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.button:last-child { - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; -} - -.button:not(:first-child) { - border-left: none; -} - -.button:not(:last-child) { - border-right: 1px solid #dedede; -} - -.button:hover { - background: linear-gradient(#fff, #f3f3f3); - color: #333; -} - -.button:active { - border-top-color: #bababa; - border-bottom-color: #d6d6d6; - background: linear-gradient(#f9f9f9, #ededed); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); -} - -.bold { - font-weight: 700; -} - -.hasLeftIcon { - composes: container; - padding-left: 1em; -} - -.hasRightIcon { - composes: container; - padding-right: 1em; -} - -.leftIcon { - margin-right: 0.5em; -} - -.rightIcon { - margin-left: 0.75em; -} - -.red { - border: 1px solid #aa4422; - border-color: hsl(15, 66.7%, 32%); - background: #aa4422; - color: white; -} - -.red:first-child { - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.red:last-child { - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; -} - -.red:not(:last-child) { - border-right-width: 0; -} - -.red:hover { - background: #80331a; - color: white; -} - -.red:active { - border-top-color: #80331a; - border-bottom-color: #80331a; - background: #80331a; -} diff --git a/flow-debugger/debugger-ui/src/component/input/Input.js b/flow-debugger/debugger-ui/src/component/input/Input.js deleted file mode 100644 index 7d1fe90..0000000 --- a/flow-debugger/debugger-ui/src/component/input/Input.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import styles from "./Input.module.css"; - -export const Input = ({ label, ...props }) => { - return ( -
- - -
- ); -}; diff --git a/flow-debugger/debugger-ui/src/component/input/Input.module.css b/flow-debugger/debugger-ui/src/component/input/Input.module.css deleted file mode 100644 index 9ae2f5e..0000000 --- a/flow-debugger/debugger-ui/src/component/input/Input.module.css +++ /dev/null @@ -1,10 +0,0 @@ -.inner { - display: table-cell; - margin: 10px; - font-weight: bold; -} - -.container { - margin: 5px; - display: table-row; -} diff --git a/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.js b/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.js deleted file mode 100644 index b160b67..0000000 --- a/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.js +++ /dev/null @@ -1,42 +0,0 @@ -import React, { useMemo } from "react"; -import styles from "./LineWithDescp.module.css"; -import { Chart } from "react-charts"; - -export const LineWithDescp = ({ data, children, ...props }) => { - const primaryAxis = useMemo( - () => ({ - getValue: (datum) => datum.primary, - }), - [] - ); - - const secondaryAxes = useMemo( - () => [ - { - getValue: (datum) => datum.secondary, - }, - ], - [] - ); - let convert_data = []; - for (const k in data) { - convert_data.push({ - label: k, - data: data[k].map((v, i)=>{ - return { - primary: i, - secondary: v, - } - }), - }) - } - - return ( -
-
{children}
-
- -
-
- ); -}; diff --git a/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.module.css b/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.module.css deleted file mode 100644 index 31c6b45..0000000 --- a/flow-debugger/debugger-ui/src/component/line_with_descp/LineWithDescp.module.css +++ /dev/null @@ -1,24 +0,0 @@ -.container { - width: 100%; - height: 300px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.descp { - white-space: nowrap; - text-decoration: none; - padding: 0 1.25em; - height: 3em; - font-weight: 700; - color: #444; - display: flex; - width: 50%; -} - -.line { - flex-grow: 1; - width: 50%; -} diff --git a/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.js b/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.js deleted file mode 100644 index c4ea237..0000000 --- a/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.js +++ /dev/null @@ -1,73 +0,0 @@ -import React, { useEffect, useRef } from "react"; -import { useSelector } from "react-redux"; -import Split from "split-grid"; -import styles from "./ResizableArea.module.css"; -import { Orientation } from "../../types"; - -const orientationSelect = (state) => - state.isSmall ? Orientation.Horizontal : Orientation.Vertical; - -export function ResizableArea(props) { - const orientation = useSelector(orientationSelect); - - const grid = useRef(null); - const dragHandle = useRef(null); - - useEffect(() => { - grid.current.style["grid-template-columns"] = null; - grid.current.style["grid-template-rows"] = null; - }, [orientation, props.focus]); - - useEffect(() => { - const split = Split({ - minSize: 150, - [TRACK_OPTION_NAME[orientation]]: [ - { - track: 1, - element: dragHandle.current, - }, - ], - }); - return () => split.destroy(); - }, [orientation, props.focus]); - - const gridStyle = props.focus - ? GRID_STYLE[orientation] - : HIDDEN_GRID_STYLE[orientation]; - const [handleOuterStyle, handleInnerStyle] = HANDLE_STYLES[orientation]; - - return ( -
- {props.children[0]} - {props.focus && ( -
- -
- )} - {props.children[1]} -
- ); -} - -const TRACK_OPTION_NAME = { - [Orientation.Horizontal]: "rowGutters", - [Orientation.Vertical]: "columnGutters", -}; - -const GRID_STYLE = { - [Orientation.Horizontal]: styles.resizeableAreaRow, - [Orientation.Vertical]: styles.resizeableAreaColumn, -}; - -const HIDDEN_GRID_STYLE = { - [Orientation.Horizontal]: styles.resizeableHiddenAreaRow, - [Orientation.Vertical]: styles.resizeableHiddenAreaColumn, -}; - -const HANDLE_STYLES = { - [Orientation.Horizontal]: [ - styles.splitRowsGutter, - styles.splitRowsGutterHandle, - ], - [Orientation.Vertical]: [styles.splitColumnsGutter, ""], -}; diff --git a/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.module.css b/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.module.css deleted file mode 100644 index 71d0ed0..0000000 --- a/flow-debugger/debugger-ui/src/component/resizable_area/ResizableArea.module.css +++ /dev/null @@ -1,58 +0,0 @@ -.resizeable { - width: 100%; - min-width: 0; - height: 100%; - min-height: 0; -} - -.container { - display: flex; - height: 100vh; - flex-direction: column; - padding-bottom: 1em; -} - -.resizeableAreaRow { - composes: resizeable; - display: grid; - grid-template-rows: 1fr 12px 1fr; -} - -.resizeableAreaColumn { - composes: resizeable; - display: grid; - grid-template-columns: 1fr 12px 1fr; -} - -.resizeableHiddenAreaRow { - composes: resizeable; - display: grid; - grid-template-rows: 1fr auto; -} - -.resizeableHiddenAreaColumn { - composes: resizeable; - display: grid; - grid-template-columns: 1fr auto; -} - -.splitRowsGutter { - display: flex; - align-items: center; - justify-content: center; - cursor: row-resize; - color: #fff; -} - -.splitRowsGutterHandle { - pointer-events: none; - transform: rotate(90deg); -} - -.splitColumnsGutter { - display: flex; - align-items: center; - justify-content: center; - cursor: col-resize; - color: #fff; -} diff --git a/flow-debugger/debugger-ui/src/component/tab/Tab.js b/flow-debugger/debugger-ui/src/component/tab/Tab.js deleted file mode 100644 index 6e7dd3d..0000000 --- a/flow-debugger/debugger-ui/src/component/tab/Tab.js +++ /dev/null @@ -1,26 +0,0 @@ -import styles from "./Tab.module.css"; -import React from "react"; - -const Tab = ({ focus, label, onClick, ...props }) => { - return ( - - ); -}; - -export const TabList = ({ focus, tabs, children = null }) => { - let tabsLabel = tabs.map((tab, i) => ( - - )); - return ( -
- {tabsLabel} - {children} -
- ); -}; diff --git a/flow-debugger/debugger-ui/src/component/tab/Tab.module.css b/flow-debugger/debugger-ui/src/component/tab/Tab.module.css deleted file mode 100644 index 90093b3..0000000 --- a/flow-debugger/debugger-ui/src/component/tab/Tab.module.css +++ /dev/null @@ -1,35 +0,0 @@ -.container { - display: flex; - width: 100%; - height: 100%; - flex-direction: column; -} - -.tabs { - display: flex; -} - -.tab { - flex: 1 1 auto; - border: 1px solid #dedede; - border-right: none; - background-color: #dedede; - cursor: pointer; - line-height: 1.5em; -} - -.tab:last-of-type { - border-right: 1px solid #dedede; -} - -.tabSelected { - composes: tab; - border-bottom: none; - background-color: #f9ffff; - cursor: default; -} - -.tabSelected:focus { - outline: none; - background-color: #fff; -} diff --git a/flow-debugger/debugger-ui/src/event_listener.js b/flow-debugger/debugger-ui/src/event_listener.js deleted file mode 100644 index c43ad19..0000000 --- a/flow-debugger/debugger-ui/src/event_listener.js +++ /dev/null @@ -1,51 +0,0 @@ -import { useState } from "react"; -import { pin, unpin } from "./page/editor/EditorSlice"; -import { update } from "./page/topology/TopologySlice"; -import { update as update_err } from "./page/text/TextSlice"; -import { changeMainPage, restoreDebuggerPage, changeStage } from "./app/actor"; -import { ERROR, TOPOLOGY, EDITOR } from "./types"; -import { parse } from "./parser"; -import toml from "toml"; - -export default (dispatch, notify) => { - const [parsed, setParsed] = useState({}); - return [parsed, { - _onerror: (e) => { - dispatch(update_err(`WEBSOCKET ERROR: ${e}`)); - dispatch(restoreDebuggerPage(ERROR)); - notify('connect') - notify('disconnect') - }, - _onclose: (e) => { - dispatch(changeStage("")); - dispatch(unpin()); - dispatch(changeMainPage(EDITOR)); - notify('connect') - notify('disconnect') - }, - initialized: (msg) => { - try { - dispatch(pin(msg.graph)); - const [for_viz, tmp] = parse(toml.parse(msg.graph)); - setParsed(tmp); - dispatch(update(for_viz)); - dispatch(changeMainPage(TOPOLOGY)); - } catch (e) { - if (e.line) { - dispatch( - update_err( - `ERROR: ${e.message} at lint ${e.line}, column ${e.column}` - ) - ); - } else { - dispatch(update_err(`ERROR: ${e.message}`)); - } - dispatch(restoreDebuggerPage(ERROR)); - } - notify('connect') - }, - terminated: (msg) => { - notify('disconnect') - }, - }]; -}; diff --git a/flow-debugger/debugger-ui/src/index.css b/flow-debugger/debugger-ui/src/index.css deleted file mode 100644 index 08bccb9..0000000 --- a/flow-debugger/debugger-ui/src/index.css +++ /dev/null @@ -1,28 +0,0 @@ -textarea { - font-family: "Open Sans", sans-serif; -} - -html { - box-sizing: border-box; -} - -*, -*:before, -*:after { - box-sizing: inherit; -} - -body { - overflow-y: hidden; - background-color: #282c37; - padding: 0 1em; - font-family: "Open Sans", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; - font-size: 0.9em; -} diff --git a/flow-debugger/debugger-ui/src/index.js b/flow-debugger/debugger-ui/src/index.js deleted file mode 100644 index 2c946d8..0000000 --- a/flow-debugger/debugger-ui/src/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom"; -import "./index.css"; -import { store } from "./app"; -import App from "./App"; -import { Provider } from "react-redux"; -import * as serviceWorker from "./serviceWorker"; -import { Waiter } from "react-wait"; - -ReactDOM.render( - - - - - - - , - document.getElementById("root") -); - -serviceWorker.register(); diff --git a/flow-debugger/debugger-ui/src/page/chart/Chart.js b/flow-debugger/debugger-ui/src/page/chart/Chart.js deleted file mode 100644 index 4f46662..0000000 --- a/flow-debugger/debugger-ui/src/page/chart/Chart.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import styles from "./Chart.module.css"; -import { useSelector } from "react-redux"; -import { LineWithDescp } from "../../component/line_with_descp/LineWithDescp"; -import { selectChartLines, selectChartFocus } from "./ChartSlice"; - -export const Chart = () => { - const ids = useSelector(selectChartFocus); - const lines = useSelector(selectChartLines(ids)); - const labels = Object.values(lines).map((line, i)=> { - return ( {line.descp} ) - }); - return ( -
-
- { labels } -
-
- ); -}; diff --git a/flow-debugger/debugger-ui/src/page/chart/Chart.module.css b/flow-debugger/debugger-ui/src/page/chart/Chart.module.css deleted file mode 100644 index 5dbc019..0000000 --- a/flow-debugger/debugger-ui/src/page/chart/Chart.module.css +++ /dev/null @@ -1,18 +0,0 @@ -.container { - height: 100%; - width: 100%; - background-color: #f9ffff; -} - -.list { - border: 1px solid #dedede; - border-top: none; - border-bottom: none; - padding: 0.5em; - background-color: #f9ffff; - display: flex; - height: auto; - width: 100%; - justify-content: flex-start; - flex-direction: column; -} diff --git a/flow-debugger/debugger-ui/src/page/chart/ChartSlice.js b/flow-debugger/debugger-ui/src/page/chart/ChartSlice.js deleted file mode 100644 index df446f3..0000000 --- a/flow-debugger/debugger-ui/src/page/chart/ChartSlice.js +++ /dev/null @@ -1,63 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -export const chartSlice = createSlice({ - name: "chart", - initialState: { - lines: {}, - focus: [], - }, - reducers: { - append: (state, elem) => { - if (!(elem.payload.id in state.lines)) { - state.lines[elem.payload.id] = { descp: elem.payload.descp, start: Date.now(), data: {} }; - } - let dst = state.lines[elem.payload.id].data; - let start = state.lines[elem.payload.id].start; - let src = elem.payload.data; - - let now = Date.now(); - let dur = now - start; - - for (const k in src) { - if (!(k in dst)) { - dst[k] = []; - } - const len = dst[k].length; - if (dur > 1000 || len === 0) { - dst[k].push(src[k]); - } else { - dst[k][len-1] = Math.max(dst[k][len-1], src[k]); - } - if (len >= 60) { // TODO: remove the hardcode - dst[k].shift(); - } - } - if (dur > 1000) { // TODO: remove the hardcode - state.lines[elem.payload.id].start = Date.now(); - } - }, - reset: (state) => { - state.lines = {}; - state.focus = []; - }, - focus: (state, ids) => { - state.focus = ids.payload; - } - }, -}); - -export const { append, reset, focus } = chartSlice.actions; - -export const selectChartLines = (ids) => (state) => { - let lines = {}; - for (const id of ids) { - if (id in state.chart.lines) { - lines[id] = state.chart.lines[id]; - } - } - return lines; -}; - -export const selectChartFocus = (state) => state.chart.focus; - -export default chartSlice.reducer; diff --git a/flow-debugger/debugger-ui/src/page/editor/Editor.js b/flow-debugger/debugger-ui/src/page/editor/Editor.js deleted file mode 100644 index 5ad63c7..0000000 --- a/flow-debugger/debugger-ui/src/page/editor/Editor.js +++ /dev/null @@ -1,29 +0,0 @@ -import React, { useMemo } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import CodeMirror from "rodemirror"; -import { basicSetup } from "@codemirror/basic-setup"; -import { oneDark } from "@codemirror/theme-one-dark"; -import { StreamLanguage } from "@codemirror/stream-parser"; -import { toml } from "@codemirror/legacy-modes/mode/toml"; -import { update, selectEditorInit, selectEdit } from "./EditorSlice"; - -export const Editor = () => { - const dispatch = useDispatch(); - const init = useSelector(selectEditorInit); - const edit = useSelector(selectEdit); - const extensions = useMemo( - () => [basicSetup, oneDark, StreamLanguage.define(toml)], - [] - ); - return ( - { - if (v.docChanged && edit) { - dispatch(update(v.state.doc.toString())); - } - }} - /> - ); -}; diff --git a/flow-debugger/debugger-ui/src/page/editor/EditorSlice.js b/flow-debugger/debugger-ui/src/page/editor/EditorSlice.js deleted file mode 100644 index 838b5b5..0000000 --- a/flow-debugger/debugger-ui/src/page/editor/EditorSlice.js +++ /dev/null @@ -1,34 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -export const editorSlice = createSlice({ - name: "editor", - initialState: { - init: "", - changed: "", - edit: true, - }, - reducers: { - save: (state) => { - state.init = state.changed; - }, - update: (state, changed) => { - state.changed = changed.payload; - }, - pin: (state, overwrite) => { - state.init = overwrite.payload; - state.changed = overwrite.payload; - state.edit = false; - }, - unpin: (state) => { - state.edit = true; - }, - }, -}); - -export const { save, update, pin, unpin } = editorSlice.actions; - -export const selectEditorInit = (state) => state.editor.init; -export const selectEditorChanged = (state) => state.editor.changed; -export const selectEdit = (state) => state.editor.edit; - -export default editorSlice.reducer; diff --git a/flow-debugger/debugger-ui/src/page/empty/Empty.js b/flow-debugger/debugger-ui/src/page/empty/Empty.js deleted file mode 100644 index ac78844..0000000 --- a/flow-debugger/debugger-ui/src/page/empty/Empty.js +++ /dev/null @@ -1,6 +0,0 @@ -import React from "react"; -import styles from "./Empty.module.css"; - -export const Empty = (props) => { - return
{props.children}
; -}; diff --git a/flow-debugger/debugger-ui/src/page/empty/Empty.module.css b/flow-debugger/debugger-ui/src/page/empty/Empty.module.css deleted file mode 100644 index 799ec14..0000000 --- a/flow-debugger/debugger-ui/src/page/empty/Empty.module.css +++ /dev/null @@ -1,8 +0,0 @@ -.empty { - height: 100%; - width: 100%; - padding: 0.5em; - border: 1px solid #dedede; - border-top: none; - background-color: #f9ffff; -} diff --git a/flow-debugger/debugger-ui/src/page/index.js b/flow-debugger/debugger-ui/src/page/index.js deleted file mode 100644 index 4bd4ee2..0000000 --- a/flow-debugger/debugger-ui/src/page/index.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; -import { useSelector } from "react-redux"; -import { Empty } from "./empty/Empty"; -import { Text } from "./text/Text"; -import { Topology } from "./topology/Topology"; -import { Editor } from "./editor/Editor"; -import { Chart } from "./chart/Chart"; - -export const MainSwitcher = () => { - const page = useSelector((state) => state.main.page); - switch (page) { - case "topology": - return ; - case "editor": - return ; - default: - return ; - } -}; - -export const DebuggerSwitcher = () => { - const page = useSelector((state) => state.dbg.page); - - switch (page) { - case "error": - return ; - case "chart": - return ; - default: - return ; - } -}; diff --git a/flow-debugger/debugger-ui/src/page/text/Text.js b/flow-debugger/debugger-ui/src/page/text/Text.js deleted file mode 100644 index 2eb7973..0000000 --- a/flow-debugger/debugger-ui/src/page/text/Text.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; -import styles from "./Text.module.css"; -import { useSelector } from "react-redux"; -import { selectTextMessage } from "./TextSlice"; - -export const Text = () => { - const message = useSelector(selectTextMessage); - return ( -
-

{message}

-
- ); -}; diff --git a/flow-debugger/debugger-ui/src/page/text/Text.module.css b/flow-debugger/debugger-ui/src/page/text/Text.module.css deleted file mode 100644 index 1106610..0000000 --- a/flow-debugger/debugger-ui/src/page/text/Text.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.text { - height: 100%; - width: 100%; - padding: 0.5em; - border: 1px solid #dedede; - border-top: none; - background-color: #f9ffff; -} - -.text h1 { - margin: 1em; - color: rgb(214, 122, 127); -} diff --git a/flow-debugger/debugger-ui/src/page/text/TextSlice.js b/flow-debugger/debugger-ui/src/page/text/TextSlice.js deleted file mode 100644 index a89e54d..0000000 --- a/flow-debugger/debugger-ui/src/page/text/TextSlice.js +++ /dev/null @@ -1,19 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -export const textSlice = createSlice({ - name: "text", - initialState: { - message: "", - }, - reducers: { - update: (state, changed) => { - state.message = changed.payload; - }, - }, -}); - -export const { update } = textSlice.actions; - -export const selectTextMessage = (state) => state.text.message; - -export default textSlice.reducer; diff --git a/flow-debugger/debugger-ui/src/page/topology/Topology.js b/flow-debugger/debugger-ui/src/page/topology/Topology.js deleted file mode 100644 index d028ae5..0000000 --- a/flow-debugger/debugger-ui/src/page/topology/Topology.js +++ /dev/null @@ -1,56 +0,0 @@ -import React from "react"; -import { useSelector, useDispatch } from "react-redux"; -import { selectDescp, selectListen } from "./TopologySlice"; -import Graph from "./VisGraph"; -import { restoreDebuggerPage, storeDebuggerPage } from "../../app/actor"; -import { CHART } from "../../types"; -import { focus } from "../chart/ChartSlice"; - -const options = { - autoResize: true, - width: "100%", - height: "100%", - layout: { - randomSeed: 0, - hierarchical: false, - }, - edges: { - color: "#ffffff", - }, - physics: { - enabled: false, - }, -}; - -export const Topology = () => { - let dispatch = useDispatch(); - let descp = useSelector(selectDescp); - let listen = useSelector(selectListen); - let edges = descp.edges.map((edge) => { - return { ...edge }; - }); // workaround for graph-viz - let events = listen ? { - click: (e) => { - if (e.nodes.length === 1) { - let id = e.nodes[0]; - let ports = descp.nodes.find(node=>node.id === id).ports; - let ids = ports.map(port=>`${id}#${port}`); - dispatch(focus(ids)); - dispatch(restoreDebuggerPage(CHART)); - } - }, - deselectNode: (e) => { - if (e.nodes.length === 0) { - dispatch(storeDebuggerPage()) - } - }, - } : {}; - return ( - - ); -}; diff --git a/flow-debugger/debugger-ui/src/page/topology/TopologySlice.js b/flow-debugger/debugger-ui/src/page/topology/TopologySlice.js deleted file mode 100644 index 84204a8..0000000 --- a/flow-debugger/debugger-ui/src/page/topology/TopologySlice.js +++ /dev/null @@ -1,41 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -export const topologySlice = createSlice({ - name: "topology", - initialState: { - descp: { - nodes: [], - edges: [], - }, - listen: false, - }, - reducers: { - update: (state, descp) => { - state.descp = { - nodes: descp.payload.nodes || [], - edges: descp.payload.edges || [], - }; - }, - setBlock: (state, ids) => { - for (let node of state.descp.nodes) { - if (ids.payload.includes(node.id)) { - node.color = '#ff0000'; - node.font = { color: "#fff" }; - } else if (node.title) { - node.color = '#fff'; - node.font = { color: "#000" }; - } - } - }, - listen: (state, listen) => { - state.listen = listen.payload; - } - }, -}); - -export const { update, setBlock, listen } = topologySlice.actions; - -export const selectDescp = (state) => state.topology.descp; -export const selectListen = (state) => state.topology.listen; - -export default topologySlice.reducer; diff --git a/flow-debugger/debugger-ui/src/page/topology/VisGraph.js b/flow-debugger/debugger-ui/src/page/topology/VisGraph.js deleted file mode 100644 index bf61e84..0000000 --- a/flow-debugger/debugger-ui/src/page/topology/VisGraph.js +++ /dev/null @@ -1,182 +0,0 @@ -import React, { - forwardRef, - useEffect, - useImperativeHandle, - useRef, - useState, -} from "react"; -import { DataSet } from "vis-data"; -import { Network } from "vis-network"; -import { - differenceWith, - intersectionWith, - isEqual, - defaultsDeep, - cloneDeep, -} from "lodash"; - -var __rest = - (this && this.__rest) || - function (s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for ( - var i = 0, pp = Object.getOwnPropertySymbols(s); - i < pp.length; - i++ - ) { - if ( - e.indexOf(pp[i]) < 0 && - Object.prototype.propertyIsEnumerable.call(s, pp[i]) - ) - t[pp[i]] = s[pp[i]]; - } - return t; - }; - -/** - * Keeps the value the same permanently. - * Useful over refs especially in instances where the function creation variant is used - */ -function useSealedState(value) { - const [state] = useState(value); - return state; -} -/** - * https://github.com/crubier/react-graph-vis/commit/68bf2e27b2046d6c0bb8b334c2cf974d23443264 - */ -const diff = (current, next, field = "id") => { - const nextIds = new Set(next.map((item) => item[field])); - const removed = current.filter((item) => !nextIds.has(item[field])); - const unchanged = intersectionWith(next, current, isEqual); - const updated = differenceWith( - intersectionWith(next, current, (a, b) => a[field] === b[field]), - unchanged, - isEqual - ); - const added = differenceWith( - differenceWith(next, current, isEqual), - updated, - isEqual - ); - return { - removed, - unchanged, - updated, - added, - }; -}; -const defaultOptions = { - physics: { - stabilization: false, - }, - autoResize: false, - edges: { - smooth: false, - color: "#000000", - width: 0.5, - arrows: { - to: { - enabled: true, - scaleFactor: 0.5, - }, - }, - }, -}; -/** - * Conversion of https://github.com/crubier/react-graph-vis/blob/master/src/index.js to a function component - */ -const VisGraph = forwardRef((_a, ref) => { - var { graph, events, options: propOptions } = _a, - props = __rest(_a, ["graph", "events", "options"]); - const container = useRef(null); - const edges = useSealedState(() => new DataSet(graph.edges)); - const nodes = useSealedState(() => new DataSet(graph.nodes)); - const initialOptions = useSealedState(propOptions); - const prevNodes = useRef(graph.nodes); - const prevEdges = useRef(graph.edges); - useEffect(() => { - if (isEqual(graph.nodes, prevNodes.current)) { - return; // No change! - } - const { added, removed, updated } = diff( - prevNodes.current, - graph.nodes - ); - nodes.remove(removed); - nodes.add(added); - nodes.update(updated); - prevNodes.current = graph.nodes; - }, [graph.nodes, nodes]); - useEffect(() => { - if (isEqual(graph.edges, prevEdges.current)) { - return; // No change! - } - const { added, removed, updated } = diff( - prevEdges.current, - graph.edges - ); - edges.remove(removed); - edges.add(added); - edges.update(updated); - prevEdges.current = graph.edges; - }, [graph.edges, edges]); - const [network, setNetwork] = useState(); - useImperativeHandle(ref, () => network, [network]); - useEffect(() => { - if (!network || !events) { - return () => {}; - } - // Add user provied events to network - for (const [eventName, callback] of Object.entries(events)) { - if (callback) { - network.on(eventName, callback); - } - } - return () => { - for (const [eventName, callback] of Object.entries(events)) { - if (callback) { - network.off(eventName, callback); - } - } - }; - }, [events, network]); - useEffect(() => { - if (!network || !propOptions) { - return; - } - try { - network.setOptions(propOptions); - } catch (error) { - // Throws when it hot reloads... Yay - if (process.env.NODE_ENV !== "development") { - // Still throw it in prod where there's no hot reload - throw error; - } - } - }, [network, propOptions]); - useEffect(() => { - // Creating the network has to be done in a useEffect because it needs access to a ref - // merge user provied options with our default ones - // defaultsDeep mutates the host object - const mergedOptions = defaultsDeep( - cloneDeep(initialOptions), - defaultOptions - ); - const newNetwork = new Network( - container.current, - { edges, nodes }, - mergedOptions - ); - setNetwork(newNetwork); - return () => { - // Cleanup the network on component unmount - newNetwork.destroy(); - }; - }, [edges, initialOptions, nodes]); - return React.createElement("div", Object.assign({ ref: container }, props)); -}); -export default VisGraph; diff --git a/flow-debugger/debugger-ui/src/parser.js b/flow-debugger/debugger-ui/src/parser.js deleted file mode 100644 index fba4b5e..0000000 --- a/flow-debugger/debugger-ui/src/parser.js +++ /dev/null @@ -1,399 +0,0 @@ -function list2map(list) { - if (list) { - return Object.fromEntries(list.map((e) => [e.name, e])); - } else { - return {}; - } -} - -function isGraph(config, name) { - return config.graphs.hasOwnProperty(name); -} - -function isInput(graph, name) { - return graph.inputs.hasOwnProperty(name); -} - -function isOutput(graph, name) { - return graph.outputs.hasOwnProperty(name); -} - -function parseGraph(config, graph) { - let nodes = {}; - let edges = []; - let inputs = {}; - let inputs_tag = {}; - let outputs = {}; - let outputs_tag = {}; - - let subgraphs = {}; - let dots = []; - - for (const name in graph.nodes) { - let node = graph.nodes[name]; - if (isGraph(config, node.ty)) { - subgraphs[name] = parseGraph(config, config.graphs[node.ty]); - node.link = subgraphs[name]; - } else { - nodes[name] = { - id: config.counter, - label: name, - color: "#fff", - title: graph.name, - ports: new Set(), - }; - node.link = nodes[name]; - config.counter += 1; - } - } - - for (const conn of graph.connections) { - let related = { rx: [], tx: [], unknown: [] }; - for (const port of conn.ports) { - let port_split = port.split(":"); - let node_name = port_split[0]; - let node_port = port_split[1]; - if (nodes.hasOwnProperty(node_name)) { - nodes[node_name].ports.add(node_port); - related.unknown.push(nodes[node_name].id); - } else if (subgraphs.hasOwnProperty(node_name)) { - const subgraph = subgraphs[node_name]; - if (isInput(subgraph, node_port)) { - for (const id of subgraph.inputs[node_port]) { - related.rx.push(id); - } - } else if (isOutput(subgraph, node_port)) { - for (const id of subgraph.outputs[node_port]) { - related.tx.push(id); - } - } else { - throw new Error( - `port[${node_port}] is not found in graph[${graph.nodes[node_name].ty}]` - ); - } - } else if (config.g_nodes.hasOwnProperty(node_name)) { - config.g_nodes[node_name].ports.add(node_port); - related.unknown.push(config.g_nodes[node_name].id); - } else if (config.g_graphs.hasOwnProperty(node_name)) { - const subgraph = config.g_graphs[node_name]; - if (isInput(subgraph, node_port)) { - for (const id of subgraph.inputs[node_port]) { - related.rx.push(id); - } - } else if (isOutput(subgraph, node_port)) { - for (const id of subgraph.outputs[node_port]) { - related.tx.push(id); - } - } else { - throw new Error( - `port[${node_port}] is not found in graph[${graph.nodes[node_name].ty}]` - ); - } - } else { - throw new Error(`node[${node_name}] is not found in config`); - } - } - if ( - related.rx.length + related.tx.length + related.unknown.length > - 2 - ) { - let dot = config.counter; - dots.push(dot); - config.counter += 1; - for (const rx of related.rx) { - edges.push({ from: dot, to: rx, arrows: "to" }); - } - for (const tx of related.tx) { - edges.push({ from: tx, to: dot, arrows: "to" }); - } - for (const unknown of related.unknown) { - edges.push({ from: unknown, to: dot, arrows: "" }); - } - } else { - let from = -1, - to = -1, - offset = 0; - if (related.tx.length === 1) { - from = related.tx[0]; - } - if (related.rx.length === 1) { - to = related.rx[0]; - } - if (from === -1) { - from = related.unknown[offset]; - offset += 1; - } - if (to === -1) { - to = related.unknown[offset]; - offset += 1; - } - edges.push({ from, to, arrows: offset === 2 ? "" : "to" }); - } - } - - for (const name in graph.inputs) { - const input = graph.inputs[name]; - let ids = []; - let tags = []; - for (const port of input.ports) { - let port_split = port.split(":"); - let node_name = port_split[0]; - let port_name = port_split[1]; - if (nodes.hasOwnProperty(node_name)) { - nodes[node_name].ports.add(port_name); - ids.push(nodes[node_name].id); - tags.push(port_name) - } else if (subgraphs.hasOwnProperty(node_name)) { - for (const id of subgraphs[node_name].inputs[port_name]) { - ids.push(id); - } - for (const tag of subgraphs[node_name].inputs_tag[port_name]) { - tags.push(tag); - } - } else if (config.g_nodes.hasOwnProperty(node_name)) { - config.g_nodes[node_name].ports.add(port_name); - ids.push(config.g_nodes[node_name].id); - tags.push(port_name); - } else if (config.g_graphs.hasOwnProperty(node_name)) { - const subgraph = config.g_graphs[node_name]; - for (const id of subgraph[node_name].inputs[port_name]) { - ids.push(id); - } - for (const tag of subgraphs[node_name].inputs_tag[port_name]) { - tags.push(tag); - } - } else { - throw new Error(`node[${node_name}] is not found in config`); - } - } - inputs[name] = ids; - inputs_tag[name] = tags; - } - - for (const name in graph.outputs) { - const output = graph.outputs[name]; - let ids = []; - let tags = []; - for (const port of output.ports) { - let port_split = port.split(":"); - let node_name = port_split[0]; - let port_name = port_split[1]; - if (nodes.hasOwnProperty(node_name)) { - nodes[node_name].ports.add(port_name); - ids.push(nodes[node_name].id); - tags.push(port_name); - } else if (subgraphs.hasOwnProperty(node_name)) { - for (const id of subgraphs[node_name].outputs[port_name]) { - ids.push(id); - } - for (const tag of subgraphs[node_name].outputs_tag[port_name]) { - tags.push(tag); - } - } else if (config.g_nodes.hasOwnProperty(node_name)) { - config.g_nodes[node_name].ports.add(port_name); - ids.push(config.g_nodes[node_name].id); - tags.push(port_name); - } else if (config.g_graphs.hasOwnProperty(node_name)) { - const subgraph = config.g_graphs[node_name]; - for (const id of subgraph[node_name].outptus) { - ids.push(id); - } - for (const tag of subgraphs[node_name].outputs_tag[port_name]) { - tags.push(tag); - } - } else { - throw new Error(`node[${node_name}] is not found in config`); - } - } - outputs[name] = ids; - outputs_tag = tags; - } - - return { - name: graph.name, - nodes: Object.values(nodes) - .concat( - dots.map((id) => { - return { - id, - label: null, - color: "#000", - shape: "dot", - size: 1, - }; - }) - ) - .concat( - Object.values(subgraphs).reduce( - (cal, g) => cal.concat(g.nodes), - [] - ) - ), - edges: edges.concat( - Object.values(subgraphs).reduce((cal, g) => cal.concat(g.edges), []) - ), - inputs, - inputs_tag, - outputs, - outputs_tag, - }; -} - -function translateGraph(graph) { - return { - name: graph.name, - nodes: list2map(graph.nodes) || {}, - inputs: list2map(graph.inputs) || {}, - outputs: list2map(graph.outputs) || {}, - connections: graph.connections || [], - }; -} - -function translateConfig(config) { - return { - main: config.main, - nodes: list2map(config.nodes) || {}, - graphs: - list2map(config.graphs.map((graph) => translateGraph(graph))) || {}, - counter: 1, - }; -} - -export const parse = (config) => { - let config_translated = translateConfig(config); - let main = config.main; - config_translated.g_nodes = {}; - config_translated.g_graphs = {}; - - for (const name in config_translated.nodes) { - let node = config_translated.nodes[name]; - if (isGraph(config_translated, node.ty)) { - config_translated.g_graphs[name] = parseGraph( - config_translated, - config_translated.graphs[node.ty] - ); - node.link = config_translated.g_graphs[name]; - } else { - config_translated.g_nodes[name] = { - id: config_translated.counter, - label: name, - color: "#fff", - title: "__GLOBAL__", - ports: new Set(), - }; - node.link = config_translated.g_nodes[name]; - config_translated.counter += 1; - } - } - - let parsed = parseGraph(config_translated, config_translated.graphs[main]); - - for (const name in parsed.inputs) { - let id = config_translated.counter; - parsed.nodes.push({ - id, - label: name, - color: "#000", - font: { color: "#fff" }, - }); - config_translated.counter += 1; - for (const to of parsed.inputs[name]) { - parsed.edges.push({ from: id, to, arrows: "to" }); - } - } - - for (const name in parsed.outputs) { - let id = config_translated.counter; - parsed.nodes.push({ - id, - label: name, - color: "#000", - font: { color: "#fff" }, - }); - config_translated.counter += 1; - for (const from of parsed.outputs[name]) { - parsed.edges.push({ from, to: id, arrows: "to" }); - } - } - return [ - { - nodes: parsed.nodes.concat( - Object.values(config_translated.g_nodes) - ).map(node=> { - if (node.ports) { - node.ports = [...node.ports]; - } - return node; - }), - edges: parsed.edges, - }, - config_translated, - ]; -}; - -function findNodeById(config, graph_name, id) { - for (const node of Object.values(config.graphs[graph_name].nodes)) { - if ((id in node.link) && node.link.id === id) { - return node; - } - } - for (const node of Object.values(config.nodes)) { - if ((id in node.link) && node.link.id === id) { - return node; - } - } - for (const graph of Object.values(config.graphs)) { - if (graph.name === graph_name) continue; - for (const node of Object.values(graph.nodes)) { - if ((id in node.link) && node.link.id === id) { - return node; - } - } - } - return null; -} - -export const splitQpsNode = (config, graph_name, node) => { - let splitNode = (cfg) => { - if (!cfg) return undefined; - let id = cfg.link.id; - let ports = Object.entries(node.qps).map(pair=>{ - return { id: `${id}#${pair[0]}`, descp: `${node.name}:${pair[0]}`, data: { size: pair[1][0], qps: pair[1][1] } }; - }); - return { id, is_block: node.is_block, ports }; - }; - let splitGraph = (cfg) => { - if (!cfg) return undefined; - let ids = []; - let inputs = (pair) => cfg.link.inputs[pair[0]].map((id, i)=> { - ids.push(id); - let node = findNodeById(config, cfg.ty, id); - let tag = cfg.link.inputs_tag[pair[0]][i]; - return { id: `${id}#${tag}`, descp: `${node.name}:${tag}`, data: { size: pair[1][0], qps: pair[1][1] } } - }); - let outputs = (pair) => cfg.link.outputs[pair[0]].map((id, i)=> { - let node = findNodeById(config, cfg.ty, id); - let tag = cfg.link.outputs_tag[pair[0]][i]; - return { id: `${id}#${tag}`, descp: `${node.name}:${tag}`, data: { size: pair[1][0], qps: pair[1][1] } } - }); - let ports = Object.entries(node.qps).map(pair=>{ - return inputs(pair).concat(outputs(pair)) - }).flat(); - return { ids, is_block: node.is_block, ports }; - }; - if (node.name in config.g_nodes) { - let cfg = config.nodes[node.name]; - return splitNode(cfg); - } - if (node.name in config.g_graphs) { - let cfg = config.nodes[node.name]; - return splitGraph(cfg); - } - let cfg = config.graphs[graph_name].nodes[node.name]; - if (!cfg) return undefined; - if (isGraph(config, cfg.ty)) { - return splitGraph(cfg); - } else { - return splitNode(cfg); - } -} diff --git a/flow-debugger/debugger-ui/src/serviceWorker.js b/flow-debugger/debugger-ui/src/serviceWorker.js deleted file mode 100644 index 3ce059b..0000000 --- a/flow-debugger/debugger-ui/src/serviceWorker.js +++ /dev/null @@ -1,138 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read https://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === "localhost" || - // [::1] is the IPv6 localhost address. - window.location.hostname === "[::1]" || - // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -export function register(config) { - if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener("load", () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - "This web app is being served cache-first by a service " + - "worker. To learn more, visit https://bit.ly/CRA-PWA" - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl, config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === "installed") { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - "New content is available and will be used when all " + - "tabs for this page are closed. See https://bit.ly/CRA-PWA." - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log("Content is cached for offline use."); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch((error) => { - console.error("Error during service worker registration:", error); - }); -} - -function checkValidServiceWorker(swUrl, config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl, { - headers: { "Service-Worker": "script" }, - }) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get("content-type"); - if ( - response.status === 404 || - (contentType != null && - contentType.indexOf("javascript") === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - "No internet connection found. App is running in offline mode." - ); - }); -} - -export function unregister() { - if ("serviceWorker" in navigator) { - navigator.serviceWorker.ready.then((registration) => { - registration.unregister(); - }); - } -} diff --git a/flow-debugger/debugger-ui/src/types.js b/flow-debugger/debugger-ui/src/types.js deleted file mode 100644 index 3ea2009..0000000 --- a/flow-debugger/debugger-ui/src/types.js +++ /dev/null @@ -1,13 +0,0 @@ -export const Orientation = { - Horizontal: "horizontal", - Vertical: "vertical", -}; - -export const MainTabs = ["editor", "topology"]; -export const EDITOR = 0; -export const TOPOLOGY = 1; - -export const DebuggerTabs = ["empty", "error", "chart"]; -export const EMPTY = 0; -export const ERROR = 1; -export const CHART = 2; diff --git a/flow-debugger/debugger-ui/src/websocket.js b/flow-debugger/debugger-ui/src/websocket.js deleted file mode 100644 index ca9ab37..0000000 --- a/flow-debugger/debugger-ui/src/websocket.js +++ /dev/null @@ -1,83 +0,0 @@ -import { useState, useRef, useEffect } from "react"; - -export const useWebsocket = (onEvent) => { - const ws = useRef(null); - const [ seq, setSeq ] = useState(0); - const [ registry, setRegistry ] = useState({}); - - const createWebSocket = (url) => { - try { - ws.current = new WebSocket(url); - ws.current.onclose = (e) => { - onEvent._onclose && onEvent._onclose(e); - ws.current = null; - }; - ws.current.onerror = (e) => { - onEvent._onerror && onEvent._onerror(`there was an error with your websocket`); - }; - ws.current.onmessage = ({ data }) => { - const parsed = JSON.parse(data); - if (parsed.ty && parsed.ty === "event") { - if (parsed.event === "stop") { - let rest = registry; - delete rest[parsed.seq_id]; - setRegistry(rest); - } else { - onEvent[parsed.event](parsed); - } - } else if (parsed.ty && parsed.ty === "response") { - if (!(parsed.seq_id in registry)) - return; - for (const callback of registry[parsed.seq_id]) { - callback(parsed); - } - } - }; - } catch (e) { - onEvent._onerror && onEvent._onerror(`connect ${url} fault`); - ws.current = null; - } - }; - - const connect = (url) => { - if (!ws.current) { - createWebSocket(url); - } - }; - - const disconnect = () => { - ws.current && ws.current.close(); - }; - - const send = (seq_id, msg, callback=undefined) => { - msg.ty = 'request'; - if (seq_id >= 0) - msg.seq_id = seq_id; - else { - msg.seq_id = seq; - setSeq(seq + 1); - } - let tmp = registry; - if (!(msg.seq_id in tmp)) { - tmp[msg.seq_id] = [] - } - if (callback) { - tmp[msg.seq_id].push(callback) - } - setRegistry(tmp); - ws.current && ws.current.send(JSON.stringify(msg)); - return msg.seq_id; - }; - - useEffect(() => { - return () => { - ws.current && ws.current.close(); - }; - }, [ws]); - - return { - send, - connect, - disconnect, - }; -}; diff --git a/flow-debugger/debugger-ui/yarn.lock b/flow-debugger/debugger-ui/yarn.lock deleted file mode 100644 index df5f11d..0000000 --- a/flow-debugger/debugger-ui/yarn.lock +++ /dev/null @@ -1,11687 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5": - "integrity" "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@7.0.0": - "integrity" "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": - "integrity" "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" - "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz" - "version" "7.15.0" - -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@^7.4.5": - "integrity" "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.15.0" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - "convert-source-map" "^1.7.0" - "debug" "^4.1.0" - "gensync" "^1.0.0-beta.2" - "json5" "^2.1.2" - "semver" "^6.3.0" - "source-map" "^0.5.0" - -"@babel/core@7.2.2": - "integrity" "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz" - "version" "7.2.2" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.2" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.2.2" - "convert-source-map" "^1.1.0" - "debug" "^4.1.0" - "json5" "^2.1.0" - "lodash" "^4.17.10" - "resolve" "^1.3.2" - "semver" "^5.4.1" - "source-map" "^0.5.0" - -"@babel/generator@^7.15.0", "@babel/generator@^7.2.2": - "integrity" "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==" - "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/types" "^7.15.0" - "jsesc" "^2.5.1" - "source-map" "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.14.5": - "integrity" "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==" - "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - "integrity" "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==" - "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-explode-assignable-expression" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": - "integrity" "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==" - "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - "browserslist" "^4.16.6" - "semver" "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0", "@babel/helper-create-class-features-plugin@^7.3.0": - "integrity" "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-split-export-declaration" "^7.14.5" - -"@babel/helper-create-regexp-features-plugin@^7.14.5": - "integrity" "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "regexpu-core" "^4.7.1" - -"@babel/helper-define-map@^7.1.0": - "integrity" "sha512-spfQRnoChdYWwyFetQDBSDBgH42VskaquRI52kbLei5MjV7s3NPq30/sh2S3YdT20Ku/ZpaNnTVgmDo20NWylg==" - "resolved" "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-define-polyfill-provider@^0.2.2": - "integrity" "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==" - "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz" - "version" "0.2.3" - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - "debug" "^4.1.1" - "lodash.debounce" "^4.0.8" - "resolve" "^1.14.2" - "semver" "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.14.5": - "integrity" "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-function-name@^7.1.0", "@babel/helper-function-name@^7.14.5": - "integrity" "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.14.5": - "integrity" "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==" - "resolved" "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - "integrity" "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.15.0": - "integrity" "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==" - "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/types" "^7.15.0" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": - "integrity" "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": - "integrity" "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-optimise-call-expression@^7.0.0", "@babel/helper-optimise-call-expression@^7.14.5": - "integrity" "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==" - "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - "integrity" "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" - "version" "7.14.5" - -"@babel/helper-remap-async-to-generator@^7.14.5": - "integrity" "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==" - "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-wrap-function" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": - "integrity" "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==" - "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-simple-access@^7.14.8": - "integrity" "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==" - "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz" - "version" "7.14.8" - dependencies: - "@babel/types" "^7.14.8" - -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - "integrity" "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.14.5": - "integrity" "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==" - "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - "integrity" "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" - "version" "7.14.9" - -"@babel/helper-validator-option@^7.14.5": - "integrity" "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" - "version" "7.14.5" - -"@babel/helper-wrap-function@^7.14.5": - "integrity" "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helpers@^7.14.8", "@babel/helpers@^7.2.0": - "integrity" "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==" - "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz" - "version" "7.15.3" - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/highlight@^7.0.0", "@babel/highlight@^7.14.5": - "integrity" "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.2.2": - "integrity" "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz" - "version" "7.15.3" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": - "integrity" "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - -"@babel/plugin-proposal-async-generator-functions@^7.14.9", "@babel/plugin-proposal-async-generator-functions@^7.2.0": - "integrity" "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz" - "version" "7.14.9" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.14.5": - "integrity" "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-properties@7.3.0": - "integrity" "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz" - "version" "7.3.0" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-class-static-block@^7.14.5": - "integrity" "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@7.3.0": - "integrity" "sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz" - "version" "7.3.0" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.14.5": - "integrity" "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - "integrity" "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.14.5", "@babel/plugin-proposal-json-strings@^7.2.0": - "integrity" "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - "integrity" "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - "integrity" "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.14.5": - "integrity" "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.14.7": - "integrity" "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz" - "version" "7.14.7" - dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.5" - -"@babel/plugin-proposal-object-rest-spread@^7.3.1", "@babel/plugin-proposal-object-rest-spread@7.3.2": - "integrity" "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz" - "version" "7.3.2" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.14.5", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": - "integrity" "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.14.5": - "integrity" "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.14.5": - "integrity" "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.14.5": - "integrity" "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - "integrity" "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.4": - "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - "version" "7.8.4" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - "version" "7.12.13" - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.2.0": - "integrity" "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-dynamic-import@7.2.0": - "integrity" "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.2.0": - "integrity" "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.3": - "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.14.5": - "integrity" "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - "version" "7.10.4" - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - "version" "7.10.4" - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - "version" "7.8.3" - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.14.5": - "integrity" "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.14.5", "@babel/plugin-transform-arrow-functions@^7.2.0": - "integrity" "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.2.0": - "integrity" "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - -"@babel/plugin-transform-block-scoped-functions@^7.14.5", "@babel/plugin-transform-block-scoped-functions@^7.2.0": - "integrity" "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.14.5", "@babel/plugin-transform-block-scoping@^7.2.0": - "integrity" "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz" - "version" "7.15.3" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.14.9": - "integrity" "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz" - "version" "7.14.9" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "globals" "^11.1.0" - -"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@7.2.2": - "integrity" "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz" - "version" "7.2.2" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "globals" "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.14.5", "@babel/plugin-transform-computed-properties@^7.2.0": - "integrity" "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.14.7": - "integrity" "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz" - "version" "7.14.7" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.2.0", "@babel/plugin-transform-destructuring@7.3.2": - "integrity" "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz" - "version" "7.3.2" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - "integrity" "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.14.5", "@babel/plugin-transform-duplicate-keys@^7.2.0": - "integrity" "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.14.5", "@babel/plugin-transform-exponentiation-operator@^7.2.0": - "integrity" "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-flow-strip-types@7.2.3": - "integrity" "sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz" - "version" "7.2.3" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - -"@babel/plugin-transform-for-of@^7.14.5", "@babel/plugin-transform-for-of@^7.2.0": - "integrity" "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.14.5", "@babel/plugin-transform-function-name@^7.2.0": - "integrity" "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.14.5", "@babel/plugin-transform-literals@^7.2.0": - "integrity" "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.14.5": - "integrity" "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.14.5", "@babel/plugin-transform-modules-amd@^7.2.0": - "integrity" "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "babel-plugin-dynamic-import-node" "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.15.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": - "integrity" "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.8" - "babel-plugin-dynamic-import-node" "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.14.5", "@babel/plugin-transform-modules-systemjs@^7.2.0": - "integrity" "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "babel-plugin-dynamic-import-node" "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.14.5", "@babel/plugin-transform-modules-umd@^7.2.0": - "integrity" "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": - "integrity" "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz" - "version" "7.14.9" - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - -"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.14.5": - "integrity" "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.14.5", "@babel/plugin-transform-object-super@^7.2.0": - "integrity" "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - -"@babel/plugin-transform-parameters@^7.14.5", "@babel/plugin-transform-parameters@^7.2.0": - "integrity" "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.14.5": - "integrity" "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-constant-elements@^7.0.0": - "integrity" "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-constant-elements@7.2.0": - "integrity" "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@7.2.0": - "integrity" "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@^7.14.5": - "integrity" "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz" - "version" "7.15.1" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-development@^7.14.5": - "integrity" "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/plugin-transform-react-jsx" "^7.14.5" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - "integrity" "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz" - "version" "7.14.9" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - "integrity" "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.14.5": - "integrity" "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz" - "version" "7.14.9" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.14.5" - "@babel/types" "^7.14.9" - -"@babel/plugin-transform-react-pure-annotations@^7.14.5": - "integrity" "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.14.5": - "integrity" "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "regenerator-transform" "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.14.5": - "integrity" "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@7.2.0": - "integrity" "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "resolve" "^1.8.1" - "semver" "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.14.5", "@babel/plugin-transform-shorthand-properties@^7.2.0": - "integrity" "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.14.6", "@babel/plugin-transform-spread@^7.2.0": - "integrity" "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz" - "version" "7.14.6" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - -"@babel/plugin-transform-sticky-regex@^7.14.5", "@babel/plugin-transform-sticky-regex@^7.2.0": - "integrity" "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.14.5", "@babel/plugin-transform-template-literals@^7.2.0": - "integrity" "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.14.5", "@babel/plugin-transform-typeof-symbol@^7.2.0": - "integrity" "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.1.0": - "integrity" "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.14.5": - "integrity" "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.14.5", "@babel/plugin-transform-unicode-regex@^7.2.0": - "integrity" "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@^7.1.6": - "integrity" "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==" - "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.9" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.14.5" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.9" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.14.5" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.0" - "@babel/plugin-transform-modules-systemjs" "^7.14.5" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.0" - "babel-plugin-polyfill-corejs2" "^0.2.2" - "babel-plugin-polyfill-corejs3" "^0.2.2" - "babel-plugin-polyfill-regenerator" "^0.2.2" - "core-js-compat" "^3.16.0" - "semver" "^6.3.0" - -"@babel/preset-env@7.3.1": - "integrity" "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==" - "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz" - "version" "7.3.1" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.3.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.2.0" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" - "@babel/plugin-transform-function-name" "^7.2.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" - "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.2.0" - "browserslist" "^4.3.4" - "invariant" "^2.2.2" - "js-levenshtein" "^1.1.3" - "semver" "^5.3.0" - -"@babel/preset-modules@^0.1.4": - "integrity" "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==" - "resolved" "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - "esutils" "^2.0.2" - -"@babel/preset-react@^7.0.0": - "integrity" "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==" - "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.14.5" - "@babel/plugin-transform-react-jsx" "^7.14.5" - "@babel/plugin-transform-react-jsx-development" "^7.14.5" - "@babel/plugin-transform-react-pure-annotations" "^7.14.5" - -"@babel/preset-react@7.0.0": - "integrity" "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==" - "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - -"@babel/preset-typescript@7.1.0": - "integrity" "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==" - "resolved" "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz" - "version" "7.1.0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.1.0" - -"@babel/runtime-corejs3@^7.10.2": - "integrity" "sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==" - "resolved" "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz" - "version" "7.15.3" - dependencies: - "core-js-pure" "^3.16.0" - "regenerator-runtime" "^0.13.4" - -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.5.1", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - "integrity" "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz" - "version" "7.15.3" - dependencies: - "regenerator-runtime" "^0.13.4" - -"@babel/runtime@7.3.1": - "integrity" "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz" - "version" "7.3.1" - dependencies: - "regenerator-runtime" "^0.12.0" - -"@babel/template@^7.14.5", "@babel/template@^7.2.2": - "integrity" "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==" - "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz" - "version" "7.14.5" - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0", "@babel/traverse@^7.2.2": - "integrity" "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==" - "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" - "debug" "^4.1.0" - "globals" "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.14.9", "@babel/types@^7.15.0", "@babel/types@^7.2.2", "@babel/types@^7.4.4": - "integrity" "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz" - "version" "7.15.0" - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - "to-fast-properties" "^2.0.0" - -"@codemirror/autocomplete@^0.19.0": - "integrity" "sha512-xc7BqgTrul+kW9RpM1zB9hmmILF6GOgmz2B6UQkTv3bbH+sQ9LV0edvCJf/QUphep0mpsjLu/e2cAhkVdy6kZw==" - "resolved" "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/tooltip" "^0.19.0" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - -"@codemirror/basic-setup@^0.19.0": - "integrity" "sha512-Yhrf7fIz8+INHWOhpWeRwbs8fpc0KsydX9baD7TyYqniLVWyTi0Hwm52mr0f5O+k4YaJPeHAgT3x9gzDXZIvOw==" - "resolved" "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/autocomplete" "^0.19.0" - "@codemirror/closebrackets" "^0.19.0" - "@codemirror/commands" "^0.19.0" - "@codemirror/comment" "^0.19.0" - "@codemirror/fold" "^0.19.0" - "@codemirror/gutter" "^0.19.0" - "@codemirror/highlight" "^0.19.0" - "@codemirror/history" "^0.19.0" - "@codemirror/language" "^0.19.0" - "@codemirror/lint" "^0.19.0" - "@codemirror/matchbrackets" "^0.19.0" - "@codemirror/rectangular-selection" "^0.19.0" - "@codemirror/search" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/closebrackets@^0.19.0": - "integrity" "sha512-dFWX5OEVYWRNtGaifSbwIAlymnRRjxWMiMbffbAjF7p0zfGHDbdGkiT56q3Xud63h5/tQdSo5dK1iyNTzHz5vg==" - "resolved" "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/commands@^0.19.0": - "integrity" "sha512-6c9MlBW3UI13rCEqZkhD4etzWpxQKqeYKVn7CygsQ3LRtVprhfQxRts/K4vOcefC/Qq0VeRzYQt6crUPsOpaVA==" - "resolved" "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/matchbrackets" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - -"@codemirror/comment@^0.19.0": - "integrity" "sha512-3hqAd0548fxqOBm4khFMcXVIivX8p0bSlbAuZJ6PNoUn/0wXhxkxowPp0FmFzU2+y37Z+ZQF5cRB5EREWPRIiQ==" - "resolved" "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/fold@^0.19.0": - "integrity" "sha512-cHbr2hqKe2pMls1Ia1a4IwXly87ljpmvPUKkul6H/Uv9kCwpQLOP3dGMPXbMGm/1hGjBF/0wnc+m2iba9iJBTQ==" - "resolved" "https://registry.npmjs.org/@codemirror/fold/-/fold-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/gutter" "^0.19.0" - "@codemirror/language" "^0.19.0" - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/gutter@^0.19.0": - "integrity" "sha512-lPZJt7m3s1EIaUzkqYIr0vARnhh4ZcgzaLFaSweDn2IFIFq10TOnYzsuXJrgD7KfeU0Epjgznyg3VC0utHX7uA==" - "resolved" "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/highlight@^0.19.0": - "integrity" "sha512-79y2xrl8e0kyfdpH7fBRdQoUDSrb54iSP+bLyzN2IPjoNw2NoWfYsiBrkc/zeCdhJYAtRUzgBKHkLPpjF/FKRg==" - "resolved" "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - "style-mod" "^4.0.0" - -"@codemirror/history@^0.19.0": - "integrity" "sha512-E0H+lncH66IMDhaND9jgkjE7s0dhYfjCPmS+Ig2Yes9I8+UIEecIdObj8c8HPCFGctGg3fxXqRAw2mdHl2Wouw==" - "resolved" "https://registry.npmjs.org/@codemirror/history/-/history-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/language@^0.19.0": - "integrity" "sha512-Zz/gVezTknHhH2HcaMsYauxz06+3+IFU0nhhZmdTMcGbDL/ryQI2R543k9Zc58wA31lGa6uN+JzpZynEcGBwMQ==" - "resolved" "https://registry.npmjs.org/@codemirror/language/-/language-0.19.2.tgz" - "version" "0.19.2" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - "@lezer/lr" "^0.15.0" - -"@codemirror/legacy-modes@^0.19.0": - "integrity" "sha512-GSPdBNUeyF3nxJ2lztXGp2UoQjn+ggK5z+Kd4tflziecCG1+8mcdudDgFvxDuaTGWyM34S7Ldb4Xv7/XodZtBA==" - "resolved" "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/stream-parser" "^0.19.0" - -"@codemirror/lint@^0.19.0": - "integrity" "sha512-XjCIVJi2cUNlppwz0eGu0F93uFKJq1t2fupBQlDMr3hLmIxIRWjhvy66+Pw/ziH98XA8meLEGQX29umBAvym4w==" - "resolved" "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/panel" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/tooltip" "^0.19.0" - "@codemirror/view" "^0.19.0" - "crelt" "^1.0.5" - -"@codemirror/matchbrackets@^0.19.0": - "integrity" "sha512-jBEW2Uu3hWcrrkwkauaikCAE7s5liCwbccFa6rLK6DzwaynOqCKJGyDsbkfrhikofNRc1yh4V3vwUuxt2u4QbA==" - "resolved" "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - -"@codemirror/panel@^0.19.0": - "integrity" "sha512-LJuu49xnuhaAztlhnLJQ57ddOirSyf8/lnl7twsQUG/05RkxodBZ9F7q8r5AOLqOkaQOy9WySEKX1Ur8lD9Q5w==" - "resolved" "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/rangeset@^0.19.0": - "integrity" "sha512-3J6Lpfyja3Sf8kMJyP05mDYK9c0N8YiHunvZbDhSq6R9/ViDYxsfaHfl/eCILRqswFMUsebCKA5iRhjXw4LeoA==" - "resolved" "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - -"@codemirror/rectangular-selection@^0.19.0": - "integrity" "sha512-KdvoEweBgVsOcqdYFEinYGroS028pwUPkO3REzQC7Z/hT1KNqZUlyfoi6WBv3Gzp8b6l8NNA+rLnnYMSHlcGYA==" - "resolved" "https://registry.npmjs.org/@codemirror/rectangular-selection/-/rectangular-selection-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/search@^0.19.0": - "integrity" "sha512-9yFHX3XENso1dzUPkHNZU96IMCs/cjDg3JTF6qiInaCOxo5cwuRn95NIem+jlpvx6fQsjstzSR55HIb5R5fb7A==" - "resolved" "https://registry.npmjs.org/@codemirror/search/-/search-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/panel" "^0.19.0" - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@codemirror/view" "^0.19.0" - "crelt" "^1.0.5" - -"@codemirror/state@^0.19.0", "@codemirror/state@^0.19.1", "@codemirror/state@>=0.18.0": - "integrity" "sha512-5NR6/h+pVp7d77F4rLpNWcYvARCvqXa1uayoNx06d1aEm6wy/K+3lxTg7taB/qaEKd+oCsSHjRL8oSE1Fm+nsw==" - "resolved" "https://registry.npmjs.org/@codemirror/state/-/state-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/text" "^0.19.0" - -"@codemirror/stream-parser@^0.19.0", "@codemirror/stream-parser@^0.19.1": - "integrity" "sha512-ZoQR8oIDUaKyGm94lYSUAkfrFw7Cqr12MaIC6UAQter7GHYcN1A+Xa1z8rY0wd9Yv+w1yoDLY0XvpPMt2CEBzw==" - "resolved" "https://registry.npmjs.org/@codemirror/stream-parser/-/stream-parser-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/highlight" "^0.19.0" - "@codemirror/language" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "@lezer/common" "^0.15.0" - "@lezer/lr" "^0.15.0" - -"@codemirror/text@^0.19.0": - "integrity" "sha512-SxXmPitnMxbFriiJu3yYAq0V7I71SXVbOqFuoJ8BjXUml7DajgXIia9YeXTHovjlGSfisXTnYFyP6kVyRp7TMw==" - "resolved" "https://registry.npmjs.org/@codemirror/text/-/text-0.19.0.tgz" - "version" "0.19.0" - -"@codemirror/theme-one-dark@^0.19.0": - "integrity" "sha512-Xlk68ARreanFveE+KvZJY4HxecNr+VKDOR61O8l3kzlQ0qvxNXA0KAp1xu4p32pA9jzJqJi5haIgdfWSZogXZg==" - "resolved" "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/highlight" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/tooltip@^0.19.0": - "integrity" "sha512-JMe5ubrH+5eqjrORfgVUwccoARg/dfjPzuW0vmbjmFWu/c7RQQIbptmRBl1aa7qzdauQA2N49YUW4w67IaMIGA==" - "resolved" "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.0.tgz" - "version" "0.19.0" - dependencies: - "@codemirror/state" "^0.19.0" - "@codemirror/view" "^0.19.0" - -"@codemirror/view@^0.19.0", "@codemirror/view@^0.19.1", "@codemirror/view@>=0.18.0": - "integrity" "sha512-CxSM5Q9hK89CSX6mpT1ZPDq3kjzE1Ynx02l12M/MVTLvExge/8Ly8L+NYbKHpsR/uRtNc4E9V+dep+JXYOJYqQ==" - "resolved" "https://registry.npmjs.org/@codemirror/view/-/view-0.19.1.tgz" - "version" "0.19.1" - dependencies: - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.0" - "@codemirror/text" "^0.19.0" - "style-mod" "^4.0.0" - "w3c-keyname" "^2.2.4" - -"@csstools/convert-colors@^1.4.0": - "integrity" "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" - "resolved" "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz" - "version" "1.4.0" - -"@jest/types@^24.9.0": - "integrity" "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==" - "resolved" "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - "integrity" "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==" - "resolved" "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz" - "version" "25.5.0" - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - "chalk" "^3.0.0" - -"@jest/types@^27.0.6": - "integrity" "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==" - "resolved" "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz" - "version" "27.0.6" - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - "chalk" "^4.0.0" - -"@lezer/common@^0.15.0": - "integrity" "sha512-TLDp0BX/XAXhR2tleyWM7TjQ6LXVkkh2PcAHPu+fgi0xcT9JmI56Gh8zgMhoztDJAzH2ItMmufzVPVeBwz9VDw==" - "resolved" "https://registry.npmjs.org/@lezer/common/-/common-0.15.3.tgz" - "version" "0.15.3" - -"@lezer/lr@^0.15.0": - "integrity" "sha512-NnFhj1zyiyFqrZWFEBdxHoqtlFLTbXumMXLTO8oFSfR0jUaRSW+bQKwLqfNig1twyKEuSGpvkk2D27oEPFzFog==" - "resolved" "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.1.tgz" - "version" "0.15.1" - dependencies: - "@lezer/common" "^0.15.0" - -"@mrmlnc/readdir-enhanced@^2.2.1": - "integrity" "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==" - "resolved" "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz" - "version" "2.2.1" - dependencies: - "call-me-maybe" "^1.0.1" - "glob-to-regexp" "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - "integrity" "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz" - "version" "1.1.3" - -"@popperjs/core@^2.0.0", "@popperjs/core@^2.9.3": - "integrity" "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==" - "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz" - "version" "2.9.3" - -"@reach/observe-rect@^1.2.0": - "integrity" "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" - "resolved" "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz" - "version" "1.2.0" - -"@reduxjs/toolkit@^1.5.1": - "integrity" "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==" - "resolved" "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz" - "version" "1.6.1" - dependencies: - "immer" "^9.0.1" - "redux" "^4.1.0" - "redux-thunk" "^2.3.0" - "reselect" "^4.0.0" - -"@sheerun/mutationobserver-shim@^0.3.2": - "integrity" "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" - "resolved" "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz" - "version" "0.3.3" - -"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": - "integrity" "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": - "integrity" "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": - "integrity" "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": - "integrity" "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": - "integrity" "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz" - "version" "4.3.3" - -"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": - "integrity" "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": - "integrity" "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-plugin-transform-svg-component@^4.2.0": - "integrity" "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz" - "version" "4.2.0" - -"@svgr/babel-preset@^4.3.3": - "integrity" "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==" - "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz" - "version" "4.3.3" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" - "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" - "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" - "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" - "@svgr/babel-plugin-transform-svg-component" "^4.2.0" - -"@svgr/core@^4.1.0": - "integrity" "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==" - "resolved" "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz" - "version" "4.3.3" - dependencies: - "@svgr/plugin-jsx" "^4.3.3" - "camelcase" "^5.3.1" - "cosmiconfig" "^5.2.1" - -"@svgr/hast-util-to-babel-ast@^4.3.2": - "integrity" "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==" - "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz" - "version" "4.3.2" - dependencies: - "@babel/types" "^7.4.4" - -"@svgr/plugin-jsx@^4.1.0", "@svgr/plugin-jsx@^4.3.3": - "integrity" "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==" - "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz" - "version" "4.3.3" - dependencies: - "@babel/core" "^7.4.5" - "@svgr/babel-preset" "^4.3.3" - "@svgr/hast-util-to-babel-ast" "^4.3.2" - "svg-parser" "^2.0.0" - -"@svgr/plugin-svgo@^4.0.3": - "integrity" "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==" - "resolved" "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz" - "version" "4.3.1" - dependencies: - "cosmiconfig" "^5.2.1" - "merge-deep" "^3.0.2" - "svgo" "^1.2.2" - -"@svgr/webpack@4.1.0": - "integrity" "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==" - "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "@babel/core" "^7.1.6" - "@babel/plugin-transform-react-constant-elements" "^7.0.0" - "@babel/preset-env" "^7.1.6" - "@babel/preset-react" "^7.0.0" - "@svgr/core" "^4.1.0" - "@svgr/plugin-jsx" "^4.1.0" - "@svgr/plugin-svgo" "^4.0.3" - "loader-utils" "^1.1.0" - -"@testing-library/dom@*", "@testing-library/dom@>=5": - "integrity" "sha512-kmW9alndr19qd6DABzQ978zKQ+J65gU2Rzkl8hriIetPnwpesRaK4//jEQyYh8fEALmGhomD/LBQqt+o+DL95Q==" - "resolved" "https://registry.npmjs.org/@testing-library/dom/-/dom-8.1.0.tgz" - "version" "8.1.0" - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - "aria-query" "^4.2.2" - "chalk" "^4.1.0" - "dom-accessibility-api" "^0.5.6" - "lz-string" "^1.4.4" - "pretty-format" "^27.0.2" - -"@testing-library/dom@^6.15.0": - "integrity" "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==" - "resolved" "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz" - "version" "6.16.0" - dependencies: - "@babel/runtime" "^7.8.4" - "@sheerun/mutationobserver-shim" "^0.3.2" - "@types/testing-library__dom" "^6.12.1" - "aria-query" "^4.0.2" - "dom-accessibility-api" "^0.3.0" - "pretty-format" "^25.1.0" - "wait-for-expect" "^3.0.2" - -"@testing-library/jest-dom@^4.2.4": - "integrity" "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==" - "resolved" "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz" - "version" "4.2.4" - dependencies: - "@babel/runtime" "^7.5.1" - "chalk" "^2.4.1" - "css" "^2.2.3" - "css.escape" "^1.5.1" - "jest-diff" "^24.0.0" - "jest-matcher-utils" "^24.0.0" - "lodash" "^4.17.11" - "pretty-format" "^24.0.0" - "redent" "^3.0.0" - -"@testing-library/react@^9.3.2": - "integrity" "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==" - "resolved" "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz" - "version" "9.5.0" - dependencies: - "@babel/runtime" "^7.8.4" - "@testing-library/dom" "^6.15.0" - "@types/testing-library__react" "^9.1.2" - -"@testing-library/user-event@^7.1.2": - "integrity" "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" - "resolved" "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz" - "version" "7.2.1" - -"@types/aria-query@^4.2.0": - "integrity" "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" - "resolved" "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" - "version" "4.2.2" - -"@types/d3-array@^3.0.1": - "integrity" "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==" - "resolved" "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz" - "version" "3.0.1" - -"@types/d3-path@*": - "integrity" "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" - "resolved" "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz" - "version" "3.0.0" - -"@types/d3-scale@^4.0.1": - "integrity" "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==" - "resolved" "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "@types/d3-time" "*" - -"@types/d3-shape@^3.0.1": - "integrity" "sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw==" - "resolved" "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "@types/d3-path" "*" - -"@types/d3-time@*": - "integrity" "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - "resolved" "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz" - "version" "3.0.0" - -"@types/hoist-non-react-statics@^3.3.0": - "integrity" "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==" - "resolved" "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" - "version" "3.3.1" - dependencies: - "@types/react" "*" - "hoist-non-react-statics" "^3.3.0" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - "integrity" "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz" - "version" "2.0.3" - -"@types/istanbul-lib-report@*": - "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - "integrity" "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==" - "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/istanbul-reports@^3.0.0": - "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" - "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/node@*": - "integrity" "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz" - "version" "16.6.1" - -"@types/prop-types@*": - "integrity" "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" - "version" "15.7.4" - -"@types/q@^1.5.1": - "integrity" "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - "resolved" "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" - "version" "1.5.5" - -"@types/raf@^3.4.0": - "integrity" "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==" - "resolved" "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz" - "version" "3.4.0" - -"@types/react-dom@*", "@types/react-dom@^17.0.9": - "integrity" "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==" - "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz" - "version" "17.0.9" - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.16": - "integrity" "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==" - "resolved" "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz" - "version" "7.1.18" - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - "hoist-non-react-statics" "^3.3.0" - "redux" "^4.0.0" - -"@types/react@*", "@types/react@^17.0.14": - "integrity" "sha512-YTLgu7oS5zvSqq49X5Iue5oAbVGhgPc5Au29SJC4VeE17V6gASoOxVkUDy9pXFMRFxCWCD9fLeweNFizo3UzOg==" - "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.18.tgz" - "version" "17.0.18" - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - "csstype" "^3.0.2" - -"@types/scheduler@*": - "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - "version" "0.16.2" - -"@types/tapable@1.0.2": - "integrity" "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==" - "resolved" "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz" - "version" "1.0.2" - -"@types/testing-library__dom@*": - "integrity" "sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g==" - "resolved" "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz" - "version" "7.5.0" - dependencies: - "@testing-library/dom" "*" - -"@types/testing-library__dom@^6.12.1": - "integrity" "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==" - "resolved" "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz" - "version" "6.14.0" - dependencies: - "pretty-format" "^24.3.0" - -"@types/testing-library__react@^9.1.2": - "integrity" "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==" - "resolved" "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz" - "version" "9.1.3" - dependencies: - "@types/react-dom" "*" - "@types/testing-library__dom" "*" - "pretty-format" "^25.1.0" - -"@types/yargs-parser@*": - "integrity" "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" - "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" - "version" "20.2.1" - -"@types/yargs@^13.0.0": - "integrity" "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==" - "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz" - "version" "13.0.12" - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^15.0.0": - "integrity" "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==" - "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz" - "version" "15.0.14" - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^16.0.0": - "integrity" "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==" - "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" - "version" "16.0.4" - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.7.11": - "integrity" "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - -"@webassemblyjs/floating-point-hex-parser@1.7.11": - "integrity" "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-api-error@1.7.11": - "integrity" "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-buffer@1.7.11": - "integrity" "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-code-frame@1.7.11": - "integrity" "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/helper-fsm@1.7.11": - "integrity" "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-module-context@1.7.11": - "integrity" "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - "integrity" "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/helper-wasm-section@1.7.11": - "integrity" "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - -"@webassemblyjs/ieee754@1.7.11": - "integrity" "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.7.11": - "integrity" "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@xtuc/long" "4.2.1" - -"@webassemblyjs/utf8@1.7.11": - "integrity" "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz" - "version" "1.7.11" - -"@webassemblyjs/wasm-edit@1.7.11": - "integrity" "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/wasm-gen@1.7.11": - "integrity" "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wasm-opt@1.7.11": - "integrity" "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - -"@webassemblyjs/wasm-parser@1.7.11": - "integrity" "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wast-parser@1.7.11": - "integrity" "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" - -"@webassemblyjs/wast-printer@1.7.11": - "integrity" "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==" - "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz" - "version" "1.7.11" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" - -"@xtuc/ieee754@^1.2.0": - "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - "resolved" "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - "version" "1.2.0" - -"@xtuc/long@4.2.1": - "integrity" "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==" - "resolved" "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz" - "version" "4.2.1" - -"abab@^2.0.0": - "integrity" "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - "resolved" "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" - "version" "2.0.5" - -"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.7": - "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" - "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - "version" "1.3.7" - dependencies: - "mime-types" "~2.1.24" - "negotiator" "0.6.2" - -"acorn-dynamic-import@^3.0.0": - "integrity" "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==" - "resolved" "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "acorn" "^5.0.0" - -"acorn-globals@^4.1.0": - "integrity" "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==" - "resolved" "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz" - "version" "4.3.4" - dependencies: - "acorn" "^6.0.1" - "acorn-walk" "^6.0.1" - -"acorn-jsx@^5.0.0": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" - -"acorn-walk@^6.0.1": - "integrity" "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz" - "version" "6.2.0" - -"acorn@^5.0.0": - "integrity" "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz" - "version" "5.7.4" - -"acorn@^5.5.3": - "integrity" "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz" - "version" "5.7.4" - -"acorn@^5.6.2": - "integrity" "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz" - "version" "5.7.4" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^6.0.1", "acorn@^6.0.7": - "integrity" "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" - "version" "6.4.2" - -"address@^1.0.1", "address@1.0.3": - "integrity" "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" - "resolved" "https://registry.npmjs.org/address/-/address-1.0.3.tgz" - "version" "1.0.3" - -"ajv-errors@^1.0.0": - "integrity" "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - "resolved" "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" - "version" "1.0.1" - -"ajv-keywords@^3.1.0": - "integrity" "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - "resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - "version" "3.5.2" - -"ajv@^6.1.0", "ajv@^6.10.2", "ajv@^6.12.3", "ajv@^6.5.3", "ajv@^6.9.1", "ajv@>=5.0.0": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" - dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" - -"alphanum-sort@^1.0.0": - "integrity" "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - "resolved" "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" - "version" "1.0.2" - -"ansi-colors@^3.0.0": - "integrity" "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz" - "version" "3.2.4" - -"ansi-escapes@^3.0.0", "ansi-escapes@^3.2.0": - "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" - "version" "3.2.0" - -"ansi-html@0.0.7": - "integrity" "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - "resolved" "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz" - "version" "0.0.7" - -"ansi-regex@^2.0.0": - "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - "version" "2.1.1" - -"ansi-regex@^3.0.0": - "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - "version" "3.0.0" - -"ansi-regex@^4.0.0": - "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" - "version" "4.1.0" - -"ansi-regex@^4.1.0": - "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" - "version" "4.1.0" - -"ansi-regex@^5.0.0": - "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" - "version" "5.0.0" - -"ansi-styles@^2.2.1": - "integrity" "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - "version" "2.2.1" - -"ansi-styles@^3.2.0", "ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"ansi-styles@^5.0.0": - "integrity" "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - "version" "5.2.0" - -"anymatch@^2.0.0": - "integrity" "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "micromatch" "^3.1.4" - "normalize-path" "^2.1.1" - -"anymatch@~3.1.2": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"append-transform@^0.4.0": - "integrity" "sha1-126/jKlNJ24keja61EpLdKthGZE=" - "resolved" "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz" - "version" "0.4.0" - dependencies: - "default-require-extensions" "^1.0.0" - -"aproba@^1.1.1": - "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" - "version" "1.2.0" - -"argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "sprintf-js" "~1.0.2" - -"aria-query@^3.0.0": - "integrity" "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=" - "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "ast-types-flow" "0.0.7" - "commander" "^2.11.0" - -"aria-query@^4.0.2", "aria-query@^4.2.2": - "integrity" "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==" - "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" - "version" "4.2.2" - dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -"arr-diff@^2.0.0": - "integrity" "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=" - "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "arr-flatten" "^1.0.1" - -"arr-diff@^4.0.0": - "integrity" "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" - "version" "4.0.0" - -"arr-flatten@^1.0.1", "arr-flatten@^1.1.0": - "integrity" "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - "resolved" "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - "version" "1.1.0" - -"arr-union@^3.1.0": - "integrity" "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - "resolved" "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" - "version" "3.1.0" - -"array-equal@^1.0.0": - "integrity" "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - "resolved" "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz" - "version" "1.0.0" - -"array-filter@~0.0.0": - "integrity" "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - "resolved" "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz" - "version" "0.0.1" - -"array-flatten@^2.1.0": - "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - "version" "2.1.2" - -"array-flatten@1.1.1": - "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - "version" "1.1.1" - -"array-includes@^3.0.3", "array-includes@^3.1.1": - "integrity" "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==" - "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "es-abstract" "^1.18.0-next.2" - "get-intrinsic" "^1.1.1" - "is-string" "^1.0.5" - -"array-map@~0.0.0": - "integrity" "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - "resolved" "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz" - "version" "0.0.0" - -"array-reduce@~0.0.0": - "integrity" "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - "resolved" "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz" - "version" "0.0.0" - -"array-union@^1.0.1": - "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "array-uniq" "^1.0.1" - -"array-uniq@^1.0.1": - "integrity" "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - "version" "1.0.3" - -"array-unique@^0.2.1": - "integrity" "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" - "version" "0.2.1" - -"array-unique@^0.3.2": - "integrity" "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" - "version" "0.3.2" - -"arrify@^1.0.1": - "integrity" "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - "resolved" "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - "version" "1.0.1" - -"asap@~2.0.6": - "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - "version" "2.0.6" - -"asn1.js@^5.2.0": - "integrity" "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==" - "resolved" "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - "version" "5.4.1" - dependencies: - "bn.js" "^4.0.0" - "inherits" "^2.0.1" - "minimalistic-assert" "^1.0.0" - "safer-buffer" "^2.1.0" - -"asn1@~0.2.3": - "integrity" "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==" - "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" - "version" "0.2.4" - dependencies: - "safer-buffer" "~2.1.0" - -"assert-plus@^1.0.0", "assert-plus@1.0.0": - "integrity" "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - "version" "1.0.0" - -"assert@^1.1.1": - "integrity" "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==" - "resolved" "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" - "version" "1.5.0" - dependencies: - "object-assign" "^4.1.1" - "util" "0.10.3" - -"assign-symbols@^1.0.0": - "integrity" "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - "resolved" "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" - "version" "1.0.0" - -"ast-types-flow@^0.0.7", "ast-types-flow@0.0.7": - "integrity" "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - "resolved" "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - "version" "0.0.7" - -"astral-regex@^1.0.0": - "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" - "version" "1.0.0" - -"async-each@^1.0.1": - "integrity" "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - "resolved" "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" - "version" "1.0.3" - -"async-limiter@~1.0.0": - "integrity" "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - "resolved" "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" - "version" "1.0.1" - -"async@^2.1.4", "async@^2.6.2": - "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==" - "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz" - "version" "2.6.3" - dependencies: - "lodash" "^4.17.14" - -"asynckit@^0.4.0": - "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" - -"atob@^2.1.2": - "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" - "version" "2.1.2" - -"autoprefixer@^9.4.2": - "integrity" "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==" - "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz" - "version" "9.8.6" - dependencies: - "browserslist" "^4.12.0" - "caniuse-lite" "^1.0.30001109" - "colorette" "^1.2.1" - "normalize-range" "^0.1.2" - "num2fraction" "^1.2.2" - "postcss" "^7.0.32" - "postcss-value-parser" "^4.1.0" - -"aws-sign2@~0.7.0": - "integrity" "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - "version" "0.7.0" - -"aws4@^1.8.0": - "integrity" "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" - "version" "1.11.0" - -"axobject-query@^2.0.1": - "integrity" "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" - "version" "2.2.0" - -"babel-code-frame@^6.22.0", "babel-code-frame@^6.26.0": - "integrity" "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=" - "resolved" "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "chalk" "^1.1.3" - "esutils" "^2.0.2" - "js-tokens" "^3.0.2" - -"babel-core@^6.0.0 || ^7.0.0-0", "babel-core@7.0.0-bridge.0": - "integrity" "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" - "resolved" "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" - "version" "7.0.0-bridge.0" - -"babel-core@^6.0.0": - "integrity" "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==" - "resolved" "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" - "version" "6.26.3" - dependencies: - "babel-code-frame" "^6.26.0" - "babel-generator" "^6.26.0" - "babel-helpers" "^6.24.1" - "babel-messages" "^6.23.0" - "babel-register" "^6.26.0" - "babel-runtime" "^6.26.0" - "babel-template" "^6.26.0" - "babel-traverse" "^6.26.0" - "babel-types" "^6.26.0" - "babylon" "^6.18.0" - "convert-source-map" "^1.5.1" - "debug" "^2.6.9" - "json5" "^0.5.1" - "lodash" "^4.17.4" - "minimatch" "^3.0.4" - "path-is-absolute" "^1.0.1" - "private" "^0.1.8" - "slash" "^1.0.0" - "source-map" "^0.5.7" - -"babel-core@^6.26.0": - "integrity" "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==" - "resolved" "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" - "version" "6.26.3" - dependencies: - "babel-code-frame" "^6.26.0" - "babel-generator" "^6.26.0" - "babel-helpers" "^6.24.1" - "babel-messages" "^6.23.0" - "babel-register" "^6.26.0" - "babel-runtime" "^6.26.0" - "babel-template" "^6.26.0" - "babel-traverse" "^6.26.0" - "babel-types" "^6.26.0" - "babylon" "^6.18.0" - "convert-source-map" "^1.5.1" - "debug" "^2.6.9" - "json5" "^0.5.1" - "lodash" "^4.17.4" - "minimatch" "^3.0.4" - "path-is-absolute" "^1.0.1" - "private" "^0.1.8" - "slash" "^1.0.0" - "source-map" "^0.5.7" - -"babel-eslint@9.0.0", "babel-eslint@9.x": - "integrity" "sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==" - "resolved" "https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz" - "version" "9.0.0" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - "eslint-scope" "3.7.1" - "eslint-visitor-keys" "^1.0.0" - -"babel-extract-comments@^1.0.0": - "integrity" "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==" - "resolved" "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "babylon" "^6.18.0" - -"babel-generator@^6.18.0", "babel-generator@^6.26.0": - "integrity" "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==" - "resolved" "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" - "version" "6.26.1" - dependencies: - "babel-messages" "^6.23.0" - "babel-runtime" "^6.26.0" - "babel-types" "^6.26.0" - "detect-indent" "^4.0.0" - "jsesc" "^1.3.0" - "lodash" "^4.17.4" - "source-map" "^0.5.7" - "trim-right" "^1.0.1" - -"babel-helpers@^6.24.1": - "integrity" "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" - "resolved" "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" - "version" "6.24.1" - dependencies: - "babel-runtime" "^6.22.0" - "babel-template" "^6.24.1" - -"babel-jest@^23.6.0", "babel-jest@23.6.0": - "integrity" "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==" - "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "babel-plugin-istanbul" "^4.1.6" - "babel-preset-jest" "^23.2.0" - -"babel-loader@8.0.5": - "integrity" "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==" - "resolved" "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz" - "version" "8.0.5" - dependencies: - "find-cache-dir" "^2.0.0" - "loader-utils" "^1.0.2" - "mkdirp" "^0.5.1" - "util.promisify" "^1.0.0" - -"babel-messages@^6.23.0": - "integrity" "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" - "resolved" "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" - "version" "6.23.0" - dependencies: - "babel-runtime" "^6.22.0" - -"babel-plugin-dynamic-import-node@^2.3.3": - "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - "version" "2.3.3" - dependencies: - "object.assign" "^4.1.0" - -"babel-plugin-dynamic-import-node@2.2.0": - "integrity" "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==" - "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz" - "version" "2.2.0" - dependencies: - "object.assign" "^4.1.0" - -"babel-plugin-istanbul@^4.1.6": - "integrity" "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz" - "version" "4.1.6" - dependencies: - "babel-plugin-syntax-object-rest-spread" "^6.13.0" - "find-up" "^2.1.0" - "istanbul-lib-instrument" "^1.10.1" - "test-exclude" "^4.2.1" - -"babel-plugin-jest-hoist@^23.2.0": - "integrity" "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" - "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz" - "version" "23.2.0" - -"babel-plugin-macros@2.5.0": - "integrity" "sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw==" - "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "cosmiconfig" "^5.0.5" - "resolve" "^1.8.1" - -"babel-plugin-named-asset-import@^0.3.1": - "integrity" "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" - "resolved" "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz" - "version" "0.3.7" - -"babel-plugin-polyfill-corejs2@^0.2.2": - "integrity" "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" - "semver" "^6.1.1" - -"babel-plugin-polyfill-corejs3@^0.2.2": - "integrity" "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz" - "version" "0.2.4" - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - "core-js-compat" "^3.14.0" - -"babel-plugin-polyfill-regenerator@^0.2.2": - "integrity" "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - -"babel-plugin-syntax-object-rest-spread@^6.13.0", "babel-plugin-syntax-object-rest-spread@^6.8.0": - "integrity" "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - "resolved" "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" - "version" "6.13.0" - -"babel-plugin-transform-object-rest-spread@^6.26.0": - "integrity" "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=" - "resolved" "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "babel-plugin-syntax-object-rest-spread" "^6.8.0" - "babel-runtime" "^6.26.0" - -"babel-plugin-transform-react-remove-prop-types@0.4.24": - "integrity" "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - "resolved" "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" - "version" "0.4.24" - -"babel-preset-jest@^23.2.0": - "integrity" "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=" - "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz" - "version" "23.2.0" - dependencies: - "babel-plugin-jest-hoist" "^23.2.0" - "babel-plugin-syntax-object-rest-spread" "^6.13.0" - -"babel-preset-react-app@^7.0.2": - "integrity" "sha512-mwCk/u2wuiO8qQqblN5PlDa44taY0acq7hw6W+a70W522P7a9mIcdggL1fe5/LgAT7tqCq46q9wwhqaMoYKslQ==" - "resolved" "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-7.0.2.tgz" - "version" "7.0.2" - dependencies: - "@babel/core" "7.2.2" - "@babel/plugin-proposal-class-properties" "7.3.0" - "@babel/plugin-proposal-decorators" "7.3.0" - "@babel/plugin-proposal-object-rest-spread" "7.3.2" - "@babel/plugin-syntax-dynamic-import" "7.2.0" - "@babel/plugin-transform-classes" "7.2.2" - "@babel/plugin-transform-destructuring" "7.3.2" - "@babel/plugin-transform-flow-strip-types" "7.2.3" - "@babel/plugin-transform-react-constant-elements" "7.2.0" - "@babel/plugin-transform-react-display-name" "7.2.0" - "@babel/plugin-transform-runtime" "7.2.0" - "@babel/preset-env" "7.3.1" - "@babel/preset-react" "7.0.0" - "@babel/preset-typescript" "7.1.0" - "@babel/runtime" "7.3.1" - "babel-loader" "8.0.5" - "babel-plugin-dynamic-import-node" "2.2.0" - "babel-plugin-macros" "2.5.0" - "babel-plugin-transform-react-remove-prop-types" "0.4.24" - -"babel-register@^6.26.0": - "integrity" "sha1-btAhFz4vy0htestFxgCahW9kcHE=" - "resolved" "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "babel-core" "^6.26.0" - "babel-runtime" "^6.26.0" - "core-js" "^2.5.0" - "home-or-tmp" "^2.0.0" - "lodash" "^4.17.4" - "mkdirp" "^0.5.1" - "source-map-support" "^0.4.15" - -"babel-runtime@^6.22.0", "babel-runtime@^6.26.0": - "integrity" "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" - "resolved" "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "core-js" "^2.4.0" - "regenerator-runtime" "^0.11.0" - -"babel-template@^6.16.0", "babel-template@^6.24.1", "babel-template@^6.26.0": - "integrity" "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=" - "resolved" "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "babel-runtime" "^6.26.0" - "babel-traverse" "^6.26.0" - "babel-types" "^6.26.0" - "babylon" "^6.18.0" - "lodash" "^4.17.4" - -"babel-traverse@^6.0.0", "babel-traverse@^6.18.0", "babel-traverse@^6.26.0": - "integrity" "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=" - "resolved" "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "babel-code-frame" "^6.26.0" - "babel-messages" "^6.23.0" - "babel-runtime" "^6.26.0" - "babel-types" "^6.26.0" - "babylon" "^6.18.0" - "debug" "^2.6.8" - "globals" "^9.18.0" - "invariant" "^2.2.2" - "lodash" "^4.17.4" - -"babel-types@^6.0.0", "babel-types@^6.18.0", "babel-types@^6.26.0": - "integrity" "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" - "resolved" "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "babel-runtime" "^6.26.0" - "esutils" "^2.0.2" - "lodash" "^4.17.4" - "to-fast-properties" "^1.0.3" - -"babylon@^6.18.0": - "integrity" "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - "resolved" "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" - "version" "6.18.0" - -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" - -"base@^0.11.1": - "integrity" "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==" - "resolved" "https://registry.npmjs.org/base/-/base-0.11.2.tgz" - "version" "0.11.2" - dependencies: - "cache-base" "^1.0.1" - "class-utils" "^0.3.5" - "component-emitter" "^1.2.1" - "define-property" "^1.0.0" - "isobject" "^3.0.1" - "mixin-deep" "^1.2.0" - "pascalcase" "^0.1.1" - -"base64-js@^1.0.2": - "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - "version" "1.5.1" - -"batch@0.6.1": - "integrity" "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - "resolved" "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - "version" "0.6.1" - -"bcrypt-pbkdf@^1.0.0": - "integrity" "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=" - "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "tweetnacl" "^0.14.3" - -"bfj@6.1.1": - "integrity" "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==" - "resolved" "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz" - "version" "6.1.1" - dependencies: - "bluebird" "^3.5.1" - "check-types" "^7.3.0" - "hoopy" "^0.1.2" - "tryer" "^1.0.0" - -"big.js@^5.2.2": - "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - "resolved" "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - "version" "5.2.2" - -"binary-extensions@^1.0.0": - "integrity" "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" - "version" "1.13.1" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"bluebird@^3.5.1", "bluebird@^3.5.5": - "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - "version" "3.7.2" - -"bn.js@^4.0.0": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^4.1.0": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^4.11.9": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^5.0.0", "bn.js@^5.1.1": - "integrity" "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" - "version" "5.2.0" - -"body-parser@1.19.0": - "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==" - "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" - "version" "1.19.0" - dependencies: - "bytes" "3.1.0" - "content-type" "~1.0.4" - "debug" "2.6.9" - "depd" "~1.1.2" - "http-errors" "1.7.2" - "iconv-lite" "0.4.24" - "on-finished" "~2.3.0" - "qs" "6.7.0" - "raw-body" "2.4.0" - "type-is" "~1.6.17" - -"bonjour@^3.5.0": - "integrity" "sha1-jokKGD2O6aI5OzhExpGkK897yfU=" - "resolved" "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" - "version" "3.5.0" - dependencies: - "array-flatten" "^2.1.0" - "deep-equal" "^1.0.1" - "dns-equal" "^1.0.0" - "dns-txt" "^2.0.2" - "multicast-dns" "^6.0.1" - "multicast-dns-service-types" "^1.1.0" - -"boolbase@^1.0.0", "boolbase@~1.0.0": - "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - "version" "1.0.0" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"braces@^1.8.2": - "integrity" "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=" - "resolved" "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz" - "version" "1.8.5" - dependencies: - "expand-range" "^1.8.1" - "preserve" "^0.2.0" - "repeat-element" "^1.1.2" - -"braces@^2.3.1": - "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==" - "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" - "version" "2.3.2" - dependencies: - "arr-flatten" "^1.1.0" - "array-unique" "^0.3.2" - "extend-shallow" "^2.0.1" - "fill-range" "^4.0.0" - "isobject" "^3.0.1" - "repeat-element" "^1.1.2" - "snapdragon" "^0.8.1" - "snapdragon-node" "^2.0.1" - "split-string" "^3.0.2" - "to-regex" "^3.0.1" - -"braces@^2.3.2": - "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==" - "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" - "version" "2.3.2" - dependencies: - "arr-flatten" "^1.1.0" - "array-unique" "^0.3.2" - "extend-shallow" "^2.0.1" - "fill-range" "^4.0.0" - "isobject" "^3.0.1" - "repeat-element" "^1.1.2" - "snapdragon" "^0.8.1" - "snapdragon-node" "^2.0.1" - "split-string" "^3.0.2" - "to-regex" "^3.0.1" - -"braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"brorand@^1.0.1", "brorand@^1.1.0": - "integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - "version" "1.1.0" - -"browser-process-hrtime@^1.0.0": - "integrity" "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - "resolved" "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" - "version" "1.0.0" - -"browser-resolve@^1.11.3": - "integrity" "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==" - "resolved" "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz" - "version" "1.11.3" - dependencies: - "resolve" "1.1.7" - -"browserify-aes@^1.0.0", "browserify-aes@^1.0.4": - "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==" - "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "buffer-xor" "^1.0.3" - "cipher-base" "^1.0.0" - "create-hash" "^1.1.0" - "evp_bytestokey" "^1.0.3" - "inherits" "^2.0.1" - "safe-buffer" "^5.0.1" - -"browserify-cipher@^1.0.0": - "integrity" "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==" - "resolved" "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "browserify-aes" "^1.0.4" - "browserify-des" "^1.0.0" - "evp_bytestokey" "^1.0.0" - -"browserify-des@^1.0.0": - "integrity" "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==" - "resolved" "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "cipher-base" "^1.0.1" - "des.js" "^1.0.0" - "inherits" "^2.0.1" - "safe-buffer" "^5.1.2" - -"browserify-rsa@^4.0.0", "browserify-rsa@^4.0.1": - "integrity" "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==" - "resolved" "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "bn.js" "^5.0.0" - "randombytes" "^2.0.1" - -"browserify-sign@^4.0.0": - "integrity" "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==" - "resolved" "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - "version" "4.2.1" - dependencies: - "bn.js" "^5.1.1" - "browserify-rsa" "^4.0.1" - "create-hash" "^1.2.0" - "create-hmac" "^1.1.7" - "elliptic" "^6.5.3" - "inherits" "^2.0.4" - "parse-asn1" "^5.1.5" - "readable-stream" "^3.6.0" - "safe-buffer" "^5.2.0" - -"browserify-zlib@^0.2.0": - "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==" - "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" - "version" "0.2.0" - dependencies: - "pako" "~1.0.5" - -"browserslist@^4.0.0", "browserslist@^4.12.0", "browserslist@^4.16.6", "browserslist@^4.16.7", "browserslist@^4.3.4", "browserslist@^4.3.5": - "integrity" "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz" - "version" "4.16.7" - dependencies: - "caniuse-lite" "^1.0.30001248" - "colorette" "^1.2.2" - "electron-to-chromium" "^1.3.793" - "escalade" "^3.1.1" - "node-releases" "^1.1.73" - -"browserslist@4.4.1": - "integrity" "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "caniuse-lite" "^1.0.30000929" - "electron-to-chromium" "^1.3.103" - "node-releases" "^1.1.3" - -"bser@2.1.1": - "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" - "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "node-int64" "^0.4.0" - -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" - -"buffer-indexof@^1.0.0": - "integrity" "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - "resolved" "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" - "version" "1.1.1" - -"buffer-xor@^1.0.3": - "integrity" "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - "version" "1.0.3" - -"buffer@^4.3.0": - "integrity" "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==" - "resolved" "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - "version" "4.9.2" - dependencies: - "base64-js" "^1.0.2" - "ieee754" "^1.1.4" - "isarray" "^1.0.0" - -"builtin-status-codes@^3.0.0": - "integrity" "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - "resolved" "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" - "version" "3.0.0" - -"bytes@3.0.0": - "integrity" "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - "version" "3.0.0" - -"bytes@3.1.0": - "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" - "version" "3.1.0" - -"cacache@^11.0.2": - "integrity" "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==" - "resolved" "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz" - "version" "11.3.3" - dependencies: - "bluebird" "^3.5.5" - "chownr" "^1.1.1" - "figgy-pudding" "^3.5.1" - "glob" "^7.1.4" - "graceful-fs" "^4.1.15" - "lru-cache" "^5.1.1" - "mississippi" "^3.0.0" - "mkdirp" "^0.5.1" - "move-concurrently" "^1.0.1" - "promise-inflight" "^1.0.1" - "rimraf" "^2.6.3" - "ssri" "^6.0.1" - "unique-filename" "^1.1.1" - "y18n" "^4.0.0" - -"cache-base@^1.0.1": - "integrity" "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==" - "resolved" "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "collection-visit" "^1.0.0" - "component-emitter" "^1.2.1" - "get-value" "^2.0.6" - "has-value" "^1.0.0" - "isobject" "^3.0.1" - "set-value" "^2.0.0" - "to-object-path" "^0.3.0" - "union-value" "^1.0.0" - "unset-value" "^1.0.0" - -"call-bind@^1.0.0", "call-bind@^1.0.2": - "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" - "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "function-bind" "^1.1.1" - "get-intrinsic" "^1.0.2" - -"call-me-maybe@^1.0.1": - "integrity" "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - "resolved" "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz" - "version" "1.0.1" - -"caller-callsite@^2.0.0": - "integrity" "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=" - "resolved" "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "callsites" "^2.0.0" - -"caller-path@^2.0.0": - "integrity" "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=" - "resolved" "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "caller-callsite" "^2.0.0" - -"callsites@^2.0.0": - "integrity" "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" - "version" "2.0.0" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camel-case@3.0.x": - "integrity" "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=" - "resolved" "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "no-case" "^2.2.0" - "upper-case" "^1.1.1" - -"camelcase@^4.1.0": - "integrity" "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - "version" "4.1.0" - -"camelcase@^5.3.1": - "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - "version" "5.3.1" - -"caniuse-api@^3.0.0": - "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==" - "resolved" "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "browserslist" "^4.0.0" - "caniuse-lite" "^1.0.0" - "lodash.memoize" "^4.1.2" - "lodash.uniq" "^4.5.0" - -"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30000918", "caniuse-lite@^1.0.30000929", "caniuse-lite@^1.0.30001109", "caniuse-lite@^1.0.30001248": - "integrity" "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz" - "version" "1.0.30001251" - -"capture-exit@^1.2.0": - "integrity" "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=" - "resolved" "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "rsvp" "^3.3.3" - -"case-sensitive-paths-webpack-plugin@2.2.0": - "integrity" "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" - "resolved" "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz" - "version" "2.2.0" - -"caseless@~0.12.0": - "integrity" "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - "version" "0.12.0" - -"chalk@^1.1.3": - "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "ansi-styles" "^2.2.1" - "escape-string-regexp" "^1.0.2" - "has-ansi" "^2.0.0" - "strip-ansi" "^3.0.0" - "supports-color" "^2.0.0" - -"chalk@^2.0.0", "chalk@2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^2.0.1": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^2.1.0": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^2.4.1": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^3.0.0": - "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chalk@^4.0.0", "chalk@^4.1.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chardet@^0.7.0": - "integrity" "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - "resolved" "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - "version" "0.7.0" - -"check-types@^7.3.0": - "integrity" "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" - "resolved" "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz" - "version" "7.4.0" - -"chokidar@^2.0.0", "chokidar@^2.0.4", "chokidar@^2.1.8": - "integrity" "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" - "version" "2.1.8" - dependencies: - "anymatch" "^2.0.0" - "async-each" "^1.0.1" - "braces" "^2.3.2" - "glob-parent" "^3.1.0" - "inherits" "^2.0.3" - "is-binary-path" "^1.0.0" - "is-glob" "^4.0.0" - "normalize-path" "^3.0.0" - "path-is-absolute" "^1.0.0" - "readdirp" "^2.2.1" - "upath" "^1.1.1" - optionalDependencies: - "fsevents" "^1.2.7" - -"chokidar@^3.4.1": - "integrity" "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" - "version" "3.5.2" - dependencies: - "anymatch" "~3.1.2" - "braces" "~3.0.2" - "glob-parent" "~5.1.2" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.6.0" - optionalDependencies: - "fsevents" "~2.3.2" - -"chownr@^1.1.1": - "integrity" "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - "resolved" "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - "version" "1.1.4" - -"chrome-trace-event@^1.0.0": - "integrity" "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - "resolved" "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - "version" "1.0.3" - -"ci-info@^1.5.0": - "integrity" "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz" - "version" "1.6.0" - -"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3": - "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==" - "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "inherits" "^2.0.1" - "safe-buffer" "^5.0.1" - -"circular-json@^0.3.1": - "integrity" "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - "resolved" "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz" - "version" "0.3.3" - -"class-utils@^0.3.5": - "integrity" "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==" - "resolved" "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" - "version" "0.3.6" - dependencies: - "arr-union" "^3.1.0" - "define-property" "^0.2.5" - "isobject" "^3.0.0" - "static-extend" "^0.1.1" - -"clean-css@4.2.x": - "integrity" "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==" - "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "source-map" "~0.6.0" - -"cli-cursor@^2.1.0": - "integrity" "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=" - "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "restore-cursor" "^2.0.0" - -"cli-width@^2.0.0": - "integrity" "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" - "version" "2.2.1" - -"cliui@^4.0.0": - "integrity" "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "string-width" "^2.1.1" - "strip-ansi" "^4.0.0" - "wrap-ansi" "^2.0.0" - -"clone-deep@^0.2.4": - "integrity" "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=" - "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz" - "version" "0.2.4" - dependencies: - "for-own" "^0.1.3" - "is-plain-object" "^2.0.1" - "kind-of" "^3.0.2" - "lazy-cache" "^1.0.3" - "shallow-clone" "^0.1.2" - -"clone-deep@^2.0.1": - "integrity" "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==" - "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "for-own" "^1.0.0" - "is-plain-object" "^2.0.4" - "kind-of" "^6.0.0" - "shallow-clone" "^1.0.0" - -"co@^4.6.0": - "integrity" "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - "version" "4.6.0" - -"coa@^2.0.2": - "integrity" "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==" - "resolved" "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "@types/q" "^1.5.1" - "chalk" "^2.4.1" - "q" "^1.1.2" - -"code-point-at@^1.0.0": - "integrity" "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" - "version" "1.1.0" - -"collection-visit@^1.0.0": - "integrity" "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=" - "resolved" "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "map-visit" "^1.0.0" - "object-visit" "^1.0.0" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^1.9.3": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@^1.0.0", "color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"color-string@^1.6.0": - "integrity" "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==" - "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz" - "version" "1.6.0" - dependencies: - "color-name" "^1.0.0" - "simple-swizzle" "^0.2.2" - -"color@^3.0.0": - "integrity" "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==" - "resolved" "https://registry.npmjs.org/color/-/color-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.3" - "color-string" "^1.6.0" - -"colorette@^1.2.1", "colorette@^1.2.2": - "integrity" "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" - "resolved" "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz" - "version" "1.3.0" - -"combined-stream@^1.0.6", "combined-stream@~1.0.6": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"commander@^2.11.0", "commander@2.17.x": - "integrity" "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz" - "version" "2.17.1" - -"commander@^2.19.0": - "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - "version" "2.20.3" - -"commander@~2.19.0": - "integrity" "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz" - "version" "2.19.0" - -"common-tags@^1.4.0": - "integrity" "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - "resolved" "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz" - "version" "1.8.0" - -"commondir@^1.0.1": - "integrity" "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - "resolved" "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - "version" "1.0.1" - -"component-emitter@^1.2.1", "component-emitter@^1.3.0": - "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - "version" "1.3.0" - -"compressible@~2.0.16": - "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==" - "resolved" "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - "version" "2.0.18" - dependencies: - "mime-db" ">= 1.43.0 < 2" - -"compression@^1.5.2": - "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==" - "resolved" "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - "version" "1.7.4" - dependencies: - "accepts" "~1.3.5" - "bytes" "3.0.0" - "compressible" "~2.0.16" - "debug" "2.6.9" - "on-headers" "~1.0.2" - "safe-buffer" "5.1.2" - "vary" "~1.1.2" - -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"concat-stream@^1.5.0": - "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" - "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - "version" "1.6.2" - dependencies: - "buffer-from" "^1.0.0" - "inherits" "^2.0.3" - "readable-stream" "^2.2.2" - "typedarray" "^0.0.6" - -"confusing-browser-globals@^1.0.6": - "integrity" "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" - "resolved" "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz" - "version" "1.0.10" - -"connect-history-api-fallback@^1.3.0": - "integrity" "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - "resolved" "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" - "version" "1.6.0" - -"console-browserify@^1.1.0": - "integrity" "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" - "version" "1.2.0" - -"constants-browserify@^1.0.0": - "integrity" "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - "resolved" "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" - "version" "1.0.0" - -"contains-path@^0.1.0": - "integrity" "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - "resolved" "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" - "version" "0.1.0" - -"content-disposition@0.5.3": - "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" - "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" - "version" "0.5.3" - dependencies: - "safe-buffer" "5.1.2" - -"content-type@~1.0.4": - "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - "version" "1.0.4" - -"convert-source-map@^1.1.0", "convert-source-map@^1.4.0", "convert-source-map@^1.5.1", "convert-source-map@^1.7.0": - "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - "version" "1.8.0" - dependencies: - "safe-buffer" "~5.1.1" - -"cookie-signature@1.0.6": - "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - "version" "1.0.6" - -"cookie@0.4.0": - "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" - "version" "0.4.0" - -"copy-concurrently@^1.0.0": - "integrity" "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==" - "resolved" "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "aproba" "^1.1.1" - "fs-write-stream-atomic" "^1.0.8" - "iferr" "^0.1.5" - "mkdirp" "^0.5.1" - "rimraf" "^2.5.4" - "run-queue" "^1.0.0" - -"copy-descriptor@^0.1.0": - "integrity" "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - "resolved" "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" - "version" "0.1.1" - -"core-js-compat@^3.14.0", "core-js-compat@^3.16.0": - "integrity" "sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==" - "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz" - "version" "3.16.1" - dependencies: - "browserslist" "^4.16.7" - "semver" "7.0.0" - -"core-js-pure@^3.16.0": - "integrity" "sha512-TyofCdMzx0KMhi84mVRS8rL1XsRk2SPUNz2azmth53iRN0/08Uim9fdhQTaZTG1LqaXHYVci4RDHka6WrXfnvg==" - "resolved" "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.1.tgz" - "version" "3.16.1" - -"core-js@^2.4.0", "core-js@^2.5.0": - "integrity" "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - "resolved" "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" - "version" "2.6.12" - -"core-js@2.6.4": - "integrity" "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" - "resolved" "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz" - "version" "2.6.4" - -"core-util-is@~1.0.0", "core-util-is@1.0.2": - "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - "version" "1.0.2" - -"cosmiconfig@^5.0.0", "cosmiconfig@^5.0.5", "cosmiconfig@^5.2.1": - "integrity" "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" - "version" "5.2.1" - dependencies: - "import-fresh" "^2.0.0" - "is-directory" "^0.3.1" - "js-yaml" "^3.13.1" - "parse-json" "^4.0.0" - -"create-ecdh@^4.0.0": - "integrity" "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==" - "resolved" "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - "version" "4.0.4" - dependencies: - "bn.js" "^4.1.0" - "elliptic" "^6.5.3" - -"create-hash@^1.1.0", "create-hash@^1.1.2", "create-hash@^1.2.0": - "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==" - "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "cipher-base" "^1.0.1" - "inherits" "^2.0.1" - "md5.js" "^1.3.4" - "ripemd160" "^2.0.1" - "sha.js" "^2.4.0" - -"create-hmac@^1.1.0", "create-hmac@^1.1.4", "create-hmac@^1.1.7": - "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==" - "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - "version" "1.1.7" - dependencies: - "cipher-base" "^1.0.3" - "create-hash" "^1.1.0" - "inherits" "^2.0.1" - "ripemd160" "^2.0.0" - "safe-buffer" "^5.0.1" - "sha.js" "^2.4.8" - -"crelt@^1.0.5": - "integrity" "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" - "resolved" "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz" - "version" "1.0.5" - -"cross-spawn@^6.0.0", "cross-spawn@^6.0.5", "cross-spawn@6.0.5": - "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" - "version" "6.0.5" - dependencies: - "nice-try" "^1.0.4" - "path-key" "^2.0.1" - "semver" "^5.5.0" - "shebang-command" "^1.2.0" - "which" "^1.2.9" - -"crypto-browserify@^3.11.0": - "integrity" "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==" - "resolved" "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - "version" "3.12.0" - dependencies: - "browserify-cipher" "^1.0.0" - "browserify-sign" "^4.0.0" - "create-ecdh" "^4.0.0" - "create-hash" "^1.1.0" - "create-hmac" "^1.1.0" - "diffie-hellman" "^5.0.0" - "inherits" "^2.0.1" - "pbkdf2" "^3.0.3" - "public-encrypt" "^4.0.0" - "randombytes" "^2.0.0" - "randomfill" "^1.0.3" - -"css-blank-pseudo@^0.1.4": - "integrity" "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==" - "resolved" "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "postcss" "^7.0.5" - -"css-color-names@^0.0.4", "css-color-names@0.0.4": - "integrity" "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - "resolved" "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" - "version" "0.0.4" - -"css-declaration-sorter@^4.0.1": - "integrity" "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==" - "resolved" "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.1" - "timsort" "^0.3.0" - -"css-has-pseudo@^0.10.0": - "integrity" "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==" - "resolved" "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz" - "version" "0.10.0" - dependencies: - "postcss" "^7.0.6" - "postcss-selector-parser" "^5.0.0-rc.4" - -"css-loader@1.0.0": - "integrity" "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==" - "resolved" "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "babel-code-frame" "^6.26.0" - "css-selector-tokenizer" "^0.7.0" - "icss-utils" "^2.1.0" - "loader-utils" "^1.0.2" - "lodash.camelcase" "^4.3.0" - "postcss" "^6.0.23" - "postcss-modules-extract-imports" "^1.2.0" - "postcss-modules-local-by-default" "^1.2.0" - "postcss-modules-scope" "^1.1.0" - "postcss-modules-values" "^1.3.0" - "postcss-value-parser" "^3.3.0" - "source-list-map" "^2.0.0" - -"css-prefers-color-scheme@^3.1.1": - "integrity" "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==" - "resolved" "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "postcss" "^7.0.5" - -"css-select-base-adapter@^0.1.1": - "integrity" "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - "resolved" "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" - "version" "0.1.1" - -"css-select@^2.0.0": - "integrity" "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==" - "resolved" "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "boolbase" "^1.0.0" - "css-what" "^3.2.1" - "domutils" "^1.7.0" - "nth-check" "^1.0.2" - -"css-select@^4.1.3": - "integrity" "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==" - "resolved" "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz" - "version" "4.1.3" - dependencies: - "boolbase" "^1.0.0" - "css-what" "^5.0.0" - "domhandler" "^4.2.0" - "domutils" "^2.6.0" - "nth-check" "^2.0.0" - -"css-selector-tokenizer@^0.7.0": - "integrity" "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==" - "resolved" "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz" - "version" "0.7.3" - dependencies: - "cssesc" "^3.0.0" - "fastparse" "^1.1.2" - -"css-tree@^1.1.2": - "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==" - "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "mdn-data" "2.0.14" - "source-map" "^0.6.1" - -"css-tree@1.0.0-alpha.37": - "integrity" "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==" - "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" - "version" "1.0.0-alpha.37" - dependencies: - "mdn-data" "2.0.4" - "source-map" "^0.6.1" - -"css-what@^3.2.1": - "integrity" "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - "resolved" "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" - "version" "3.4.2" - -"css-what@^5.0.0": - "integrity" "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" - "resolved" "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz" - "version" "5.0.1" - -"css.escape@^1.5.1": - "integrity" "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - "resolved" "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" - "version" "1.5.1" - -"css@^2.2.3": - "integrity" "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==" - "resolved" "https://registry.npmjs.org/css/-/css-2.2.4.tgz" - "version" "2.2.4" - dependencies: - "inherits" "^2.0.3" - "source-map" "^0.6.1" - "source-map-resolve" "^0.5.2" - "urix" "^0.1.0" - -"cssdb@^4.3.0": - "integrity" "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" - "resolved" "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz" - "version" "4.4.0" - -"cssesc@^2.0.0": - "integrity" "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz" - "version" "2.0.0" - -"cssesc@^3.0.0": - "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - "version" "3.0.0" - -"cssnano-preset-default@^4.0.8": - "integrity" "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==" - "resolved" "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz" - "version" "4.0.8" - dependencies: - "css-declaration-sorter" "^4.0.1" - "cssnano-util-raw-cache" "^4.0.1" - "postcss" "^7.0.0" - "postcss-calc" "^7.0.1" - "postcss-colormin" "^4.0.3" - "postcss-convert-values" "^4.0.1" - "postcss-discard-comments" "^4.0.2" - "postcss-discard-duplicates" "^4.0.2" - "postcss-discard-empty" "^4.0.1" - "postcss-discard-overridden" "^4.0.1" - "postcss-merge-longhand" "^4.0.11" - "postcss-merge-rules" "^4.0.3" - "postcss-minify-font-values" "^4.0.2" - "postcss-minify-gradients" "^4.0.2" - "postcss-minify-params" "^4.0.2" - "postcss-minify-selectors" "^4.0.2" - "postcss-normalize-charset" "^4.0.1" - "postcss-normalize-display-values" "^4.0.2" - "postcss-normalize-positions" "^4.0.2" - "postcss-normalize-repeat-style" "^4.0.2" - "postcss-normalize-string" "^4.0.2" - "postcss-normalize-timing-functions" "^4.0.2" - "postcss-normalize-unicode" "^4.0.1" - "postcss-normalize-url" "^4.0.1" - "postcss-normalize-whitespace" "^4.0.2" - "postcss-ordered-values" "^4.1.2" - "postcss-reduce-initial" "^4.0.3" - "postcss-reduce-transforms" "^4.0.2" - "postcss-svgo" "^4.0.3" - "postcss-unique-selectors" "^4.0.1" - -"cssnano-util-get-arguments@^4.0.0": - "integrity" "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - "resolved" "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz" - "version" "4.0.0" - -"cssnano-util-get-match@^4.0.0": - "integrity" "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - "resolved" "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz" - "version" "4.0.0" - -"cssnano-util-raw-cache@^4.0.1": - "integrity" "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==" - "resolved" "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - -"cssnano-util-same-parent@^4.0.0": - "integrity" "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" - "resolved" "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz" - "version" "4.0.1" - -"cssnano@^4.1.0": - "integrity" "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==" - "resolved" "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" - "version" "4.1.11" - dependencies: - "cosmiconfig" "^5.0.0" - "cssnano-preset-default" "^4.0.8" - "is-resolvable" "^1.0.0" - "postcss" "^7.0.0" - -"csso@^4.0.2": - "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==" - "resolved" "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "css-tree" "^1.1.2" - -"cssom@>= 0.3.2 < 0.4.0", "cssom@0.3.x": - "integrity" "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" - "version" "0.3.8" - -"cssstyle@^1.0.0": - "integrity" "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==" - "resolved" "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "cssom" "0.3.x" - -"csstype@^3.0.2": - "integrity" "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz" - "version" "3.0.8" - -"cyclist@^1.0.1": - "integrity" "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - "resolved" "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" - "version" "1.0.1" - -"d3-array@^2.12.1", "d3-array@^2.3.0", "d3-array@2": - "integrity" "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==" - "resolved" "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" - "version" "2.12.1" - dependencies: - "internmap" "^1.0.0" - -"d3-color@1 - 2": - "integrity" "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" - "resolved" "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz" - "version" "2.0.0" - -"d3-delaunay@5.3.0": - "integrity" "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==" - "resolved" "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz" - "version" "5.3.0" - dependencies: - "delaunator" "4" - -"d3-format@1 - 2": - "integrity" "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" - "resolved" "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz" - "version" "2.0.0" - -"d3-interpolate@1.2.0 - 2": - "integrity" "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==" - "resolved" "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "d3-color" "1 - 2" - -"d3-path@1 - 2": - "integrity" "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" - "resolved" "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz" - "version" "2.0.0" - -"d3-scale@^3.3.0": - "integrity" "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==" - "resolved" "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "d3-array" "^2.3.0" - "d3-format" "1 - 2" - "d3-interpolate" "1.2.0 - 2" - "d3-time" "^2.1.1" - "d3-time-format" "2 - 3" - -"d3-shape@^2.1.0": - "integrity" "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==" - "resolved" "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "d3-path" "1 - 2" - -"d3-time-format@2 - 3": - "integrity" "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==" - "resolved" "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "d3-time" "1 - 2" - -"d3-time@^2.1.1", "d3-time@1 - 2": - "integrity" "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==" - "resolved" "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "d3-array" "2" - -"damerau-levenshtein@^1.0.4": - "integrity" "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" - "resolved" "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz" - "version" "1.0.7" - -"dashdash@^1.12.0": - "integrity" "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=" - "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - "version" "1.14.1" - dependencies: - "assert-plus" "^1.0.0" - -"data-urls@^1.0.0": - "integrity" "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==" - "resolved" "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "abab" "^2.0.0" - "whatwg-mimetype" "^2.2.0" - "whatwg-url" "^7.0.0" - -"debug@^2.2.0": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^2.3.3": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^2.6.0": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^2.6.8": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^2.6.9": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"debug@^3.1.0": - "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - "version" "3.2.7" - dependencies: - "ms" "^2.1.1" - -"debug@^3.1.1": - "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - "version" "3.2.7" - dependencies: - "ms" "^2.1.1" - -"debug@^3.2.5": - "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - "version" "3.2.7" - dependencies: - "ms" "^2.1.1" - -"debug@^3.2.7": - "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - "version" "3.2.7" - dependencies: - "ms" "^2.1.1" - -"debug@^4.0.1", "debug@^4.1.0", "debug@^4.1.1": - "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" - "version" "4.3.2" - dependencies: - "ms" "2.1.2" - -"debug@2.6.9": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" - -"decamelize@^1.1.1": - "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - "version" "1.2.0" - -"decamelize@^2.0.0": - "integrity" "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "xregexp" "4.0.0" - -"decode-uri-component@^0.2.0": - "integrity" "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - "resolved" "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" - "version" "0.2.0" - -"deep-equal@^1.0.1": - "integrity" "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==" - "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "is-arguments" "^1.0.4" - "is-date-object" "^1.0.1" - "is-regex" "^1.0.4" - "object-is" "^1.0.1" - "object-keys" "^1.1.1" - "regexp.prototype.flags" "^1.2.0" - -"deep-is@~0.1.3": - "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - "version" "0.1.3" - -"default-gateway@^2.6.0": - "integrity" "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==" - "resolved" "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz" - "version" "2.7.2" - dependencies: - "execa" "^0.10.0" - "ip-regex" "^2.1.0" - -"default-require-extensions@^1.0.0": - "integrity" "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=" - "resolved" "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "strip-bom" "^2.0.0" - -"define-properties@^1.1.2", "define-properties@^1.1.3": - "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" - "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "object-keys" "^1.0.12" - -"define-property@^0.2.5": - "integrity" "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" - "resolved" "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" - "version" "0.2.5" - dependencies: - "is-descriptor" "^0.1.0" - -"define-property@^1.0.0": - "integrity" "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" - "resolved" "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "is-descriptor" "^1.0.0" - -"define-property@^2.0.2": - "integrity" "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==" - "resolved" "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "is-descriptor" "^1.0.2" - "isobject" "^3.0.1" - -"del@^3.0.0": - "integrity" "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=" - "resolved" "https://registry.npmjs.org/del/-/del-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "globby" "^6.1.0" - "is-path-cwd" "^1.0.0" - "is-path-in-cwd" "^1.0.0" - "p-map" "^1.1.1" - "pify" "^3.0.0" - "rimraf" "^2.2.8" - -"delaunator@4": - "integrity" "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" - "resolved" "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz" - "version" "4.0.1" - -"delayed-stream@~1.0.0": - "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" - -"depd@~1.1.2": - "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - "version" "1.1.2" - -"des.js@^1.0.0": - "integrity" "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==" - "resolved" "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "inherits" "^2.0.1" - "minimalistic-assert" "^1.0.0" - -"destroy@~1.0.4": - "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - "version" "1.0.4" - -"detect-indent@^4.0.0": - "integrity" "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" - "resolved" "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "repeating" "^2.0.0" - -"detect-newline@^2.1.0": - "integrity" "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz" - "version" "2.1.0" - -"detect-node@^2.0.4": - "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - "resolved" "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - "version" "2.1.0" - -"detect-port-alt@1.1.6": - "integrity" "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==" - "resolved" "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" - "version" "1.1.6" - dependencies: - "address" "^1.0.1" - "debug" "^2.6.0" - -"diff-sequences@^24.9.0": - "integrity" "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz" - "version" "24.9.0" - -"diff@^3.2.0": - "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" - "version" "3.5.0" - -"diffie-hellman@^5.0.0": - "integrity" "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==" - "resolved" "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - "version" "5.0.3" - dependencies: - "bn.js" "^4.1.0" - "miller-rabin" "^4.0.0" - "randombytes" "^2.0.0" - -"dir-glob@2.0.0": - "integrity" "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "arrify" "^1.0.1" - "path-type" "^3.0.0" - -"dns-equal@^1.0.0": - "integrity" "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - "resolved" "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - "version" "1.0.0" - -"dns-packet@^1.3.1": - "integrity" "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==" - "resolved" "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" - "version" "1.3.4" - dependencies: - "ip" "^1.1.0" - "safe-buffer" "^5.0.1" - -"dns-txt@^2.0.2": - "integrity" "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=" - "resolved" "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "buffer-indexof" "^1.0.0" - -"doctrine@^2.1.0": - "integrity" "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "esutils" "^2.0.2" - -"doctrine@1.5.0": - "integrity" "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" - "version" "1.5.0" - dependencies: - "esutils" "^2.0.2" - "isarray" "^1.0.0" - -"dom-accessibility-api@^0.3.0": - "integrity" "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" - "resolved" "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz" - "version" "0.3.0" - -"dom-accessibility-api@^0.5.6": - "integrity" "sha512-ml3lJIq9YjUfM9TUnEPvEYWFSwivwIGBPKpewX7tii7fwCazA8yCioGdqQcNsItPpfFvSJ3VIdMQPj60LJhcQA==" - "resolved" "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz" - "version" "0.5.7" - -"dom-converter@^0.2.0": - "integrity" "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==" - "resolved" "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - "version" "0.2.0" - dependencies: - "utila" "~0.4" - -"dom-serializer@^1.0.1": - "integrity" "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==" - "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "domelementtype" "^2.0.1" - "domhandler" "^4.2.0" - "entities" "^2.0.0" - -"dom-serializer@0": - "integrity" "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==" - "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "domelementtype" "^2.0.1" - "entities" "^2.0.0" - -"domain-browser@^1.1.1": - "integrity" "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - "resolved" "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" - "version" "1.2.0" - -"domelementtype@^2.0.1", "domelementtype@^2.2.0": - "integrity" "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz" - "version" "2.2.0" - -"domelementtype@1": - "integrity" "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - "version" "1.3.1" - -"domexception@^1.0.1": - "integrity" "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==" - "resolved" "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "webidl-conversions" "^4.0.2" - -"domhandler@^4.0.0", "domhandler@^4.2.0": - "integrity" "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==" - "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "domelementtype" "^2.2.0" - -"domutils@^1.7.0": - "integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==" - "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" - "version" "1.7.0" - dependencies: - "dom-serializer" "0" - "domelementtype" "1" - -"domutils@^2.5.2", "domutils@^2.6.0": - "integrity" "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==" - "resolved" "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz" - "version" "2.7.0" - dependencies: - "dom-serializer" "^1.0.1" - "domelementtype" "^2.2.0" - "domhandler" "^4.2.0" - -"dot-prop@^5.2.0": - "integrity" "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" - "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - "version" "5.3.0" - dependencies: - "is-obj" "^2.0.0" - -"dotenv-expand@4.2.0": - "integrity" "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" - "resolved" "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz" - "version" "4.2.0" - -"dotenv@6.0.0": - "integrity" "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==" - "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz" - "version" "6.0.0" - -"duplexer@^0.1.1": - "integrity" "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - "resolved" "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - "version" "0.1.2" - -"duplexify@^3.4.2", "duplexify@^3.6.0": - "integrity" "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==" - "resolved" "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" - "version" "3.7.1" - dependencies: - "end-of-stream" "^1.0.0" - "inherits" "^2.0.1" - "readable-stream" "^2.0.0" - "stream-shift" "^1.0.0" - -"ecc-jsbn@~0.1.1": - "integrity" "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=" - "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - "version" "0.1.2" - dependencies: - "jsbn" "~0.1.0" - "safer-buffer" "^2.1.0" - -"ee-first@1.1.1": - "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - "version" "1.1.1" - -"electron-to-chromium@^1.3.103", "electron-to-chromium@^1.3.793": - "integrity" "sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz" - "version" "1.3.806" - -"elliptic@^6.5.3": - "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" - "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - "version" "6.5.4" - dependencies: - "bn.js" "^4.11.9" - "brorand" "^1.1.0" - "hash.js" "^1.0.0" - "hmac-drbg" "^1.0.1" - "inherits" "^2.0.4" - "minimalistic-assert" "^1.0.1" - "minimalistic-crypto-utils" "^1.0.1" - -"emoji-regex@^6.5.1": - "integrity" "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz" - "version" "6.5.1" - -"emoji-regex@^7.0.1": - "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" - "version" "7.0.3" - -"emojis-list@^2.0.0": - "integrity" "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" - "version" "2.1.0" - -"emojis-list@^3.0.0": - "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - "version" "3.0.0" - -"encodeurl@~1.0.2": - "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - "version" "1.0.2" - -"end-of-stream@^1.0.0", "end-of-stream@^1.1.0": - "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" - "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - "version" "1.4.4" - dependencies: - "once" "^1.4.0" - -"enhanced-resolve@^4.1.0": - "integrity" "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==" - "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" - "version" "4.5.0" - dependencies: - "graceful-fs" "^4.1.2" - "memory-fs" "^0.5.0" - "tapable" "^1.0.0" - -"entities@^2.0.0": - "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - "version" "2.2.0" - -"errno@^0.1.3", "errno@~0.1.7": - "integrity" "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==" - "resolved" "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - "version" "0.1.8" - dependencies: - "prr" "~1.0.1" - -"error-ex@^1.2.0", "error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "is-arrayish" "^0.2.1" - -"es-abstract@^1.17.2", "es-abstract@^1.18.0-next.2", "es-abstract@^1.18.2": - "integrity" "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==" - "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz" - "version" "1.18.5" - dependencies: - "call-bind" "^1.0.2" - "es-to-primitive" "^1.2.1" - "function-bind" "^1.1.1" - "get-intrinsic" "^1.1.1" - "has" "^1.0.3" - "has-symbols" "^1.0.2" - "internal-slot" "^1.0.3" - "is-callable" "^1.2.3" - "is-negative-zero" "^2.0.1" - "is-regex" "^1.1.3" - "is-string" "^1.0.6" - "object-inspect" "^1.11.0" - "object-keys" "^1.1.1" - "object.assign" "^4.1.2" - "string.prototype.trimend" "^1.0.4" - "string.prototype.trimstart" "^1.0.4" - "unbox-primitive" "^1.0.1" - -"es-to-primitive@^1.2.1": - "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" - "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "is-callable" "^1.1.4" - "is-date-object" "^1.0.1" - "is-symbol" "^1.0.2" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-html@~1.0.3": - "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - "version" "1.0.3" - -"escape-string-regexp@^1.0.2", "escape-string-regexp@^1.0.5", "escape-string-regexp@1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^2.0.0": - "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - "version" "2.0.0" - -"escodegen@^1.9.1": - "integrity" "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==" - "resolved" "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" - "version" "1.14.3" - dependencies: - "esprima" "^4.0.1" - "estraverse" "^4.2.0" - "esutils" "^2.0.2" - "optionator" "^0.8.1" - optionalDependencies: - "source-map" "~0.6.1" - -"eslint-config-react-app@^3.0.8": - "integrity" "sha512-Ovi6Bva67OjXrom9Y/SLJRkrGqKhMAL0XCH8BizPhjEVEhYczl2ZKiNZI2CuqO5/CJwAfMwRXAVGY0KToWr1aA==" - "resolved" "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.8.tgz" - "version" "3.0.8" - dependencies: - "confusing-browser-globals" "^1.0.6" - -"eslint-import-resolver-node@^0.3.1": - "integrity" "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==" - "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" - "version" "0.3.6" - dependencies: - "debug" "^3.2.7" - "resolve" "^1.20.0" - -"eslint-loader@2.1.1": - "integrity" "sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ==" - "resolved" "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "loader-fs-cache" "^1.0.0" - "loader-utils" "^1.0.2" - "object-assign" "^4.0.1" - "object-hash" "^1.1.4" - "rimraf" "^2.6.1" - -"eslint-module-utils@^2.2.0": - "integrity" "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==" - "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz" - "version" "2.6.2" - dependencies: - "debug" "^3.2.7" - "pkg-dir" "^2.0.0" - -"eslint-plugin-flowtype@2.50.1", "eslint-plugin-flowtype@2.x": - "integrity" "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz" - "version" "2.50.1" - dependencies: - "lodash" "^4.17.10" - -"eslint-plugin-import@2.14.0", "eslint-plugin-import@2.x": - "integrity" "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==" - "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz" - "version" "2.14.0" - dependencies: - "contains-path" "^0.1.0" - "debug" "^2.6.8" - "doctrine" "1.5.0" - "eslint-import-resolver-node" "^0.3.1" - "eslint-module-utils" "^2.2.0" - "has" "^1.0.1" - "lodash" "^4.17.4" - "minimatch" "^3.0.3" - "read-pkg-up" "^2.0.0" - "resolve" "^1.6.0" - -"eslint-plugin-jsx-a11y@6.1.2", "eslint-plugin-jsx-a11y@6.x": - "integrity" "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==" - "resolved" "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz" - "version" "6.1.2" - dependencies: - "aria-query" "^3.0.0" - "array-includes" "^3.0.3" - "ast-types-flow" "^0.0.7" - "axobject-query" "^2.0.1" - "damerau-levenshtein" "^1.0.4" - "emoji-regex" "^6.5.1" - "has" "^1.0.3" - "jsx-ast-utils" "^2.0.1" - -"eslint-plugin-react@7.12.4", "eslint-plugin-react@7.x": - "integrity" "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz" - "version" "7.12.4" - dependencies: - "array-includes" "^3.0.3" - "doctrine" "^2.1.0" - "has" "^1.0.3" - "jsx-ast-utils" "^2.0.1" - "object.fromentries" "^2.0.0" - "prop-types" "^15.6.2" - "resolve" "^1.9.0" - -"eslint-scope@^4.0.0": - "integrity" "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "esrecurse" "^4.1.0" - "estraverse" "^4.1.1" - -"eslint-scope@3.7.1": - "integrity" "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz" - "version" "3.7.1" - dependencies: - "esrecurse" "^4.1.0" - "estraverse" "^4.1.1" - -"eslint-utils@^1.3.1": - "integrity" "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==" - "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" - "version" "1.4.3" - dependencies: - "eslint-visitor-keys" "^1.1.0" - -"eslint-visitor-keys@^1.0.0", "eslint-visitor-keys@^1.1.0": - "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - "version" "1.3.0" - -"eslint@^3 || ^4 || ^5", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0", "eslint@>=1.6.0 <6.0.0", "eslint@>=2.0.0", "eslint@2.x - 5.x", "eslint@5.12.0", "eslint@5.x": - "integrity" "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz" - "version" "5.12.0" - dependencies: - "@babel/code-frame" "^7.0.0" - "ajv" "^6.5.3" - "chalk" "^2.1.0" - "cross-spawn" "^6.0.5" - "debug" "^4.0.1" - "doctrine" "^2.1.0" - "eslint-scope" "^4.0.0" - "eslint-utils" "^1.3.1" - "eslint-visitor-keys" "^1.0.0" - "espree" "^5.0.0" - "esquery" "^1.0.1" - "esutils" "^2.0.2" - "file-entry-cache" "^2.0.0" - "functional-red-black-tree" "^1.0.1" - "glob" "^7.1.2" - "globals" "^11.7.0" - "ignore" "^4.0.6" - "import-fresh" "^3.0.0" - "imurmurhash" "^0.1.4" - "inquirer" "^6.1.0" - "js-yaml" "^3.12.0" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.3.0" - "lodash" "^4.17.5" - "minimatch" "^3.0.4" - "mkdirp" "^0.5.1" - "natural-compare" "^1.4.0" - "optionator" "^0.8.2" - "path-is-inside" "^1.0.2" - "pluralize" "^7.0.0" - "progress" "^2.0.0" - "regexpp" "^2.0.1" - "semver" "^5.5.1" - "strip-ansi" "^4.0.0" - "strip-json-comments" "^2.0.1" - "table" "^5.0.2" - "text-table" "^0.2.0" - -"espree@^5.0.0": - "integrity" "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==" - "resolved" "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "acorn" "^6.0.7" - "acorn-jsx" "^5.0.0" - "eslint-visitor-keys" "^1.0.0" - -"esprima@^4.0.0", "esprima@^4.0.1": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" - -"esquery@^1.0.1": - "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "estraverse" "^5.1.0" - -"esrecurse@^4.1.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "estraverse" "^5.2.0" - -"estraverse@^4.1.1", "estraverse@^4.2.0": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" - -"estraverse@^5.1.0": - "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - "version" "5.2.0" - -"estraverse@^5.2.0": - "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - "version" "5.2.0" - -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"etag@~1.8.1": - "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - "version" "1.8.1" - -"eventemitter3@^4.0.0": - "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - "version" "4.0.7" - -"events@^3.0.0": - "integrity" "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - "resolved" "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - "version" "3.3.0" - -"eventsource@^1.0.7": - "integrity" "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==" - "resolved" "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "original" "^1.0.0" - -"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3": - "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==" - "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "md5.js" "^1.3.4" - "safe-buffer" "^5.1.1" - -"exec-sh@^0.2.0": - "integrity" "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==" - "resolved" "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "merge" "^1.2.0" - -"execa@^0.10.0": - "integrity" "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==" - "resolved" "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz" - "version" "0.10.0" - dependencies: - "cross-spawn" "^6.0.0" - "get-stream" "^3.0.0" - "is-stream" "^1.1.0" - "npm-run-path" "^2.0.0" - "p-finally" "^1.0.0" - "signal-exit" "^3.0.0" - "strip-eof" "^1.0.0" - -"execa@^1.0.0": - "integrity" "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==" - "resolved" "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "cross-spawn" "^6.0.0" - "get-stream" "^4.0.0" - "is-stream" "^1.1.0" - "npm-run-path" "^2.0.0" - "p-finally" "^1.0.0" - "signal-exit" "^3.0.0" - "strip-eof" "^1.0.0" - -"exit@^0.1.2": - "integrity" "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - "version" "0.1.2" - -"expand-brackets@^0.1.4": - "integrity" "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=" - "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz" - "version" "0.1.5" - dependencies: - "is-posix-bracket" "^0.1.0" - -"expand-brackets@^2.1.4": - "integrity" "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=" - "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" - "version" "2.1.4" - dependencies: - "debug" "^2.3.3" - "define-property" "^0.2.5" - "extend-shallow" "^2.0.1" - "posix-character-classes" "^0.1.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.1" - -"expand-range@^1.8.1": - "integrity" "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=" - "resolved" "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz" - "version" "1.8.2" - dependencies: - "fill-range" "^2.1.0" - -"expect@^23.6.0": - "integrity" "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==" - "resolved" "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "ansi-styles" "^3.2.0" - "jest-diff" "^23.6.0" - "jest-get-type" "^22.1.0" - "jest-matcher-utils" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-regex-util" "^23.3.0" - -"express@^4.16.2": - "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==" - "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz" - "version" "4.17.1" - dependencies: - "accepts" "~1.3.7" - "array-flatten" "1.1.1" - "body-parser" "1.19.0" - "content-disposition" "0.5.3" - "content-type" "~1.0.4" - "cookie" "0.4.0" - "cookie-signature" "1.0.6" - "debug" "2.6.9" - "depd" "~1.1.2" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "etag" "~1.8.1" - "finalhandler" "~1.1.2" - "fresh" "0.5.2" - "merge-descriptors" "1.0.1" - "methods" "~1.1.2" - "on-finished" "~2.3.0" - "parseurl" "~1.3.3" - "path-to-regexp" "0.1.7" - "proxy-addr" "~2.0.5" - "qs" "6.7.0" - "range-parser" "~1.2.1" - "safe-buffer" "5.1.2" - "send" "0.17.1" - "serve-static" "1.14.1" - "setprototypeof" "1.1.1" - "statuses" "~1.5.0" - "type-is" "~1.6.18" - "utils-merge" "1.0.1" - "vary" "~1.1.2" - -"extend-shallow@^2.0.1": - "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=" - "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-extendable" "^0.1.0" - -"extend-shallow@^3.0.0", "extend-shallow@^3.0.2": - "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" - "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "assign-symbols" "^1.0.0" - "is-extendable" "^1.0.1" - -"extend@~3.0.2": - "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - "version" "3.0.2" - -"external-editor@^3.0.0", "external-editor@^3.0.3": - "integrity" "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==" - "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "chardet" "^0.7.0" - "iconv-lite" "^0.4.24" - "tmp" "^0.0.33" - -"extglob@^0.3.1": - "integrity" "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=" - "resolved" "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" - "version" "0.3.2" - dependencies: - "is-extglob" "^1.0.0" - -"extglob@^2.0.4": - "integrity" "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==" - "resolved" "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "array-unique" "^0.3.2" - "define-property" "^1.0.0" - "expand-brackets" "^2.1.4" - "extend-shallow" "^2.0.1" - "fragment-cache" "^0.2.1" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.1" - -"extsprintf@^1.2.0", "extsprintf@1.3.0": - "integrity" "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - "version" "1.3.0" - -"fast-deep-equal@^3.1.1": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-glob@^2.0.2": - "integrity" "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz" - "version" "2.2.7" - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - "glob-parent" "^3.1.0" - "is-glob" "^4.0.0" - "merge2" "^1.2.3" - "micromatch" "^3.1.10" - -"fast-json-stable-stringify@^2.0.0": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" - -"fast-levenshtein@~2.0.6": - "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" - -"fastparse@^1.1.2": - "integrity" "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - "resolved" "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz" - "version" "1.1.2" - -"faye-websocket@^0.10.0": - "integrity" "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=" - "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz" - "version" "0.10.0" - dependencies: - "websocket-driver" ">=0.5.1" - -"faye-websocket@~0.11.1": - "integrity" "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==" - "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - "version" "0.11.4" - dependencies: - "websocket-driver" ">=0.5.1" - -"fb-watchman@^2.0.0": - "integrity" "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==" - "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "bser" "2.1.1" - -"figgy-pudding@^3.5.1": - "integrity" "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - "resolved" "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" - "version" "3.5.2" - -"figures@^2.0.0": - "integrity" "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=" - "resolved" "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "escape-string-regexp" "^1.0.5" - -"file-entry-cache@^2.0.0": - "integrity" "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "flat-cache" "^1.2.1" - "object-assign" "^4.0.1" - -"file-loader@2.0.0": - "integrity" "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==" - "resolved" "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "loader-utils" "^1.0.2" - "schema-utils" "^1.0.0" - -"filename-regex@^2.0.0": - "integrity" "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - "resolved" "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz" - "version" "2.0.1" - -"fileset@^2.0.2": - "integrity" "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=" - "resolved" "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz" - "version" "2.0.3" - dependencies: - "glob" "^7.0.3" - "minimatch" "^3.0.3" - -"filesize@3.6.1": - "integrity" "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - "resolved" "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz" - "version" "3.6.1" - -"fill-range@^2.1.0": - "integrity" "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" - "version" "2.2.4" - dependencies: - "is-number" "^2.1.0" - "isobject" "^2.0.0" - "randomatic" "^3.0.0" - "repeat-element" "^1.1.2" - "repeat-string" "^1.5.2" - -"fill-range@^4.0.0": - "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "extend-shallow" "^2.0.1" - "is-number" "^3.0.0" - "repeat-string" "^1.6.1" - "to-regex-range" "^2.1.0" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"finalhandler@~1.1.2": - "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" - "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "debug" "2.6.9" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "on-finished" "~2.3.0" - "parseurl" "~1.3.3" - "statuses" "~1.5.0" - "unpipe" "~1.0.0" - -"find-cache-dir@^0.1.1": - "integrity" "sha1-yN765XyKUqinhPnjHFfHQumToLk=" - "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz" - "version" "0.1.1" - dependencies: - "commondir" "^1.0.1" - "mkdirp" "^0.5.1" - "pkg-dir" "^1.0.0" - -"find-cache-dir@^2.0.0": - "integrity" "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==" - "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "commondir" "^1.0.1" - "make-dir" "^2.0.0" - "pkg-dir" "^3.0.0" - -"find-up@^1.0.0": - "integrity" "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "path-exists" "^2.0.0" - "pinkie-promise" "^2.0.0" - -"find-up@^2.0.0", "find-up@^2.1.0": - "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "locate-path" "^2.0.0" - -"find-up@^3.0.0": - "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "locate-path" "^3.0.0" - -"find-up@3.0.0": - "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "locate-path" "^3.0.0" - -"flat-cache@^1.2.1": - "integrity" "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz" - "version" "1.3.4" - dependencies: - "circular-json" "^0.3.1" - "graceful-fs" "^4.1.2" - "rimraf" "~2.6.2" - "write" "^0.2.1" - -"flatten@^1.0.2": - "integrity" "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - "resolved" "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz" - "version" "1.0.3" - -"flush-write-stream@^1.0.0": - "integrity" "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==" - "resolved" "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "inherits" "^2.0.3" - "readable-stream" "^2.3.6" - -"follow-redirects@^1.0.0": - "integrity" "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz" - "version" "1.14.1" - -"for-each@^0.3.3": - "integrity" "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==" - "resolved" "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - "version" "0.3.3" - dependencies: - "is-callable" "^1.1.3" - -"for-in@^0.1.3": - "integrity" "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - "resolved" "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz" - "version" "0.1.8" - -"for-in@^1.0.1", "for-in@^1.0.2": - "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - "resolved" "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - "version" "1.0.2" - -"for-own@^0.1.3", "for-own@^0.1.4": - "integrity" "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=" - "resolved" "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" - "version" "0.1.5" - dependencies: - "for-in" "^1.0.1" - -"for-own@^1.0.0": - "integrity" "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=" - "resolved" "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "for-in" "^1.0.1" - -"forever-agent@~0.6.1": - "integrity" "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - "version" "0.6.1" - -"fork-ts-checker-webpack-plugin@1.0.0-alpha.6": - "integrity" "sha512-s/V+58nLrUjuXyzYk8AL11XG8bxIirTbafDLMn26sL59HQx8QvvsRTqOkhq4MV0coIkog1jZuH/E9Abm8zFZ2g==" - "resolved" "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.0.0-alpha.6.tgz" - "version" "1.0.0-alpha.6" - dependencies: - "babel-code-frame" "^6.22.0" - "chalk" "^2.4.1" - "chokidar" "^2.0.4" - "micromatch" "^3.1.10" - "minimatch" "^3.0.4" - "semver" "^5.6.0" - "tapable" "^1.0.0" - -"form-data@~2.3.2": - "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - "version" "2.3.3" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.6" - "mime-types" "^2.1.12" - -"forwarded@0.2.0": - "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - "version" "0.2.0" - -"fragment-cache@^0.2.1": - "integrity" "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=" - "resolved" "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" - "version" "0.2.1" - dependencies: - "map-cache" "^0.2.2" - -"fresh@0.5.2": - "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - "version" "0.5.2" - -"from2@^2.1.0": - "integrity" "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=" - "resolved" "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" - "version" "2.3.0" - dependencies: - "inherits" "^2.0.1" - "readable-stream" "^2.0.0" - -"fs-extra@^4.0.2": - "integrity" "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "graceful-fs" "^4.1.2" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs-extra@^7.0.0", "fs-extra@7.0.1": - "integrity" "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "graceful-fs" "^4.1.2" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs-write-stream-atomic@^1.0.8": - "integrity" "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=" - "resolved" "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "graceful-fs" "^4.1.2" - "iferr" "^0.1.5" - "imurmurhash" "^0.1.4" - "readable-stream" "1 || 2" - -"fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"functional-red-black-tree@^1.0.1": - "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - "version" "1.0.1" - -"gensync@^1.0.0-beta.2": - "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - "version" "1.0.0-beta.2" - -"get-caller-file@^1.0.1": - "integrity" "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" - "version" "1.0.3" - -"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1": - "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==" - "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "function-bind" "^1.1.1" - "has" "^1.0.3" - "has-symbols" "^1.0.1" - -"get-own-enumerable-property-symbols@^3.0.0": - "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - "resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - "version" "3.0.2" - -"get-stream@^3.0.0": - "integrity" "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" - "version" "3.0.0" - -"get-stream@^4.0.0": - "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "pump" "^3.0.0" - -"get-value@^2.0.3", "get-value@^2.0.6": - "integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - "resolved" "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" - "version" "2.0.6" - -"getpass@^0.1.1": - "integrity" "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=" - "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - "version" "0.1.7" - dependencies: - "assert-plus" "^1.0.0" - -"glob-base@^0.3.0": - "integrity" "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=" - "resolved" "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "glob-parent" "^2.0.0" - "is-glob" "^2.0.0" - -"glob-parent@^2.0.0": - "integrity" "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "is-glob" "^2.0.0" - -"glob-parent@^3.1.0": - "integrity" "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "is-glob" "^3.1.0" - "path-dirname" "^1.0.0" - -"glob-parent@~5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-to-regexp@^0.3.0": - "integrity" "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - "resolved" "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz" - "version" "0.3.0" - -"glob@^7.0.3", "glob@^7.1.1", "glob@^7.1.2", "glob@^7.1.3", "glob@^7.1.4": - "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - "version" "7.1.7" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"global-modules@2.0.0": - "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==" - "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "global-prefix" "^3.0.0" - -"global-prefix@^3.0.0": - "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==" - "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "ini" "^1.3.5" - "kind-of" "^6.0.2" - "which" "^1.3.1" - -"globals@^11.1.0", "globals@^11.7.0": - "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - "version" "11.12.0" - -"globals@^9.18.0": - "integrity" "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - "resolved" "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" - "version" "9.18.0" - -"globby@^6.1.0": - "integrity" "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=" - "resolved" "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "array-union" "^1.0.1" - "glob" "^7.0.3" - "object-assign" "^4.0.1" - "pify" "^2.0.0" - "pinkie-promise" "^2.0.0" - -"globby@8.0.2": - "integrity" "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==" - "resolved" "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz" - "version" "8.0.2" - dependencies: - "array-union" "^1.0.1" - "dir-glob" "2.0.0" - "fast-glob" "^2.0.2" - "glob" "^7.1.2" - "ignore" "^3.3.5" - "pify" "^3.0.0" - "slash" "^1.0.0" - -"graceful-fs@^4.1.11", "graceful-fs@^4.1.15", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6": - "integrity" "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" - "version" "4.2.8" - -"growly@^1.3.0": - "integrity" "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - "resolved" "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" - "version" "1.3.0" - -"gzip-size@5.0.0": - "integrity" "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==" - "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "duplexer" "^0.1.1" - "pify" "^3.0.0" - -"handle-thing@^2.0.0": - "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - "resolved" "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - "version" "2.0.1" - -"handlebars@^4.0.3": - "integrity" "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==" - "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" - "version" "4.7.7" - dependencies: - "minimist" "^1.2.5" - "neo-async" "^2.6.0" - "source-map" "^0.6.1" - "wordwrap" "^1.0.0" - optionalDependencies: - "uglify-js" "^3.1.4" - -"har-schema@^2.0.0": - "integrity" "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" - "version" "2.0.0" - -"har-validator@~5.1.3": - "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" - "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" - "version" "5.1.5" - dependencies: - "ajv" "^6.12.3" - "har-schema" "^2.0.0" - -"harmony-reflect@^1.4.6": - "integrity" "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - "resolved" "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" - "version" "1.6.2" - -"has-ansi@^2.0.0": - "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" - "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "ansi-regex" "^2.0.0" - -"has-bigints@^1.0.1": - "integrity" "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" - "version" "1.0.1" - -"has-flag@^1.0.0": - "integrity" "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - "version" "1.0.0" - -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"has-symbols@^1.0.1", "has-symbols@^1.0.2": - "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" - "version" "1.0.2" - -"has-tostringtag@^1.0.0": - "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" - "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "has-symbols" "^1.0.2" - -"has-value@^0.3.1": - "integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=" - "resolved" "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" - "version" "0.3.1" - dependencies: - "get-value" "^2.0.3" - "has-values" "^0.1.4" - "isobject" "^2.0.0" - -"has-value@^1.0.0": - "integrity" "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=" - "resolved" "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "get-value" "^2.0.6" - "has-values" "^1.0.0" - "isobject" "^3.0.0" - -"has-values@^0.1.4": - "integrity" "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - "resolved" "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" - "version" "0.1.4" - -"has-values@^1.0.0": - "integrity" "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=" - "resolved" "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "is-number" "^3.0.0" - "kind-of" "^4.0.0" - -"has@^1.0.0", "has@^1.0.1", "has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "function-bind" "^1.1.1" - -"hash-base@^3.0.0": - "integrity" "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==" - "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "inherits" "^2.0.4" - "readable-stream" "^3.6.0" - "safe-buffer" "^5.2.0" - -"hash.js@^1.0.0", "hash.js@^1.0.3": - "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==" - "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - "version" "1.1.7" - dependencies: - "inherits" "^2.0.3" - "minimalistic-assert" "^1.0.1" - -"he@1.2.x": - "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - "version" "1.2.0" - -"hex-color-regex@^1.1.0": - "integrity" "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - "resolved" "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" - "version" "1.1.0" - -"hmac-drbg@^1.0.1": - "integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=" - "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "hash.js" "^1.0.3" - "minimalistic-assert" "^1.0.0" - "minimalistic-crypto-utils" "^1.0.1" - -"hoek@4.x.x": - "integrity" "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - "resolved" "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz" - "version" "4.2.1" - -"hoist-non-react-statics@^3.3.0", "hoist-non-react-statics@^3.3.2": - "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==" - "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - "version" "3.3.2" - dependencies: - "react-is" "^16.7.0" - -"home-or-tmp@^2.0.0": - "integrity" "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" - "resolved" "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "os-homedir" "^1.0.0" - "os-tmpdir" "^1.0.1" - -"hoopy@^0.1.2": - "integrity" "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" - "resolved" "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" - "version" "0.1.4" - -"hosted-git-info@^2.1.4": - "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - "version" "2.8.9" - -"hpack.js@^2.1.6": - "integrity" "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=" - "resolved" "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - "version" "2.1.6" - dependencies: - "inherits" "^2.0.1" - "obuf" "^1.0.0" - "readable-stream" "^2.0.1" - "wbuf" "^1.1.0" - -"hsl-regex@^1.0.0": - "integrity" "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - "resolved" "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz" - "version" "1.0.0" - -"hsla-regex@^1.0.0": - "integrity" "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - "resolved" "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz" - "version" "1.0.0" - -"html-encoding-sniffer@^1.0.2": - "integrity" "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==" - "resolved" "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "whatwg-encoding" "^1.0.1" - -"html-entities@^1.2.0": - "integrity" "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - "resolved" "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz" - "version" "1.4.0" - -"html-minifier@^3.2.3": - "integrity" "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==" - "resolved" "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz" - "version" "3.5.21" - dependencies: - "camel-case" "3.0.x" - "clean-css" "4.2.x" - "commander" "2.17.x" - "he" "1.2.x" - "param-case" "2.1.x" - "relateurl" "0.2.x" - "uglify-js" "3.4.x" - -"html-webpack-plugin@4.0.0-alpha.2": - "integrity" "sha512-tyvhjVpuGqD7QYHi1l1drMQTg5i+qRxpQEGbdnYFREgOKy7aFDf/ocQ/V1fuEDlQx7jV2zMap3Hj2nE9i5eGXw==" - "resolved" "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-alpha.2.tgz" - "version" "4.0.0-alpha.2" - dependencies: - "@types/tapable" "1.0.2" - "html-minifier" "^3.2.3" - "loader-utils" "^1.1.0" - "lodash" "^4.17.10" - "pretty-error" "^2.0.2" - "tapable" "^1.0.0" - "util.promisify" "1.0.0" - -"htmlparser2@^6.1.0": - "integrity" "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==" - "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "domelementtype" "^2.0.1" - "domhandler" "^4.0.0" - "domutils" "^2.5.2" - "entities" "^2.0.0" - -"http-deceiver@^1.2.7": - "integrity" "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - "resolved" "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - "version" "1.2.7" - -"http-errors@~1.6.2": - "integrity" "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=" - "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - "version" "1.6.3" - dependencies: - "depd" "~1.1.2" - "inherits" "2.0.3" - "setprototypeof" "1.1.0" - "statuses" ">= 1.4.0 < 2" - -"http-errors@~1.7.2", "http-errors@1.7.2": - "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==" - "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" - "version" "1.7.2" - dependencies: - "depd" "~1.1.2" - "inherits" "2.0.3" - "setprototypeof" "1.1.1" - "statuses" ">= 1.5.0 < 2" - "toidentifier" "1.0.0" - -"http-parser-js@>=0.5.1": - "integrity" "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - "resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz" - "version" "0.5.3" - -"http-proxy-middleware@~0.18.0": - "integrity" "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==" - "resolved" "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz" - "version" "0.18.0" - dependencies: - "http-proxy" "^1.16.2" - "is-glob" "^4.0.0" - "lodash" "^4.17.5" - "micromatch" "^3.1.9" - -"http-proxy@^1.16.2": - "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==" - "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - "version" "1.18.1" - dependencies: - "eventemitter3" "^4.0.0" - "follow-redirects" "^1.0.0" - "requires-port" "^1.0.0" - -"http-signature@~1.2.0": - "integrity" "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=" - "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "assert-plus" "^1.0.0" - "jsprim" "^1.2.2" - "sshpk" "^1.7.0" - -"https-browserify@^1.0.0": - "integrity" "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - "resolved" "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" - "version" "1.0.0" - -"iconv-lite@^0.4.24", "iconv-lite@0.4.24": - "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" - "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - "version" "0.4.24" - dependencies: - "safer-buffer" ">= 2.1.2 < 3" - -"icss-replace-symbols@^1.1.0": - "integrity" "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - "resolved" "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz" - "version" "1.1.0" - -"icss-utils@^2.1.0": - "integrity" "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=" - "resolved" "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "postcss" "^6.0.1" - -"identity-obj-proxy@3.0.0": - "integrity" "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=" - "resolved" "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "harmony-reflect" "^1.4.6" - -"ieee754@^1.1.4": - "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - "version" "1.2.1" - -"iferr@^0.1.5": - "integrity" "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - "resolved" "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" - "version" "0.1.5" - -"ignore@^3.3.5": - "integrity" "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz" - "version" "3.3.10" - -"ignore@^4.0.6": - "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - "version" "4.0.6" - -"immer@^9.0.1": - "integrity" "sha512-2WuIehr2y4lmYz9gaQzetPR2ECniCifk4ORaQbU3g5EalLt+0IVTosEPJ5BoYl/75ky2mivzdRzV8wWgQGOSYQ==" - "resolved" "https://registry.npmjs.org/immer/-/immer-9.0.5.tgz" - "version" "9.0.5" - -"immer@1.10.0": - "integrity" "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - "resolved" "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz" - "version" "1.10.0" - -"import-cwd@^2.0.0": - "integrity" "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=" - "resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "import-from" "^2.1.0" - -"import-fresh@^2.0.0": - "integrity" "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "caller-path" "^2.0.0" - "resolve-from" "^3.0.0" - -"import-fresh@^3.0.0": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"import-from@^2.1.0": - "integrity" "sha1-M1238qev/VOqpHHUuAId7ja387E=" - "resolved" "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "resolve-from" "^3.0.0" - -"import-local@^1.0.0": - "integrity" "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==" - "resolved" "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "pkg-dir" "^2.0.0" - "resolve-cwd" "^2.0.0" - -"import-local@^2.0.0": - "integrity" "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==" - "resolved" "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "pkg-dir" "^3.0.0" - "resolve-cwd" "^2.0.0" - -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" - -"indent-string@^4.0.0": - "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - "version" "4.0.0" - -"indexes-of@^1.0.1": - "integrity" "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - "resolved" "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" - "version" "1.0.1" - -"inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"inherits@2.0.1": - "integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - "version" "2.0.1" - -"inherits@2.0.3": - "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - "version" "2.0.3" - -"ini@^1.3.5": - "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - "version" "1.3.8" - -"inquirer@^6.1.0": - "integrity" "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==" - "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" - "version" "6.5.2" - dependencies: - "ansi-escapes" "^3.2.0" - "chalk" "^2.4.2" - "cli-cursor" "^2.1.0" - "cli-width" "^2.0.0" - "external-editor" "^3.0.3" - "figures" "^2.0.0" - "lodash" "^4.17.12" - "mute-stream" "0.0.7" - "run-async" "^2.2.0" - "rxjs" "^6.4.0" - "string-width" "^2.1.0" - "strip-ansi" "^5.1.0" - "through" "^2.3.6" - -"inquirer@6.2.1": - "integrity" "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==" - "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz" - "version" "6.2.1" - dependencies: - "ansi-escapes" "^3.0.0" - "chalk" "^2.0.0" - "cli-cursor" "^2.1.0" - "cli-width" "^2.0.0" - "external-editor" "^3.0.0" - "figures" "^2.0.0" - "lodash" "^4.17.10" - "mute-stream" "0.0.7" - "run-async" "^2.2.0" - "rxjs" "^6.1.0" - "string-width" "^2.1.0" - "strip-ansi" "^5.0.0" - "through" "^2.3.6" - -"internal-ip@^3.0.1": - "integrity" "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==" - "resolved" "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "default-gateway" "^2.6.0" - "ipaddr.js" "^1.5.2" - -"internal-slot@^1.0.3": - "integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==" - "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "get-intrinsic" "^1.1.0" - "has" "^1.0.3" - "side-channel" "^1.0.4" - -"internmap@^1.0.0": - "integrity" "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" - "resolved" "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" - "version" "1.0.1" - -"invariant@^2.2.2", "invariant@^2.2.4": - "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==" - "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - "version" "2.2.4" - dependencies: - "loose-envify" "^1.0.0" - -"invert-kv@^2.0.0": - "integrity" "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - "resolved" "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz" - "version" "2.0.0" - -"ip-regex@^2.1.0": - "integrity" "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - "resolved" "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" - "version" "2.1.0" - -"ip@^1.1.0", "ip@^1.1.5": - "integrity" "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - "resolved" "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz" - "version" "1.1.5" - -"ipaddr.js@^1.5.2", "ipaddr.js@1.9.1": - "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - "version" "1.9.1" - -"is-absolute-url@^2.0.0": - "integrity" "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - "resolved" "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" - "version" "2.1.0" - -"is-accessor-descriptor@^0.1.6": - "integrity" "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=" - "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" - "version" "0.1.6" - dependencies: - "kind-of" "^3.0.2" - -"is-accessor-descriptor@^1.0.0": - "integrity" "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==" - "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "kind-of" "^6.0.0" - -"is-arguments@^1.0.4": - "integrity" "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==" - "resolved" "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" - -"is-arrayish@^0.2.1": - "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" - -"is-arrayish@^0.3.1": - "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - "version" "0.3.2" - -"is-bigint@^1.0.1": - "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==" - "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "has-bigints" "^1.0.1" - -"is-binary-path@^1.0.0": - "integrity" "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "binary-extensions" "^1.0.0" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-boolean-object@^1.1.0": - "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" - "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" - -"is-buffer@^1.0.2", "is-buffer@^1.1.5": - "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - "version" "1.1.6" - -"is-callable@^1.1.3", "is-callable@^1.1.4", "is-callable@^1.2.3": - "integrity" "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" - "version" "1.2.4" - -"is-ci@^1.0.10": - "integrity" "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==" - "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "ci-info" "^1.5.0" - -"is-color-stop@^1.0.0": - "integrity" "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=" - "resolved" "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "css-color-names" "^0.0.4" - "hex-color-regex" "^1.1.0" - "hsl-regex" "^1.0.0" - "hsla-regex" "^1.0.0" - "rgb-regex" "^1.0.1" - "rgba-regex" "^1.0.0" - -"is-core-module@^2.2.0": - "integrity" "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "has" "^1.0.3" - -"is-data-descriptor@^0.1.4": - "integrity" "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=" - "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "kind-of" "^3.0.2" - -"is-data-descriptor@^1.0.0": - "integrity" "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==" - "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "kind-of" "^6.0.0" - -"is-date-object@^1.0.1": - "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==" - "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-descriptor@^0.1.0": - "integrity" "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==" - "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" - "version" "0.1.6" - dependencies: - "is-accessor-descriptor" "^0.1.6" - "is-data-descriptor" "^0.1.4" - "kind-of" "^5.0.0" - -"is-descriptor@^1.0.0", "is-descriptor@^1.0.2": - "integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==" - "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "is-accessor-descriptor" "^1.0.0" - "is-data-descriptor" "^1.0.0" - "kind-of" "^6.0.2" - -"is-directory@^0.3.1": - "integrity" "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - "resolved" "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" - "version" "0.3.1" - -"is-dotfile@^1.0.0": - "integrity" "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - "resolved" "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz" - "version" "1.0.3" - -"is-equal-shallow@^0.1.3": - "integrity" "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=" - "resolved" "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" - "version" "0.1.3" - dependencies: - "is-primitive" "^2.0.0" - -"is-extendable@^0.1.0", "is-extendable@^0.1.1": - "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - "version" "0.1.1" - -"is-extendable@^1.0.1": - "integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==" - "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "is-plain-object" "^2.0.4" - -"is-extglob@^1.0.0": - "integrity" "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - "version" "1.0.0" - -"is-extglob@^2.1.0", "is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-finite@^1.0.0": - "integrity" "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - "resolved" "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" - "version" "1.1.0" - -"is-fullwidth-code-point@^1.0.0": - "integrity" "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "number-is-nan" "^1.0.0" - -"is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - "version" "2.0.0" - -"is-generator-fn@^1.0.0": - "integrity" "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" - "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz" - "version" "1.0.0" - -"is-glob@^2.0.0", "is-glob@^2.0.1": - "integrity" "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-extglob" "^1.0.0" - -"is-glob@^3.1.0": - "integrity" "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "is-extglob" "^2.1.0" - -"is-glob@^4.0.0": - "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "is-extglob" "^2.1.1" - -"is-glob@^4.0.1", "is-glob@~4.0.1": - "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "is-extglob" "^2.1.1" - -"is-negative-zero@^2.0.1": - "integrity" "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz" - "version" "2.0.1" - -"is-number-object@^1.0.4": - "integrity" "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==" - "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-number@^2.1.0": - "integrity" "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "kind-of" "^3.0.2" - -"is-number@^3.0.0": - "integrity" "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "kind-of" "^3.0.2" - -"is-number@^4.0.0": - "integrity" "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" - "version" "4.0.0" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-obj@^1.0.1": - "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - "version" "1.0.1" - -"is-obj@^2.0.0": - "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - "version" "2.0.0" - -"is-path-cwd@^1.0.0": - "integrity" "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" - "version" "1.0.0" - -"is-path-in-cwd@^1.0.0": - "integrity" "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==" - "resolved" "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "is-path-inside" "^1.0.0" - -"is-path-inside@^1.0.0": - "integrity" "sha1-jvW33lBDej/cprToZe96pVy0gDY=" - "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "path-is-inside" "^1.0.1" - -"is-plain-object@^2.0.1", "is-plain-object@^2.0.3", "is-plain-object@^2.0.4": - "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" - "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "isobject" "^3.0.1" - -"is-posix-bracket@^0.1.0": - "integrity" "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - "resolved" "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" - "version" "0.1.1" - -"is-primitive@^2.0.0": - "integrity" "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - "resolved" "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" - "version" "2.0.0" - -"is-regex@^1.0.4", "is-regex@^1.1.3": - "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" - "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" - -"is-regexp@^1.0.0": - "integrity" "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - "resolved" "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - "version" "1.0.0" - -"is-resolvable@^1.0.0": - "integrity" "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - "resolved" "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz" - "version" "1.1.0" - -"is-root@2.0.0": - "integrity" "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" - "resolved" "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz" - "version" "2.0.0" - -"is-stream@^1.1.0": - "integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - "version" "1.1.0" - -"is-string@^1.0.5", "is-string@^1.0.6": - "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==" - "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - "version" "1.0.7" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-symbol@^1.0.2", "is-symbol@^1.0.3": - "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==" - "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "has-symbols" "^1.0.2" - -"is-typedarray@~1.0.0": - "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - "version" "1.0.0" - -"is-utf8@^0.2.0": - "integrity" "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - "resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - "version" "0.2.1" - -"is-windows@^1.0.2": - "integrity" "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - "resolved" "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - "version" "1.0.2" - -"is-wsl@^1.1.0": - "integrity" "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" - "version" "1.1.0" - -"isarray@^1.0.0", "isarray@~1.0.0", "isarray@1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isemail@3.x.x": - "integrity" "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==" - "resolved" "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz" - "version" "3.2.0" - dependencies: - "punycode" "2.x.x" - -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"isobject@^2.0.0": - "integrity" "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" - "resolved" "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "isarray" "1.0.0" - -"isobject@^3.0.0", "isobject@^3.0.1": - "integrity" "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - "version" "3.0.1" - -"isstream@~0.1.2": - "integrity" "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - "version" "0.1.2" - -"istanbul-api@^1.3.1": - "integrity" "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==" - "resolved" "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz" - "version" "1.3.7" - dependencies: - "async" "^2.1.4" - "fileset" "^2.0.2" - "istanbul-lib-coverage" "^1.2.1" - "istanbul-lib-hook" "^1.2.2" - "istanbul-lib-instrument" "^1.10.2" - "istanbul-lib-report" "^1.1.5" - "istanbul-lib-source-maps" "^1.2.6" - "istanbul-reports" "^1.5.1" - "js-yaml" "^3.7.0" - "mkdirp" "^0.5.1" - "once" "^1.4.0" - -"istanbul-lib-coverage@^1.2.0", "istanbul-lib-coverage@^1.2.1": - "integrity" "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" - "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz" - "version" "1.2.1" - -"istanbul-lib-hook@^1.2.2": - "integrity" "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz" - "version" "1.2.2" - dependencies: - "append-transform" "^0.4.0" - -"istanbul-lib-instrument@^1.10.1", "istanbul-lib-instrument@^1.10.2": - "integrity" "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==" - "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz" - "version" "1.10.2" - dependencies: - "babel-generator" "^6.18.0" - "babel-template" "^6.16.0" - "babel-traverse" "^6.18.0" - "babel-types" "^6.18.0" - "babylon" "^6.18.0" - "istanbul-lib-coverage" "^1.2.1" - "semver" "^5.3.0" - -"istanbul-lib-report@^1.1.5": - "integrity" "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz" - "version" "1.1.5" - dependencies: - "istanbul-lib-coverage" "^1.2.1" - "mkdirp" "^0.5.1" - "path-parse" "^1.0.5" - "supports-color" "^3.1.2" - -"istanbul-lib-source-maps@^1.2.4", "istanbul-lib-source-maps@^1.2.6": - "integrity" "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==" - "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz" - "version" "1.2.6" - dependencies: - "debug" "^3.1.0" - "istanbul-lib-coverage" "^1.2.1" - "mkdirp" "^0.5.1" - "rimraf" "^2.6.1" - "source-map" "^0.5.3" - -"istanbul-reports@^1.5.1": - "integrity" "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==" - "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz" - "version" "1.5.1" - dependencies: - "handlebars" "^4.0.3" - -"jest-changed-files@^23.4.2": - "integrity" "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==" - "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz" - "version" "23.4.2" - dependencies: - "throat" "^4.0.0" - -"jest-cli@^23.6.0": - "integrity" "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==" - "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "ansi-escapes" "^3.0.0" - "chalk" "^2.0.1" - "exit" "^0.1.2" - "glob" "^7.1.2" - "graceful-fs" "^4.1.11" - "import-local" "^1.0.0" - "is-ci" "^1.0.10" - "istanbul-api" "^1.3.1" - "istanbul-lib-coverage" "^1.2.0" - "istanbul-lib-instrument" "^1.10.1" - "istanbul-lib-source-maps" "^1.2.4" - "jest-changed-files" "^23.4.2" - "jest-config" "^23.6.0" - "jest-environment-jsdom" "^23.4.0" - "jest-get-type" "^22.1.0" - "jest-haste-map" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-regex-util" "^23.3.0" - "jest-resolve-dependencies" "^23.6.0" - "jest-runner" "^23.6.0" - "jest-runtime" "^23.6.0" - "jest-snapshot" "^23.6.0" - "jest-util" "^23.4.0" - "jest-validate" "^23.6.0" - "jest-watcher" "^23.4.0" - "jest-worker" "^23.2.0" - "micromatch" "^2.3.11" - "node-notifier" "^5.2.1" - "prompts" "^0.1.9" - "realpath-native" "^1.0.0" - "rimraf" "^2.5.4" - "slash" "^1.0.0" - "string-length" "^2.0.0" - "strip-ansi" "^4.0.0" - "which" "^1.2.12" - "yargs" "^11.0.0" - -"jest-config@^23.6.0": - "integrity" "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==" - "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "babel-core" "^6.0.0" - "babel-jest" "^23.6.0" - "chalk" "^2.0.1" - "glob" "^7.1.1" - "jest-environment-jsdom" "^23.4.0" - "jest-environment-node" "^23.4.0" - "jest-get-type" "^22.1.0" - "jest-jasmine2" "^23.6.0" - "jest-regex-util" "^23.3.0" - "jest-resolve" "^23.6.0" - "jest-util" "^23.4.0" - "jest-validate" "^23.6.0" - "micromatch" "^2.3.11" - "pretty-format" "^23.6.0" - -"jest-diff@^23.6.0": - "integrity" "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==" - "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "chalk" "^2.0.1" - "diff" "^3.2.0" - "jest-get-type" "^22.1.0" - "pretty-format" "^23.6.0" - -"jest-diff@^24.0.0", "jest-diff@^24.9.0": - "integrity" "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==" - "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "chalk" "^2.0.1" - "diff-sequences" "^24.9.0" - "jest-get-type" "^24.9.0" - "pretty-format" "^24.9.0" - -"jest-docblock@^23.2.0": - "integrity" "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=" - "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz" - "version" "23.2.0" - dependencies: - "detect-newline" "^2.1.0" - -"jest-each@^23.6.0": - "integrity" "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==" - "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "chalk" "^2.0.1" - "pretty-format" "^23.6.0" - -"jest-environment-jsdom@^23.4.0": - "integrity" "sha1-BWp5UrP+pROsYqFAosNox52eYCM=" - "resolved" "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz" - "version" "23.4.0" - dependencies: - "jest-mock" "^23.2.0" - "jest-util" "^23.4.0" - "jsdom" "^11.5.1" - -"jest-environment-node@^23.4.0": - "integrity" "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=" - "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz" - "version" "23.4.0" - dependencies: - "jest-mock" "^23.2.0" - "jest-util" "^23.4.0" - -"jest-get-type@^22.1.0": - "integrity" "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" - "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz" - "version" "22.4.3" - -"jest-get-type@^24.9.0": - "integrity" "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz" - "version" "24.9.0" - -"jest-haste-map@^23.6.0": - "integrity" "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==" - "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "fb-watchman" "^2.0.0" - "graceful-fs" "^4.1.11" - "invariant" "^2.2.4" - "jest-docblock" "^23.2.0" - "jest-serializer" "^23.0.1" - "jest-worker" "^23.2.0" - "micromatch" "^2.3.11" - "sane" "^2.0.0" - -"jest-jasmine2@^23.6.0": - "integrity" "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==" - "resolved" "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "babel-traverse" "^6.0.0" - "chalk" "^2.0.1" - "co" "^4.6.0" - "expect" "^23.6.0" - "is-generator-fn" "^1.0.0" - "jest-diff" "^23.6.0" - "jest-each" "^23.6.0" - "jest-matcher-utils" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-snapshot" "^23.6.0" - "jest-util" "^23.4.0" - "pretty-format" "^23.6.0" - -"jest-leak-detector@^23.6.0": - "integrity" "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==" - "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "pretty-format" "^23.6.0" - -"jest-matcher-utils@^23.6.0": - "integrity" "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==" - "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "chalk" "^2.0.1" - "jest-get-type" "^22.1.0" - "pretty-format" "^23.6.0" - -"jest-matcher-utils@^24.0.0": - "integrity" "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==" - "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "chalk" "^2.0.1" - "jest-diff" "^24.9.0" - "jest-get-type" "^24.9.0" - "pretty-format" "^24.9.0" - -"jest-message-util@^23.4.0": - "integrity" "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=" - "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz" - "version" "23.4.0" - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - "chalk" "^2.0.1" - "micromatch" "^2.3.11" - "slash" "^1.0.0" - "stack-utils" "^1.0.1" - -"jest-mock@^23.2.0": - "integrity" "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" - "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz" - "version" "23.2.0" - -"jest-pnp-resolver@1.0.2": - "integrity" "sha512-H2DvUlwdMedNGv4FOliPDnxani6ATWy70xe2eckGJgkLoMaWzRPqpSlc5ShqX0Ltk5OhRQvPQY2LLZPOpgcc7g==" - "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.0.2.tgz" - "version" "1.0.2" - -"jest-regex-util@^23.3.0": - "integrity" "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=" - "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz" - "version" "23.3.0" - -"jest-resolve-dependencies@^23.6.0": - "integrity" "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==" - "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "jest-regex-util" "^23.3.0" - "jest-snapshot" "^23.6.0" - -"jest-resolve@*", "jest-resolve@^23.6.0", "jest-resolve@23.6.0": - "integrity" "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==" - "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "browser-resolve" "^1.11.3" - "chalk" "^2.0.1" - "realpath-native" "^1.0.0" - -"jest-runner@^23.6.0": - "integrity" "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==" - "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "exit" "^0.1.2" - "graceful-fs" "^4.1.11" - "jest-config" "^23.6.0" - "jest-docblock" "^23.2.0" - "jest-haste-map" "^23.6.0" - "jest-jasmine2" "^23.6.0" - "jest-leak-detector" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-runtime" "^23.6.0" - "jest-util" "^23.4.0" - "jest-worker" "^23.2.0" - "source-map-support" "^0.5.6" - "throat" "^4.0.0" - -"jest-runtime@^23.6.0": - "integrity" "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==" - "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "babel-core" "^6.0.0" - "babel-plugin-istanbul" "^4.1.6" - "chalk" "^2.0.1" - "convert-source-map" "^1.4.0" - "exit" "^0.1.2" - "fast-json-stable-stringify" "^2.0.0" - "graceful-fs" "^4.1.11" - "jest-config" "^23.6.0" - "jest-haste-map" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-regex-util" "^23.3.0" - "jest-resolve" "^23.6.0" - "jest-snapshot" "^23.6.0" - "jest-util" "^23.4.0" - "jest-validate" "^23.6.0" - "micromatch" "^2.3.11" - "realpath-native" "^1.0.0" - "slash" "^1.0.0" - "strip-bom" "3.0.0" - "write-file-atomic" "^2.1.0" - "yargs" "^11.0.0" - -"jest-serializer@^23.0.1": - "integrity" "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=" - "resolved" "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz" - "version" "23.0.1" - -"jest-snapshot@^23.6.0": - "integrity" "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==" - "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "babel-types" "^6.0.0" - "chalk" "^2.0.1" - "jest-diff" "^23.6.0" - "jest-matcher-utils" "^23.6.0" - "jest-message-util" "^23.4.0" - "jest-resolve" "^23.6.0" - "mkdirp" "^0.5.1" - "natural-compare" "^1.4.0" - "pretty-format" "^23.6.0" - "semver" "^5.5.0" - -"jest-util@^23.4.0": - "integrity" "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=" - "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz" - "version" "23.4.0" - dependencies: - "callsites" "^2.0.0" - "chalk" "^2.0.1" - "graceful-fs" "^4.1.11" - "is-ci" "^1.0.10" - "jest-message-util" "^23.4.0" - "mkdirp" "^0.5.1" - "slash" "^1.0.0" - "source-map" "^0.6.0" - -"jest-validate@^23.6.0": - "integrity" "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==" - "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "chalk" "^2.0.1" - "jest-get-type" "^22.1.0" - "leven" "^2.1.0" - "pretty-format" "^23.6.0" - -"jest-watch-typeahead@^0.2.1": - "integrity" "sha512-xdhEtKSj0gmnkDQbPTIHvcMmXNUDzYpHLEJ5TFqlaI+schi2NI96xhWiZk9QoesAS7oBmKwWWsHazTrYl2ORgg==" - "resolved" "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.2.1.tgz" - "version" "0.2.1" - dependencies: - "ansi-escapes" "^3.0.0" - "chalk" "^2.4.1" - "jest-watcher" "^23.1.0" - "slash" "^2.0.0" - "string-length" "^2.0.0" - "strip-ansi" "^5.0.0" - -"jest-watcher@^23.1.0", "jest-watcher@^23.4.0": - "integrity" "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=" - "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz" - "version" "23.4.0" - dependencies: - "ansi-escapes" "^3.0.0" - "chalk" "^2.0.1" - "string-length" "^2.0.0" - -"jest-worker@^23.2.0": - "integrity" "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=" - "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz" - "version" "23.2.0" - dependencies: - "merge-stream" "^1.0.1" - -"jest@23.6.0": - "integrity" "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==" - "resolved" "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "import-local" "^1.0.0" - "jest-cli" "^23.6.0" - -"joi@^11.1.1": - "integrity" "sha512-O7Uw+w/zEWgbL6OcHbyACKSj0PkQeUgmehdoXVSxt92QFCq4+1390Rwh5moI2K/OgC7D8RHRZqHZxT2husMJHA==" - "resolved" "https://registry.npmjs.org/joi/-/joi-11.4.0.tgz" - "version" "11.4.0" - dependencies: - "hoek" "4.x.x" - "isemail" "3.x.x" - "topo" "2.x.x" - -"js-levenshtein@^1.1.3": - "integrity" "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" - "resolved" "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" - "version" "1.1.6" - -"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"js-tokens@^3.0.2": - "integrity" "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - "version" "3.0.2" - -"js-yaml@^3.12.0", "js-yaml@^3.13.1", "js-yaml@^3.7.0": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"jsbn@~0.1.0": - "integrity" "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - "version" "0.1.1" - -"jsdom@^11.5.1": - "integrity" "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==" - "resolved" "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz" - "version" "11.12.0" - dependencies: - "abab" "^2.0.0" - "acorn" "^5.5.3" - "acorn-globals" "^4.1.0" - "array-equal" "^1.0.0" - "cssom" ">= 0.3.2 < 0.4.0" - "cssstyle" "^1.0.0" - "data-urls" "^1.0.0" - "domexception" "^1.0.1" - "escodegen" "^1.9.1" - "html-encoding-sniffer" "^1.0.2" - "left-pad" "^1.3.0" - "nwsapi" "^2.0.7" - "parse5" "4.0.0" - "pn" "^1.1.0" - "request" "^2.87.0" - "request-promise-native" "^1.0.5" - "sax" "^1.2.4" - "symbol-tree" "^3.2.2" - "tough-cookie" "^2.3.4" - "w3c-hr-time" "^1.0.1" - "webidl-conversions" "^4.0.2" - "whatwg-encoding" "^1.0.3" - "whatwg-mimetype" "^2.1.0" - "whatwg-url" "^6.4.1" - "ws" "^5.2.0" - "xml-name-validator" "^3.0.0" - -"jsesc@^1.3.0": - "integrity" "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" - "version" "1.3.0" - -"jsesc@^2.5.1": - "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - "version" "2.5.2" - -"jsesc@~0.5.0": - "integrity" "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - "version" "0.5.0" - -"json-parse-better-errors@^1.0.1", "json-parse-better-errors@^1.0.2": - "integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - "resolved" "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" - "version" "1.0.2" - -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" - -"json-schema@0.2.3": - "integrity" "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" - "version" "0.2.3" - -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" - -"json-stable-stringify@^1.0.1": - "integrity" "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" - "resolved" "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "jsonify" "~0.0.0" - -"json-stringify-safe@~5.0.1": - "integrity" "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - "version" "5.0.1" - -"json3@^3.3.2": - "integrity" "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - "resolved" "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz" - "version" "3.3.3" - -"json5@^0.5.1": - "integrity" "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - "resolved" "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" - "version" "0.5.1" - -"json5@^1.0.1": - "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" - "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "minimist" "^1.2.0" - -"json5@^2.1.0", "json5@^2.1.2": - "integrity" "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==" - "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" - "version" "2.2.0" - dependencies: - "minimist" "^1.2.5" - -"jsonfile@^4.0.0": - "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - "version" "4.0.0" - optionalDependencies: - "graceful-fs" "^4.1.6" - -"jsonify@~0.0.0": - "integrity" "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - "resolved" "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - "version" "0.0.0" - -"jsprim@^1.2.2": - "integrity" "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=" - "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" - "version" "1.4.1" - dependencies: - "assert-plus" "1.0.0" - "extsprintf" "1.3.0" - "json-schema" "0.2.3" - "verror" "1.10.0" - -"jsx-ast-utils@^2.0.1": - "integrity" "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==" - "resolved" "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz" - "version" "2.4.1" - dependencies: - "array-includes" "^3.1.1" - "object.assign" "^4.1.0" - -"killable@^1.0.0": - "integrity" "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - "resolved" "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz" - "version" "1.0.1" - -"kind-of@^2.0.1": - "integrity" "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-buffer" "^1.0.2" - -"kind-of@^3.0.2", "kind-of@^3.0.3", "kind-of@^3.2.0": - "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - "version" "3.2.2" - dependencies: - "is-buffer" "^1.1.5" - -"kind-of@^4.0.0": - "integrity" "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "is-buffer" "^1.1.5" - -"kind-of@^5.0.0": - "integrity" "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" - "version" "5.1.0" - -"kind-of@^6.0.0": - "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - "version" "6.0.3" - -"kind-of@^6.0.2": - "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - "version" "6.0.3" - -"kleur@^2.0.1": - "integrity" "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" - "resolved" "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz" - "version" "2.0.2" - -"last-call-webpack-plugin@^3.0.0": - "integrity" "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==" - "resolved" "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "lodash" "^4.17.5" - "webpack-sources" "^1.1.0" - -"lazy-cache@^0.2.3": - "integrity" "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz" - "version" "0.2.7" - -"lazy-cache@^1.0.3": - "integrity" "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" - "version" "1.0.4" - -"lcid@^2.0.0": - "integrity" "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==" - "resolved" "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "invert-kv" "^2.0.0" - -"left-pad@^1.3.0": - "integrity" "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - "resolved" "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz" - "version" "1.3.0" - -"leven@^2.1.0": - "integrity" "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - "resolved" "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz" - "version" "2.1.0" - -"levn@^0.3.0", "levn@~0.3.0": - "integrity" "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "prelude-ls" "~1.1.2" - "type-check" "~0.3.2" - -"load-json-file@^1.0.0": - "integrity" "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" - "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "graceful-fs" "^4.1.2" - "parse-json" "^2.2.0" - "pify" "^2.0.0" - "pinkie-promise" "^2.0.0" - "strip-bom" "^2.0.0" - -"load-json-file@^2.0.0": - "integrity" "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" - "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "graceful-fs" "^4.1.2" - "parse-json" "^2.2.0" - "pify" "^2.0.0" - "strip-bom" "^3.0.0" - -"loader-fs-cache@^1.0.0": - "integrity" "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==" - "resolved" "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "find-cache-dir" "^0.1.1" - "mkdirp" "^0.5.1" - -"loader-runner@^2.3.0": - "integrity" "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - "resolved" "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" - "version" "2.4.0" - -"loader-utils@^1.0.1", "loader-utils@^1.0.2", "loader-utils@^1.1.0": - "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==" - "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "big.js" "^5.2.2" - "emojis-list" "^3.0.0" - "json5" "^1.0.1" - -"loader-utils@1.2.3": - "integrity" "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==" - "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" - "version" "1.2.3" - dependencies: - "big.js" "^5.2.2" - "emojis-list" "^2.0.0" - "json5" "^1.0.1" - -"locate-path@^2.0.0": - "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "p-locate" "^2.0.0" - "path-exists" "^3.0.0" - -"locate-path@^3.0.0": - "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-locate" "^3.0.0" - "path-exists" "^3.0.0" - -"lodash._reinterpolate@^3.0.0": - "integrity" "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - "resolved" "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" - "version" "3.0.0" - -"lodash.camelcase@^4.3.0": - "integrity" "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - "resolved" "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - "version" "4.3.0" - -"lodash.debounce@^4.0.8": - "integrity" "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - "version" "4.0.8" - -"lodash.memoize@^4.1.2": - "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - "version" "4.1.2" - -"lodash.sortby@^4.7.0": - "integrity" "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - "resolved" "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" - "version" "4.7.0" - -"lodash.tail@^4.1.1": - "integrity" "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - "resolved" "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz" - "version" "4.1.1" - -"lodash.template@^4.4.0": - "integrity" "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==" - "resolved" "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" - "version" "4.5.0" - dependencies: - "lodash._reinterpolate" "^3.0.0" - "lodash.templatesettings" "^4.0.0" - -"lodash.templatesettings@^4.0.0": - "integrity" "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==" - "resolved" "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "lodash._reinterpolate" "^3.0.0" - -"lodash.uniq@^4.5.0": - "integrity" "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - "version" "4.5.0" - -"lodash@^4.17.10", "lodash@^4.17.11", "lodash@^4.17.12", "lodash@^4.17.14", "lodash@^4.17.19", "lodash@^4.17.20", "lodash@^4.17.21", "lodash@^4.17.4", "lodash@^4.17.5", "lodash@>=3.5 <5": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"loglevel@^1.4.1": - "integrity" "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - "resolved" "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz" - "version" "1.7.1" - -"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.4.0": - "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" - "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "js-tokens" "^3.0.0 || ^4.0.0" - -"lower-case@^1.1.1": - "integrity" "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" - "version" "1.1.4" - -"lru-cache@^5.1.1": - "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "yallist" "^3.0.2" - -"lz-string@^1.4.4": - "integrity" "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" - "resolved" "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" - "version" "1.4.4" - -"make-dir@^2.0.0": - "integrity" "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==" - "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "pify" "^4.0.1" - "semver" "^5.6.0" - -"makeerror@1.0.x": - "integrity" "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=" - "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" - "version" "1.0.11" - dependencies: - "tmpl" "1.0.x" - -"map-age-cleaner@^0.1.1": - "integrity" "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==" - "resolved" "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz" - "version" "0.1.3" - dependencies: - "p-defer" "^1.0.0" - -"map-cache@^0.2.2": - "integrity" "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - "resolved" "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" - "version" "0.2.2" - -"map-visit@^1.0.0": - "integrity" "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=" - "resolved" "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "object-visit" "^1.0.0" - -"math-random@^1.0.1": - "integrity" "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" - "resolved" "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz" - "version" "1.0.4" - -"md5.js@^1.3.4": - "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==" - "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - "version" "1.3.5" - dependencies: - "hash-base" "^3.0.0" - "inherits" "^2.0.1" - "safe-buffer" "^5.1.2" - -"mdn-data@2.0.14": - "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - "version" "2.0.14" - -"mdn-data@2.0.4": - "integrity" "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" - "version" "2.0.4" - -"media-typer@0.3.0": - "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - "version" "0.3.0" - -"mem@^4.0.0": - "integrity" "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==" - "resolved" "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "map-age-cleaner" "^0.1.1" - "mimic-fn" "^2.0.0" - "p-is-promise" "^2.0.0" - -"memory-fs@^0.5.0": - "integrity" "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==" - "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" - "version" "0.5.0" - dependencies: - "errno" "^0.1.3" - "readable-stream" "^2.0.1" - -"memory-fs@~0.4.1": - "integrity" "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=" - "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" - "version" "0.4.1" - dependencies: - "errno" "^0.1.3" - "readable-stream" "^2.0.1" - -"merge-deep@^3.0.2": - "integrity" "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==" - "resolved" "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz" - "version" "3.0.3" - dependencies: - "arr-union" "^3.1.0" - "clone-deep" "^0.2.4" - "kind-of" "^3.0.2" - -"merge-descriptors@1.0.1": - "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - "version" "1.0.1" - -"merge-stream@^1.0.1": - "integrity" "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=" - "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "readable-stream" "^2.0.1" - -"merge@^1.2.0": - "integrity" "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" - "resolved" "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz" - "version" "1.2.1" - -"merge2@^1.2.3": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"methods@~1.1.2": - "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - "version" "1.1.2" - -"micromatch@^2.3.11": - "integrity" "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" - "version" "2.3.11" - dependencies: - "arr-diff" "^2.0.0" - "array-unique" "^0.2.1" - "braces" "^1.8.2" - "expand-brackets" "^0.1.4" - "extglob" "^0.3.1" - "filename-regex" "^2.0.0" - "is-extglob" "^1.0.0" - "is-glob" "^2.0.1" - "kind-of" "^3.0.2" - "normalize-path" "^2.0.1" - "object.omit" "^2.0.0" - "parse-glob" "^3.0.4" - "regex-cache" "^0.4.2" - -"micromatch@^3.1.10": - "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - "version" "3.1.10" - dependencies: - "arr-diff" "^4.0.0" - "array-unique" "^0.3.2" - "braces" "^2.3.1" - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "extglob" "^2.0.4" - "fragment-cache" "^0.2.1" - "kind-of" "^6.0.2" - "nanomatch" "^1.2.9" - "object.pick" "^1.3.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.2" - -"micromatch@^3.1.4": - "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - "version" "3.1.10" - dependencies: - "arr-diff" "^4.0.0" - "array-unique" "^0.3.2" - "braces" "^2.3.1" - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "extglob" "^2.0.4" - "fragment-cache" "^0.2.1" - "kind-of" "^6.0.2" - "nanomatch" "^1.2.9" - "object.pick" "^1.3.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.2" - -"micromatch@^3.1.8": - "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - "version" "3.1.10" - dependencies: - "arr-diff" "^4.0.0" - "array-unique" "^0.3.2" - "braces" "^2.3.1" - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "extglob" "^2.0.4" - "fragment-cache" "^0.2.1" - "kind-of" "^6.0.2" - "nanomatch" "^1.2.9" - "object.pick" "^1.3.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.2" - -"micromatch@^3.1.9": - "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - "version" "3.1.10" - dependencies: - "arr-diff" "^4.0.0" - "array-unique" "^0.3.2" - "braces" "^2.3.1" - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "extglob" "^2.0.4" - "fragment-cache" "^0.2.1" - "kind-of" "^6.0.2" - "nanomatch" "^1.2.9" - "object.pick" "^1.3.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.2" - -"miller-rabin@^4.0.0": - "integrity" "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==" - "resolved" "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "bn.js" "^4.0.0" - "brorand" "^1.0.1" - -"mime-db@>= 1.43.0 < 2", "mime-db@1.49.0": - "integrity" "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" - "version" "1.49.0" - -"mime-types@^2.1.12", "mime-types@~2.1.17", "mime-types@~2.1.19", "mime-types@~2.1.24": - "integrity" "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" - "version" "2.1.32" - dependencies: - "mime-db" "1.49.0" - -"mime@^2.0.3", "mime@^2.3.1": - "integrity" "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - "resolved" "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz" - "version" "2.5.2" - -"mime@1.6.0": - "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - "version" "1.6.0" - -"mimic-fn@^1.0.0": - "integrity" "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" - "version" "1.2.0" - -"mimic-fn@^2.0.0": - "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - "version" "2.1.0" - -"min-indent@^1.0.0": - "integrity" "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - "resolved" "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - "version" "1.0.1" - -"mini-css-extract-plugin@0.5.0": - "integrity" "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==" - "resolved" "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz" - "version" "0.5.0" - dependencies: - "loader-utils" "^1.1.0" - "schema-utils" "^1.0.0" - "webpack-sources" "^1.1.0" - -"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1": - "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - "version" "1.0.1" - -"minimalistic-crypto-utils@^1.0.1": - "integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - "version" "1.0.1" - -"minimatch@^3.0.3", "minimatch@^3.0.4", "minimatch@3.0.4": - "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "brace-expansion" "^1.1.7" - -"minimist@^1.1.1", "minimist@^1.2.0", "minimist@^1.2.5": - "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" - "version" "1.2.5" - -"mississippi@^3.0.0": - "integrity" "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==" - "resolved" "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "concat-stream" "^1.5.0" - "duplexify" "^3.4.2" - "end-of-stream" "^1.1.0" - "flush-write-stream" "^1.0.0" - "from2" "^2.1.0" - "parallel-transform" "^1.1.0" - "pump" "^3.0.0" - "pumpify" "^1.3.3" - "stream-each" "^1.1.0" - "through2" "^2.0.0" - -"mixin-deep@^1.2.0": - "integrity" "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==" - "resolved" "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "for-in" "^1.0.2" - "is-extendable" "^1.0.1" - -"mixin-object@^2.0.1": - "integrity" "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=" - "resolved" "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "for-in" "^0.1.3" - "is-extendable" "^0.1.1" - -"mkdirp@^0.5.1", "mkdirp@^0.5.5", "mkdirp@~0.5.0", "mkdirp@~0.5.1": - "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - "version" "0.5.5" - dependencies: - "minimist" "^1.2.5" - -"move-concurrently@^1.0.1": - "integrity" "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=" - "resolved" "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "aproba" "^1.1.1" - "copy-concurrently" "^1.0.0" - "fs-write-stream-atomic" "^1.0.8" - "mkdirp" "^0.5.1" - "rimraf" "^2.5.4" - "run-queue" "^1.0.3" - -"ms@^2.1.1", "ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"ms@2.0.0": - "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - "version" "2.0.0" - -"ms@2.1.1": - "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - "version" "2.1.1" - -"multicast-dns-service-types@^1.1.0": - "integrity" "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - "resolved" "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" - "version" "1.1.0" - -"multicast-dns@^6.0.1": - "integrity" "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==" - "resolved" "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" - "version" "6.2.3" - dependencies: - "dns-packet" "^1.3.1" - "thunky" "^1.0.2" - -"mute-stream@0.0.7": - "integrity" "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" - "version" "0.0.7" - -"nanomatch@^1.2.9": - "integrity" "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==" - "resolved" "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" - "version" "1.2.13" - dependencies: - "arr-diff" "^4.0.0" - "array-unique" "^0.3.2" - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "fragment-cache" "^0.2.1" - "is-windows" "^1.0.2" - "kind-of" "^6.0.2" - "object.pick" "^1.3.0" - "regex-not" "^1.0.0" - "snapdragon" "^0.8.1" - "to-regex" "^3.0.1" - -"natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" - -"negotiator@0.6.2": - "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - "version" "0.6.2" - -"neo-async@^2.5.0", "neo-async@^2.6.0": - "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - "resolved" "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - "version" "2.6.2" - -"nice-try@^1.0.4": - "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - "version" "1.0.5" - -"no-case@^2.2.0": - "integrity" "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==" - "resolved" "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" - "version" "2.3.2" - dependencies: - "lower-case" "^1.1.1" - -"node-forge@^0.10.0": - "integrity" "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - "resolved" "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" - "version" "0.10.0" - -"node-int64@^0.4.0": - "integrity" "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - "version" "0.4.0" - -"node-libs-browser@^2.0.0": - "integrity" "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==" - "resolved" "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" - "version" "2.2.1" - dependencies: - "assert" "^1.1.1" - "browserify-zlib" "^0.2.0" - "buffer" "^4.3.0" - "console-browserify" "^1.1.0" - "constants-browserify" "^1.0.0" - "crypto-browserify" "^3.11.0" - "domain-browser" "^1.1.1" - "events" "^3.0.0" - "https-browserify" "^1.0.0" - "os-browserify" "^0.3.0" - "path-browserify" "0.0.1" - "process" "^0.11.10" - "punycode" "^1.2.4" - "querystring-es3" "^0.2.0" - "readable-stream" "^2.3.3" - "stream-browserify" "^2.0.1" - "stream-http" "^2.7.2" - "string_decoder" "^1.0.0" - "timers-browserify" "^2.0.4" - "tty-browserify" "0.0.0" - "url" "^0.11.0" - "util" "^0.11.0" - "vm-browserify" "^1.0.1" - -"node-notifier@^5.2.1": - "integrity" "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==" - "resolved" "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz" - "version" "5.4.5" - dependencies: - "growly" "^1.3.0" - "is-wsl" "^1.1.0" - "semver" "^5.5.0" - "shellwords" "^0.1.1" - "which" "^1.3.0" - -"node-releases@^1.1.3", "node-releases@^1.1.73": - "integrity" "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz" - "version" "1.1.74" - -"normalize-package-data@^2.3.2": - "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" - "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "hosted-git-info" "^2.1.4" - "resolve" "^1.10.0" - "semver" "2 || 3 || 4 || 5" - "validate-npm-package-license" "^3.0.1" - -"normalize-path@^2.0.1", "normalize-path@^2.1.1": - "integrity" "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "remove-trailing-separator" "^1.0.1" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"normalize-range@^0.1.2": - "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - "version" "0.1.2" - -"normalize-url@^3.0.0": - "integrity" "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz" - "version" "3.3.0" - -"npm-run-path@^2.0.0": - "integrity" "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" - "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "path-key" "^2.0.0" - -"nth-check@^1.0.2": - "integrity" "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "boolbase" "~1.0.0" - -"nth-check@^2.0.0": - "integrity" "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "boolbase" "^1.0.0" - -"num2fraction@^1.2.2": - "integrity" "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - "resolved" "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" - "version" "1.2.2" - -"number-is-nan@^1.0.0": - "integrity" "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - "version" "1.0.1" - -"nwsapi@^2.0.7": - "integrity" "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - "resolved" "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" - "version" "2.2.0" - -"oauth-sign@~0.9.0": - "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" - "version" "0.9.0" - -"object-assign@^4.0.1", "object-assign@^4.1.0", "object-assign@^4.1.1", "object-assign@4.1.1": - "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" - -"object-copy@^0.1.0": - "integrity" "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=" - "resolved" "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" - "version" "0.1.0" - dependencies: - "copy-descriptor" "^0.1.0" - "define-property" "^0.2.5" - "kind-of" "^3.0.3" - -"object-hash@^1.1.4": - "integrity" "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz" - "version" "1.3.1" - -"object-inspect@^1.11.0", "object-inspect@^1.9.0": - "integrity" "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" - "version" "1.11.0" - -"object-is@^1.0.1": - "integrity" "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==" - "resolved" "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - "version" "1.1.5" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - -"object-keys@^1.0.12", "object-keys@^1.1.1": - "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - "version" "1.1.1" - -"object-visit@^1.0.0": - "integrity" "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=" - "resolved" "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "isobject" "^3.0.0" - -"object.assign@^4.1.0", "object.assign@^4.1.2": - "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" - "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "call-bind" "^1.0.0" - "define-properties" "^1.1.3" - "has-symbols" "^1.0.1" - "object-keys" "^1.1.1" - -"object.fromentries@^2.0.0": - "integrity" "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==" - "resolved" "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "es-abstract" "^1.18.0-next.2" - "has" "^1.0.3" - -"object.getownpropertydescriptors@^2.0.3", "object.getownpropertydescriptors@^2.1.0", "object.getownpropertydescriptors@^2.1.1": - "integrity" "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==" - "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "es-abstract" "^1.18.0-next.2" - -"object.omit@^2.0.0": - "integrity" "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" - "resolved" "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "for-own" "^0.1.4" - "is-extendable" "^0.1.1" - -"object.pick@^1.3.0": - "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=" - "resolved" "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "isobject" "^3.0.1" - -"object.values@^1.1.0": - "integrity" "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==" - "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "es-abstract" "^1.18.2" - -"obuf@^1.0.0", "obuf@^1.1.2": - "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - "resolved" "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - "version" "1.1.2" - -"on-finished@~2.3.0": - "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" - "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - "version" "2.3.0" - dependencies: - "ee-first" "1.1.1" - -"on-headers@~1.0.2": - "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - "version" "1.0.2" - -"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"onetime@^2.0.0": - "integrity" "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=" - "resolved" "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "mimic-fn" "^1.0.0" - -"opn@^5.1.0", "opn@5.4.0": - "integrity" "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==" - "resolved" "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz" - "version" "5.4.0" - dependencies: - "is-wsl" "^1.1.0" - -"optimize-css-assets-webpack-plugin@5.0.1": - "integrity" "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==" - "resolved" "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "cssnano" "^4.1.0" - "last-call-webpack-plugin" "^3.0.0" - -"optionator@^0.8.1", "optionator@^0.8.2": - "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - "version" "0.8.3" - dependencies: - "deep-is" "~0.1.3" - "fast-levenshtein" "~2.0.6" - "levn" "~0.3.0" - "prelude-ls" "~1.1.2" - "type-check" "~0.3.2" - "word-wrap" "~1.2.3" - -"original@^1.0.0": - "integrity" "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==" - "resolved" "https://registry.npmjs.org/original/-/original-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "url-parse" "^1.4.3" - -"os-browserify@^0.3.0": - "integrity" "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - "resolved" "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" - "version" "0.3.0" - -"os-homedir@^1.0.0": - "integrity" "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - "version" "1.0.2" - -"os-locale@^3.0.0", "os-locale@^3.1.0": - "integrity" "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==" - "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "execa" "^1.0.0" - "lcid" "^2.0.0" - "mem" "^4.0.0" - -"os-tmpdir@^1.0.1", "os-tmpdir@~1.0.2": - "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - "version" "1.0.2" - -"p-defer@^1.0.0": - "integrity" "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - "resolved" "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz" - "version" "1.0.0" - -"p-finally@^1.0.0": - "integrity" "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - "resolved" "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - "version" "1.0.0" - -"p-is-promise@^2.0.0": - "integrity" "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - "resolved" "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz" - "version" "2.1.0" - -"p-limit@^1.1.0": - "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "p-try" "^1.0.0" - -"p-limit@^2.0.0": - "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - "version" "2.3.0" - dependencies: - "p-try" "^2.0.0" - -"p-locate@^2.0.0": - "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "p-limit" "^1.1.0" - -"p-locate@^3.0.0": - "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-limit" "^2.0.0" - -"p-map@^1.1.1": - "integrity" "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - "resolved" "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz" - "version" "1.2.0" - -"p-try@^1.0.0": - "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" - "version" "1.0.0" - -"p-try@^2.0.0": - "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - "version" "2.2.0" - -"pako@~1.0.5": - "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" - "version" "1.0.11" - -"parallel-transform@^1.1.0": - "integrity" "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==" - "resolved" "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "cyclist" "^1.0.1" - "inherits" "^2.0.3" - "readable-stream" "^2.1.5" - -"param-case@2.1.x": - "integrity" "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=" - "resolved" "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "no-case" "^2.2.0" - -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "callsites" "^3.0.0" - -"parse-asn1@^5.0.0", "parse-asn1@^5.1.5": - "integrity" "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==" - "resolved" "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - "version" "5.1.6" - dependencies: - "asn1.js" "^5.2.0" - "browserify-aes" "^1.0.0" - "evp_bytestokey" "^1.0.0" - "pbkdf2" "^3.0.3" - "safe-buffer" "^5.1.1" - -"parse-glob@^3.0.4": - "integrity" "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=" - "resolved" "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "glob-base" "^0.3.0" - "is-dotfile" "^1.0.0" - "is-extglob" "^1.0.0" - "is-glob" "^2.0.0" - -"parse-json@^2.2.0": - "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" - "version" "2.2.0" - dependencies: - "error-ex" "^1.2.0" - -"parse-json@^4.0.0": - "integrity" "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "error-ex" "^1.3.1" - "json-parse-better-errors" "^1.0.1" - -"parse5@4.0.0": - "integrity" "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" - "resolved" "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz" - "version" "4.0.0" - -"parseurl@~1.3.2", "parseurl@~1.3.3": - "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - "version" "1.3.3" - -"pascalcase@^0.1.1": - "integrity" "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - "resolved" "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" - "version" "0.1.1" - -"path-browserify@0.0.1": - "integrity" "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - "resolved" "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" - "version" "0.0.1" - -"path-dirname@^1.0.0": - "integrity" "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - "resolved" "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" - "version" "1.0.2" - -"path-exists@^2.0.0": - "integrity" "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "pinkie-promise" "^2.0.0" - -"path-exists@^3.0.0": - "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - "version" "3.0.0" - -"path-is-absolute@^1.0.0", "path-is-absolute@^1.0.1": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-is-inside@^1.0.1", "path-is-inside@^1.0.2": - "integrity" "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - "version" "1.0.2" - -"path-key@^2.0.0", "path-key@^2.0.1": - "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - "version" "2.0.1" - -"path-parse@^1.0.5", "path-parse@^1.0.6": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-to-regexp@0.1.7": - "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - "version" "0.1.7" - -"path-type@^1.0.0": - "integrity" "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "graceful-fs" "^4.1.2" - "pify" "^2.0.0" - "pinkie-promise" "^2.0.0" - -"path-type@^2.0.0": - "integrity" "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "pify" "^2.0.0" - -"path-type@^3.0.0": - "integrity" "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "pify" "^3.0.0" - -"pbkdf2@^3.0.3": - "integrity" "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==" - "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "create-hash" "^1.1.2" - "create-hmac" "^1.1.4" - "ripemd160" "^2.0.1" - "safe-buffer" "^5.0.1" - "sha.js" "^2.4.8" - -"performance-now@^2.1.0": - "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - "version" "2.1.0" - -"picomatch@^2.0.4", "picomatch@^2.2.1": - "integrity" "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" - "version" "2.3.0" - -"pify@^2.0.0": - "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - "version" "2.3.0" - -"pify@^3.0.0": - "integrity" "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - "resolved" "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" - "version" "3.0.0" - -"pify@^4.0.1": - "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - "version" "4.0.1" - -"pinkie-promise@^2.0.0": - "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" - "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "pinkie" "^2.0.0" - -"pinkie@^2.0.0": - "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - "version" "2.0.4" - -"pkg-dir@^1.0.0": - "integrity" "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=" - "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "find-up" "^1.0.0" - -"pkg-dir@^2.0.0": - "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" - "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "find-up" "^2.1.0" - -"pkg-dir@^3.0.0": - "integrity" "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==" - "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "find-up" "^3.0.0" - -"pkg-up@2.0.0": - "integrity" "sha1-yBmscoBZpGHKscOImivjxJoATX8=" - "resolved" "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "find-up" "^2.1.0" - -"pluralize@^7.0.0": - "integrity" "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - "resolved" "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz" - "version" "7.0.0" - -"pn@^1.1.0": - "integrity" "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - "resolved" "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz" - "version" "1.1.0" - -"pnp-webpack-plugin@1.2.1": - "integrity" "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==" - "resolved" "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "ts-pnp" "^1.0.0" - -"portfinder@^1.0.9": - "integrity" "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==" - "resolved" "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz" - "version" "1.0.28" - dependencies: - "async" "^2.6.2" - "debug" "^3.1.1" - "mkdirp" "^0.5.5" - -"posix-character-classes@^0.1.0": - "integrity" "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - "resolved" "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" - "version" "0.1.1" - -"postcss-attribute-case-insensitive@^4.0.0": - "integrity" "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==" - "resolved" "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "postcss" "^7.0.2" - "postcss-selector-parser" "^6.0.2" - -"postcss-calc@^7.0.1": - "integrity" "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==" - "resolved" "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz" - "version" "7.0.5" - dependencies: - "postcss" "^7.0.27" - "postcss-selector-parser" "^6.0.2" - "postcss-value-parser" "^4.0.2" - -"postcss-color-functional-notation@^2.0.1": - "integrity" "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==" - "resolved" "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-color-gray@^5.0.0": - "integrity" "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==" - "resolved" "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "@csstools/convert-colors" "^1.4.0" - "postcss" "^7.0.5" - "postcss-values-parser" "^2.0.0" - -"postcss-color-hex-alpha@^5.0.2": - "integrity" "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==" - "resolved" "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz" - "version" "5.0.3" - dependencies: - "postcss" "^7.0.14" - "postcss-values-parser" "^2.0.1" - -"postcss-color-mod-function@^3.0.3": - "integrity" "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==" - "resolved" "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz" - "version" "3.0.3" - dependencies: - "@csstools/convert-colors" "^1.4.0" - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-color-rebeccapurple@^4.0.1": - "integrity" "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==" - "resolved" "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-colormin@^4.0.3": - "integrity" "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==" - "resolved" "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "browserslist" "^4.0.0" - "color" "^3.0.0" - "has" "^1.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-convert-values@^4.0.1": - "integrity" "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==" - "resolved" "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-custom-media@^7.0.7": - "integrity" "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==" - "resolved" "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz" - "version" "7.0.8" - dependencies: - "postcss" "^7.0.14" - -"postcss-custom-properties@^8.0.9": - "integrity" "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==" - "resolved" "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz" - "version" "8.0.11" - dependencies: - "postcss" "^7.0.17" - "postcss-values-parser" "^2.0.1" - -"postcss-custom-selectors@^5.1.2": - "integrity" "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==" - "resolved" "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "postcss" "^7.0.2" - "postcss-selector-parser" "^5.0.0-rc.3" - -"postcss-dir-pseudo-class@^5.0.0": - "integrity" "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==" - "resolved" "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "postcss" "^7.0.2" - "postcss-selector-parser" "^5.0.0-rc.3" - -"postcss-discard-comments@^4.0.2": - "integrity" "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==" - "resolved" "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "postcss" "^7.0.0" - -"postcss-discard-duplicates@^4.0.2": - "integrity" "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==" - "resolved" "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "postcss" "^7.0.0" - -"postcss-discard-empty@^4.0.1": - "integrity" "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==" - "resolved" "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - -"postcss-discard-overridden@^4.0.1": - "integrity" "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==" - "resolved" "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - -"postcss-double-position-gradients@^1.0.0": - "integrity" "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==" - "resolved" "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "postcss" "^7.0.5" - "postcss-values-parser" "^2.0.0" - -"postcss-env-function@^2.0.2": - "integrity" "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==" - "resolved" "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-flexbugs-fixes@4.1.0": - "integrity" "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==" - "resolved" "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "postcss" "^7.0.0" - -"postcss-focus-visible@^4.0.0": - "integrity" "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==" - "resolved" "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-focus-within@^3.0.0": - "integrity" "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==" - "resolved" "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-font-variant@^4.0.0": - "integrity" "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==" - "resolved" "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.2" - -"postcss-gap-properties@^2.0.0": - "integrity" "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==" - "resolved" "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-image-set-function@^3.0.1": - "integrity" "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==" - "resolved" "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-initial@^3.0.0": - "integrity" "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==" - "resolved" "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "postcss" "^7.0.2" - -"postcss-lab-function@^2.0.1": - "integrity" "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==" - "resolved" "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "@csstools/convert-colors" "^1.4.0" - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-load-config@^2.0.0": - "integrity" "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==" - "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "cosmiconfig" "^5.0.0" - "import-cwd" "^2.0.0" - -"postcss-loader@3.0.0": - "integrity" "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==" - "resolved" "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "loader-utils" "^1.1.0" - "postcss" "^7.0.0" - "postcss-load-config" "^2.0.0" - "schema-utils" "^1.0.0" - -"postcss-logical@^3.0.0": - "integrity" "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==" - "resolved" "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-media-minmax@^4.0.0": - "integrity" "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==" - "resolved" "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-merge-longhand@^4.0.11": - "integrity" "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==" - "resolved" "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz" - "version" "4.0.11" - dependencies: - "css-color-names" "0.0.4" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - "stylehacks" "^4.0.0" - -"postcss-merge-rules@^4.0.3": - "integrity" "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==" - "resolved" "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "browserslist" "^4.0.0" - "caniuse-api" "^3.0.0" - "cssnano-util-same-parent" "^4.0.0" - "postcss" "^7.0.0" - "postcss-selector-parser" "^3.0.0" - "vendors" "^1.0.0" - -"postcss-minify-font-values@^4.0.2": - "integrity" "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==" - "resolved" "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-minify-gradients@^4.0.2": - "integrity" "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==" - "resolved" "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-arguments" "^4.0.0" - "is-color-stop" "^1.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-minify-params@^4.0.2": - "integrity" "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==" - "resolved" "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "alphanum-sort" "^1.0.0" - "browserslist" "^4.0.0" - "cssnano-util-get-arguments" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - "uniqs" "^2.0.0" - -"postcss-minify-selectors@^4.0.2": - "integrity" "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==" - "resolved" "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "alphanum-sort" "^1.0.0" - "has" "^1.0.0" - "postcss" "^7.0.0" - "postcss-selector-parser" "^3.0.0" - -"postcss-modules-extract-imports@^1.2.0": - "integrity" "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==" - "resolved" "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "postcss" "^6.0.1" - -"postcss-modules-local-by-default@^1.2.0": - "integrity" "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=" - "resolved" "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "css-selector-tokenizer" "^0.7.0" - "postcss" "^6.0.1" - -"postcss-modules-scope@^1.1.0": - "integrity" "sha1-1upkmUx5+XtipytCb75gVqGUu5A=" - "resolved" "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "css-selector-tokenizer" "^0.7.0" - "postcss" "^6.0.1" - -"postcss-modules-values@^1.3.0": - "integrity" "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=" - "resolved" "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "icss-replace-symbols" "^1.1.0" - "postcss" "^6.0.1" - -"postcss-nesting@^7.0.0": - "integrity" "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==" - "resolved" "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "postcss" "^7.0.2" - -"postcss-normalize-charset@^4.0.1": - "integrity" "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==" - "resolved" "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - -"postcss-normalize-display-values@^4.0.2": - "integrity" "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==" - "resolved" "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-match" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-positions@^4.0.2": - "integrity" "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==" - "resolved" "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-arguments" "^4.0.0" - "has" "^1.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-repeat-style@^4.0.2": - "integrity" "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==" - "resolved" "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-arguments" "^4.0.0" - "cssnano-util-get-match" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-string@^4.0.2": - "integrity" "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==" - "resolved" "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "has" "^1.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-timing-functions@^4.0.2": - "integrity" "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==" - "resolved" "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-match" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-unicode@^4.0.1": - "integrity" "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==" - "resolved" "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "browserslist" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-url@^4.0.1": - "integrity" "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==" - "resolved" "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "is-absolute-url" "^2.0.0" - "normalize-url" "^3.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-normalize-whitespace@^4.0.2": - "integrity" "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==" - "resolved" "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-ordered-values@^4.1.2": - "integrity" "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==" - "resolved" "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "cssnano-util-get-arguments" "^4.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-overflow-shorthand@^2.0.0": - "integrity" "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==" - "resolved" "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-page-break@^2.0.0": - "integrity" "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==" - "resolved" "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-place@^4.0.1": - "integrity" "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==" - "resolved" "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.2" - "postcss-values-parser" "^2.0.0" - -"postcss-preset-env@6.5.0": - "integrity" "sha512-RdsIrYJd9p9AouQoJ8dFP5ksBJEIegA4q4WzJDih8nevz3cZyIP/q1Eaw3pTVpUAu3n7Y32YmvAW3X07mSRGkw==" - "resolved" "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.5.0.tgz" - "version" "6.5.0" - dependencies: - "autoprefixer" "^9.4.2" - "browserslist" "^4.3.5" - "caniuse-lite" "^1.0.30000918" - "css-blank-pseudo" "^0.1.4" - "css-has-pseudo" "^0.10.0" - "css-prefers-color-scheme" "^3.1.1" - "cssdb" "^4.3.0" - "postcss" "^7.0.6" - "postcss-attribute-case-insensitive" "^4.0.0" - "postcss-color-functional-notation" "^2.0.1" - "postcss-color-gray" "^5.0.0" - "postcss-color-hex-alpha" "^5.0.2" - "postcss-color-mod-function" "^3.0.3" - "postcss-color-rebeccapurple" "^4.0.1" - "postcss-custom-media" "^7.0.7" - "postcss-custom-properties" "^8.0.9" - "postcss-custom-selectors" "^5.1.2" - "postcss-dir-pseudo-class" "^5.0.0" - "postcss-double-position-gradients" "^1.0.0" - "postcss-env-function" "^2.0.2" - "postcss-focus-visible" "^4.0.0" - "postcss-focus-within" "^3.0.0" - "postcss-font-variant" "^4.0.0" - "postcss-gap-properties" "^2.0.0" - "postcss-image-set-function" "^3.0.1" - "postcss-initial" "^3.0.0" - "postcss-lab-function" "^2.0.1" - "postcss-logical" "^3.0.0" - "postcss-media-minmax" "^4.0.0" - "postcss-nesting" "^7.0.0" - "postcss-overflow-shorthand" "^2.0.0" - "postcss-page-break" "^2.0.0" - "postcss-place" "^4.0.1" - "postcss-pseudo-class-any-link" "^6.0.0" - "postcss-replace-overflow-wrap" "^3.0.0" - "postcss-selector-matches" "^4.0.0" - "postcss-selector-not" "^4.0.0" - -"postcss-pseudo-class-any-link@^6.0.0": - "integrity" "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==" - "resolved" "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "postcss" "^7.0.2" - "postcss-selector-parser" "^5.0.0-rc.3" - -"postcss-reduce-initial@^4.0.3": - "integrity" "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==" - "resolved" "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "browserslist" "^4.0.0" - "caniuse-api" "^3.0.0" - "has" "^1.0.0" - "postcss" "^7.0.0" - -"postcss-reduce-transforms@^4.0.2": - "integrity" "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==" - "resolved" "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "cssnano-util-get-match" "^4.0.0" - "has" "^1.0.0" - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - -"postcss-replace-overflow-wrap@^3.0.0": - "integrity" "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==" - "resolved" "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "postcss" "^7.0.2" - -"postcss-safe-parser@4.0.1": - "integrity" "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==" - "resolved" "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "postcss" "^7.0.0" - -"postcss-selector-matches@^4.0.0": - "integrity" "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==" - "resolved" "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "balanced-match" "^1.0.0" - "postcss" "^7.0.2" - -"postcss-selector-not@^4.0.0": - "integrity" "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==" - "resolved" "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "balanced-match" "^1.0.0" - "postcss" "^7.0.2" - -"postcss-selector-parser@^3.0.0": - "integrity" "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "dot-prop" "^5.2.0" - "indexes-of" "^1.0.1" - "uniq" "^1.0.1" - -"postcss-selector-parser@^5.0.0-rc.3": - "integrity" "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "cssesc" "^2.0.0" - "indexes-of" "^1.0.1" - "uniq" "^1.0.1" - -"postcss-selector-parser@^5.0.0-rc.4": - "integrity" "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "cssesc" "^2.0.0" - "indexes-of" "^1.0.1" - "uniq" "^1.0.1" - -"postcss-selector-parser@^6.0.2": - "integrity" "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz" - "version" "6.0.6" - dependencies: - "cssesc" "^3.0.0" - "util-deprecate" "^1.0.2" - -"postcss-svgo@^4.0.3": - "integrity" "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==" - "resolved" "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "postcss" "^7.0.0" - "postcss-value-parser" "^3.0.0" - "svgo" "^1.0.0" - -"postcss-unique-selectors@^4.0.1": - "integrity" "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==" - "resolved" "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "alphanum-sort" "^1.0.0" - "postcss" "^7.0.0" - "uniqs" "^2.0.0" - -"postcss-value-parser@^3.0.0", "postcss-value-parser@^3.3.0": - "integrity" "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" - "version" "3.3.1" - -"postcss-value-parser@^4.0.2": - "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" - "version" "4.1.0" - -"postcss-value-parser@^4.1.0": - "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" - "version" "4.1.0" - -"postcss-values-parser@^2.0.0", "postcss-values-parser@^2.0.1": - "integrity" "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==" - "resolved" "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "flatten" "^1.0.2" - "indexes-of" "^1.0.1" - "uniq" "^1.0.1" - -"postcss@^6.0.1", "postcss@^6.0.23": - "integrity" "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" - "version" "6.0.23" - dependencies: - "chalk" "^2.4.1" - "source-map" "^0.6.1" - "supports-color" "^5.4.0" - -"postcss@^7.0.0": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.1": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.14": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.17": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.2": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.27": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.32": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.5": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"postcss@^7.0.6": - "integrity" "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - "version" "7.0.36" - dependencies: - "chalk" "^2.4.2" - "source-map" "^0.6.1" - "supports-color" "^6.1.0" - -"prelude-ls@~1.1.2": - "integrity" "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - "version" "1.1.2" - -"preserve@^0.2.0": - "integrity" "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - "resolved" "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" - "version" "0.2.0" - -"pretty-bytes@^4.0.2": - "integrity" "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" - "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz" - "version" "4.0.2" - -"pretty-error@^2.0.2": - "integrity" "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==" - "resolved" "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "lodash" "^4.17.20" - "renderkid" "^2.0.4" - -"pretty-format@^23.6.0": - "integrity" "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz" - "version" "23.6.0" - dependencies: - "ansi-regex" "^3.0.0" - "ansi-styles" "^3.2.0" - -"pretty-format@^24.0.0": - "integrity" "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "@jest/types" "^24.9.0" - "ansi-regex" "^4.0.0" - "ansi-styles" "^3.2.0" - "react-is" "^16.8.4" - -"pretty-format@^24.3.0": - "integrity" "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "@jest/types" "^24.9.0" - "ansi-regex" "^4.0.0" - "ansi-styles" "^3.2.0" - "react-is" "^16.8.4" - -"pretty-format@^24.9.0": - "integrity" "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz" - "version" "24.9.0" - dependencies: - "@jest/types" "^24.9.0" - "ansi-regex" "^4.0.0" - "ansi-styles" "^3.2.0" - "react-is" "^16.8.4" - -"pretty-format@^25.1.0": - "integrity" "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz" - "version" "25.5.0" - dependencies: - "@jest/types" "^25.5.0" - "ansi-regex" "^5.0.0" - "ansi-styles" "^4.0.0" - "react-is" "^16.12.0" - -"pretty-format@^27.0.2": - "integrity" "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz" - "version" "27.0.6" - dependencies: - "@jest/types" "^27.0.6" - "ansi-regex" "^5.0.0" - "ansi-styles" "^5.0.0" - "react-is" "^17.0.1" - -"private@^0.1.8": - "integrity" "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - "resolved" "https://registry.npmjs.org/private/-/private-0.1.8.tgz" - "version" "0.1.8" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"process@^0.11.10": - "integrity" "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - "version" "0.11.10" - -"progress@^2.0.0": - "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - "version" "2.0.3" - -"promise-inflight@^1.0.1": - "integrity" "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - "resolved" "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" - "version" "1.0.1" - -"promise@8.0.2": - "integrity" "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==" - "resolved" "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz" - "version" "8.0.2" - dependencies: - "asap" "~2.0.6" - -"prompts@^0.1.9": - "integrity" "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==" - "resolved" "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz" - "version" "0.1.14" - dependencies: - "kleur" "^2.0.1" - "sisteransi" "^0.1.1" - -"prop-types@^15.6.2", "prop-types@^15.7.2": - "integrity" "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==" - "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" - "version" "15.7.2" - dependencies: - "loose-envify" "^1.4.0" - "object-assign" "^4.1.1" - "react-is" "^16.8.1" - -"proxy-addr@~2.0.5": - "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" - "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - "version" "2.0.7" - dependencies: - "forwarded" "0.2.0" - "ipaddr.js" "1.9.1" - -"prr@~1.0.1": - "integrity" "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - "resolved" "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - "version" "1.0.1" - -"psl@^1.1.28": - "integrity" "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - "resolved" "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" - "version" "1.8.0" - -"public-encrypt@^4.0.0": - "integrity" "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==" - "resolved" "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "bn.js" "^4.1.0" - "browserify-rsa" "^4.0.0" - "create-hash" "^1.1.0" - "parse-asn1" "^5.0.0" - "randombytes" "^2.0.1" - "safe-buffer" "^5.1.2" - -"pump@^2.0.0": - "integrity" "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==" - "resolved" "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "end-of-stream" "^1.1.0" - "once" "^1.3.1" - -"pump@^3.0.0": - "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" - "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "end-of-stream" "^1.1.0" - "once" "^1.3.1" - -"pumpify@^1.3.3": - "integrity" "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==" - "resolved" "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" - "version" "1.5.1" - dependencies: - "duplexify" "^3.6.0" - "inherits" "^2.0.3" - "pump" "^2.0.0" - -"punycode@^1.2.4": - "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - "version" "1.4.1" - -"punycode@^2.1.0", "punycode@^2.1.1", "punycode@2.x.x": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" - -"punycode@1.3.2": - "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - "version" "1.3.2" - -"q@^1.1.2": - "integrity" "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - "resolved" "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - "version" "1.5.1" - -"qs@~6.5.2": - "integrity" "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" - "version" "6.5.2" - -"qs@6.7.0": - "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" - "version" "6.7.0" - -"querystring-es3@^0.2.0": - "integrity" "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - "resolved" "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" - "version" "0.2.1" - -"querystring@0.2.0": - "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - "version" "0.2.0" - -"querystringify@^2.1.1": - "integrity" "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - "resolved" "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - "version" "2.2.0" - -"raf@3.4.1": - "integrity" "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==" - "resolved" "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" - "version" "3.4.1" - dependencies: - "performance-now" "^2.1.0" - -"randomatic@^3.0.0": - "integrity" "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==" - "resolved" "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "is-number" "^4.0.0" - "kind-of" "^6.0.0" - "math-random" "^1.0.1" - -"randombytes@^2.0.0", "randombytes@^2.0.1", "randombytes@^2.0.5": - "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "safe-buffer" "^5.1.0" - -"randomfill@^1.0.3": - "integrity" "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==" - "resolved" "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "randombytes" "^2.0.5" - "safe-buffer" "^5.1.0" - -"range-parser@^1.0.3", "range-parser@~1.2.1": - "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - "version" "1.2.1" - -"raw-body@2.4.0": - "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==" - "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" - "version" "2.4.0" - dependencies: - "bytes" "3.1.0" - "http-errors" "1.7.2" - "iconv-lite" "0.4.24" - "unpipe" "1.0.0" - -"react-app-polyfill@^0.2.2": - "integrity" "sha512-mAYn96B/nB6kWG87Ry70F4D4rsycU43VYTj3ZCbKP+SLJXwC0x6YCbwcICh3uW8/C9s1VgP197yx+w7SCWeDdQ==" - "resolved" "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "core-js" "2.6.4" - "object-assign" "4.1.1" - "promise" "8.0.2" - "raf" "3.4.1" - "whatwg-fetch" "3.0.0" - -"react-charts@^3.0.0-beta.32": - "integrity" "sha512-Qi400sol2X+NPHWH022TZa6T+GgjqOr1B2ilcAx6bzOX88UQzpuogBH+fmXNh4gGua+Xa15Y9TURV0r33fX3Gg==" - "resolved" "https://registry.npmjs.org/react-charts/-/react-charts-3.0.0-beta.32.tgz" - "version" "3.0.0-beta.32" - dependencies: - "@babel/runtime" "^7.14.6" - "@reach/observe-rect" "^1.2.0" - "@types/d3-array" "^3.0.1" - "@types/d3-scale" "^4.0.1" - "@types/d3-shape" "^3.0.1" - "@types/raf" "^3.4.0" - "@types/react" "^17.0.14" - "@types/react-dom" "^17.0.9" - "d3-array" "^2.12.1" - "d3-delaunay" "5.3.0" - "d3-scale" "^3.3.0" - "d3-shape" "^2.1.0" - "d3-time" "^2.1.1" - "ts-toolbelt" "^9.6.0" - -"react-dev-utils@^8.0.0": - "integrity" "sha512-TK8cj7eghvxfe7bfBluLGpI/upo4EXC+G74hYmPucAG8C2XcbT+vKnlWPwLnABb75Zk+mR6D556Da+yvDjljrw==" - "resolved" "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-8.0.0.tgz" - "version" "8.0.0" - dependencies: - "@babel/code-frame" "7.0.0" - "address" "1.0.3" - "browserslist" "4.4.1" - "chalk" "2.4.2" - "cross-spawn" "6.0.5" - "detect-port-alt" "1.1.6" - "escape-string-regexp" "1.0.5" - "filesize" "3.6.1" - "find-up" "3.0.0" - "fork-ts-checker-webpack-plugin" "1.0.0-alpha.6" - "global-modules" "2.0.0" - "globby" "8.0.2" - "gzip-size" "5.0.0" - "immer" "1.10.0" - "inquirer" "6.2.1" - "is-root" "2.0.0" - "loader-utils" "1.2.3" - "opn" "5.4.0" - "pkg-up" "2.0.0" - "react-error-overlay" "^5.1.4" - "recursive-readdir" "2.2.2" - "shell-quote" "1.6.1" - "sockjs-client" "1.3.0" - "strip-ansi" "5.0.0" - "text-table" "0.2.0" - -"react-dom@*", "react-dom@^17.0.2", "react-dom@>=16": - "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" - "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - "version" "17.0.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - "scheduler" "^0.20.2" - -"react-error-overlay@^5.1.4": - "integrity" "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" - "resolved" "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz" - "version" "5.1.6" - -"react-fast-compare@^3.0.1": - "integrity" "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" - "version" "3.2.0" - -"react-is@^16.12.0", "react-is@^16.8.4": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-is@^16.13.1": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-is@^16.7.0": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-is@^16.8.1": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-is@^17.0.1": - "integrity" "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - "version" "17.0.2" - -"react-popper@^2.2.5": - "integrity" "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==" - "resolved" "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz" - "version" "2.2.5" - dependencies: - "react-fast-compare" "^3.0.1" - "warning" "^4.0.2" - -"react-redux@^7.2.1", "react-redux@^7.2.3": - "integrity" "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==" - "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz" - "version" "7.2.4" - dependencies: - "@babel/runtime" "^7.12.1" - "@types/react-redux" "^7.1.16" - "hoist-non-react-statics" "^3.3.2" - "loose-envify" "^1.4.0" - "prop-types" "^15.7.2" - "react-is" "^16.13.1" - -"react-scripts@^2.0.0": - "integrity" "sha512-mDC8fYWCyuB9VROti8OCPdHE79UEchVVZmuS/yaIs47VkvZpgZqUvzghYBswZRchqnW0aARNY8xXrzoFRhhK7A==" - "resolved" "https://registry.npmjs.org/react-scripts/-/react-scripts-2.1.8.tgz" - "version" "2.1.8" - dependencies: - "@babel/core" "7.2.2" - "@svgr/webpack" "4.1.0" - "babel-core" "7.0.0-bridge.0" - "babel-eslint" "9.0.0" - "babel-jest" "23.6.0" - "babel-loader" "8.0.5" - "babel-plugin-named-asset-import" "^0.3.1" - "babel-preset-react-app" "^7.0.2" - "bfj" "6.1.1" - "case-sensitive-paths-webpack-plugin" "2.2.0" - "css-loader" "1.0.0" - "dotenv" "6.0.0" - "dotenv-expand" "4.2.0" - "eslint" "5.12.0" - "eslint-config-react-app" "^3.0.8" - "eslint-loader" "2.1.1" - "eslint-plugin-flowtype" "2.50.1" - "eslint-plugin-import" "2.14.0" - "eslint-plugin-jsx-a11y" "6.1.2" - "eslint-plugin-react" "7.12.4" - "file-loader" "2.0.0" - "fs-extra" "7.0.1" - "html-webpack-plugin" "4.0.0-alpha.2" - "identity-obj-proxy" "3.0.0" - "jest" "23.6.0" - "jest-pnp-resolver" "1.0.2" - "jest-resolve" "23.6.0" - "jest-watch-typeahead" "^0.2.1" - "mini-css-extract-plugin" "0.5.0" - "optimize-css-assets-webpack-plugin" "5.0.1" - "pnp-webpack-plugin" "1.2.1" - "postcss-flexbugs-fixes" "4.1.0" - "postcss-loader" "3.0.0" - "postcss-preset-env" "6.5.0" - "postcss-safe-parser" "4.0.1" - "react-app-polyfill" "^0.2.2" - "react-dev-utils" "^8.0.0" - "resolve" "1.10.0" - "sass-loader" "7.1.0" - "style-loader" "0.23.1" - "terser-webpack-plugin" "1.2.2" - "url-loader" "1.1.2" - "webpack" "4.28.3" - "webpack-dev-server" "3.1.14" - "webpack-manifest-plugin" "2.0.4" - "workbox-webpack-plugin" "3.6.3" - optionalDependencies: - "fsevents" "1.2.4" - -"react-wait@^0.3.0": - "integrity" "sha512-kB5x/kMKWcn0uVr9gBdNz21/oGbQwEQnF3P9p6E9yLfJ9DRcKS0fagbgYMFI0YFOoyKDj+2q6Rwax0kTYJF37g==" - "resolved" "https://registry.npmjs.org/react-wait/-/react-wait-0.3.0.tgz" - "version" "0.3.0" - -"react@*", "react@^16 || ^17", "react@^16.14.0 || ^17.0.0", "react@^16.8.0 || ^17", "react@^16.8.3 || ^17", "react@^17.0.2", "react@>=16", "react@>=16.7.0-alpha", "react@17.0.2": - "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" - "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - "version" "17.0.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - -"reactjs-popup@^2.0.5": - "integrity" "sha512-b5hv9a6aGsHEHXFAgPO5s1Jw1eSkopueyUVxQewGdLgqk2eW0IVXZrPRpHR629YcgIpC2oxtX8OOZ8a7bQJbxA==" - "resolved" "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-2.0.5.tgz" - "version" "2.0.5" - -"read-pkg-up@^1.0.1": - "integrity" "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" - "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "find-up" "^1.0.0" - "read-pkg" "^1.0.0" - -"read-pkg-up@^2.0.0": - "integrity" "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=" - "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "find-up" "^2.0.0" - "read-pkg" "^2.0.0" - -"read-pkg@^1.0.0": - "integrity" "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" - "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "load-json-file" "^1.0.0" - "normalize-package-data" "^2.3.2" - "path-type" "^1.0.0" - -"read-pkg@^2.0.0": - "integrity" "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" - "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "load-json-file" "^2.0.0" - "normalize-package-data" "^2.3.2" - "path-type" "^2.0.0" - -"readable-stream@^2.0.0", "readable-stream@^2.0.1", "readable-stream@^2.0.2", "readable-stream@^2.1.5", "readable-stream@^2.2.2", "readable-stream@^2.3.3", "readable-stream@^2.3.6", "readable-stream@~2.3.6", "readable-stream@1 || 2": - "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - "version" "2.3.7" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readable-stream@^3.0.6": - "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "inherits" "^2.0.3" - "string_decoder" "^1.1.1" - "util-deprecate" "^1.0.1" - -"readable-stream@^3.6.0": - "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "inherits" "^2.0.3" - "string_decoder" "^1.1.1" - "util-deprecate" "^1.0.1" - -"readdirp@^2.2.1": - "integrity" "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" - "version" "2.2.1" - dependencies: - "graceful-fs" "^4.1.11" - "micromatch" "^3.1.10" - "readable-stream" "^2.0.2" - -"readdirp@~3.6.0": - "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "picomatch" "^2.2.1" - -"realpath-native@^1.0.0": - "integrity" "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==" - "resolved" "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "util.promisify" "^1.0.0" - -"recursive-readdir@2.2.2": - "integrity" "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==" - "resolved" "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" - "version" "2.2.2" - dependencies: - "minimatch" "3.0.4" - -"redent@^3.0.0": - "integrity" "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==" - "resolved" "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "indent-string" "^4.0.0" - "strip-indent" "^3.0.0" - -"redux-thunk@^2.3.0": - "integrity" "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - "resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz" - "version" "2.3.0" - -"redux@^4.0.0", "redux@^4.1.0": - "integrity" "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==" - "resolved" "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz" - "version" "4.1.1" - dependencies: - "@babel/runtime" "^7.9.2" - -"regenerate-unicode-properties@^8.2.0": - "integrity" "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==" - "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" - "version" "8.2.0" - dependencies: - "regenerate" "^1.4.0" - -"regenerate@^1.4.0": - "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - "version" "1.4.2" - -"regenerator-runtime@^0.11.0": - "integrity" "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" - "version" "0.11.1" - -"regenerator-runtime@^0.12.0": - "integrity" "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz" - "version" "0.12.1" - -"regenerator-runtime@^0.13.4": - "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - "version" "0.13.9" - -"regenerator-transform@^0.14.2": - "integrity" "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==" - "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" - "version" "0.14.5" - dependencies: - "@babel/runtime" "^7.8.4" - -"regex-cache@^0.4.2": - "integrity" "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==" - "resolved" "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" - "version" "0.4.4" - dependencies: - "is-equal-shallow" "^0.1.3" - -"regex-not@^1.0.0", "regex-not@^1.0.2": - "integrity" "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==" - "resolved" "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "extend-shallow" "^3.0.2" - "safe-regex" "^1.1.0" - -"regexp.prototype.flags@^1.2.0": - "integrity" "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==" - "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - -"regexpp@^2.0.1": - "integrity" "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" - "version" "2.0.1" - -"regexpu-core@^4.7.1": - "integrity" "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==" - "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz" - "version" "4.7.1" - dependencies: - "regenerate" "^1.4.0" - "regenerate-unicode-properties" "^8.2.0" - "regjsgen" "^0.5.1" - "regjsparser" "^0.6.4" - "unicode-match-property-ecmascript" "^1.0.4" - "unicode-match-property-value-ecmascript" "^1.2.0" - -"regjsgen@^0.5.1": - "integrity" "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" - "version" "0.5.2" - -"regjsparser@^0.6.4": - "integrity" "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==" - "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz" - "version" "0.6.9" - dependencies: - "jsesc" "~0.5.0" - -"relateurl@0.2.x": - "integrity" "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - "resolved" "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - "version" "0.2.7" - -"remove-trailing-separator@^1.0.1": - "integrity" "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - "resolved" "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" - "version" "1.1.0" - -"renderkid@^2.0.4": - "integrity" "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==" - "resolved" "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz" - "version" "2.0.7" - dependencies: - "css-select" "^4.1.3" - "dom-converter" "^0.2.0" - "htmlparser2" "^6.1.0" - "lodash" "^4.17.21" - "strip-ansi" "^3.0.1" - -"repeat-element@^1.1.2": - "integrity" "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" - "resolved" "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" - "version" "1.1.4" - -"repeat-string@^1.5.2", "repeat-string@^1.6.1": - "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - "version" "1.6.1" - -"repeating@^2.0.0": - "integrity" "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" - "resolved" "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-finite" "^1.0.0" - -"request-promise-core@1.1.4": - "integrity" "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==" - "resolved" "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "lodash" "^4.17.19" - -"request-promise-native@^1.0.5": - "integrity" "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==" - "resolved" "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" - "version" "1.0.9" - dependencies: - "request-promise-core" "1.1.4" - "stealthy-require" "^1.1.1" - "tough-cookie" "^2.3.3" - -"request@^2.34", "request@^2.87.0": - "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" - "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz" - "version" "2.88.2" - dependencies: - "aws-sign2" "~0.7.0" - "aws4" "^1.8.0" - "caseless" "~0.12.0" - "combined-stream" "~1.0.6" - "extend" "~3.0.2" - "forever-agent" "~0.6.1" - "form-data" "~2.3.2" - "har-validator" "~5.1.3" - "http-signature" "~1.2.0" - "is-typedarray" "~1.0.0" - "isstream" "~0.1.2" - "json-stringify-safe" "~5.0.1" - "mime-types" "~2.1.19" - "oauth-sign" "~0.9.0" - "performance-now" "^2.1.0" - "qs" "~6.5.2" - "safe-buffer" "^5.1.2" - "tough-cookie" "~2.5.0" - "tunnel-agent" "^0.6.0" - "uuid" "^3.3.2" - -"require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"require-main-filename@^1.0.1": - "integrity" "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" - "version" "1.0.1" - -"requires-port@^1.0.0": - "integrity" "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - "version" "1.0.0" - -"reselect@^4.0.0": - "integrity" "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" - "resolved" "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz" - "version" "4.0.0" - -"resolve-cwd@^2.0.0": - "integrity" "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=" - "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "resolve-from" "^3.0.0" - -"resolve-from@^3.0.0": - "integrity" "sha1-six699nWiBvItuZTM17rywoYh0g=" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" - "version" "3.0.0" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"resolve-url@^0.2.1": - "integrity" "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - "resolved" "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" - "version" "0.2.1" - -"resolve@^1.10.0", "resolve@^1.3.2", "resolve@^1.6.0", "resolve@^1.8.1", "resolve@^1.9.0", "resolve@1.10.0": - "integrity" "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz" - "version" "1.10.0" - dependencies: - "path-parse" "^1.0.6" - -"resolve@^1.14.2": - "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - "version" "1.20.0" - dependencies: - "is-core-module" "^2.2.0" - "path-parse" "^1.0.6" - -"resolve@^1.20.0": - "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - "version" "1.20.0" - dependencies: - "is-core-module" "^2.2.0" - "path-parse" "^1.0.6" - -"resolve@1.1.7": - "integrity" "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - "version" "1.1.7" - -"restore-cursor@^2.0.0": - "integrity" "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=" - "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "onetime" "^2.0.0" - "signal-exit" "^3.0.2" - -"ret@~0.1.10": - "integrity" "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - "resolved" "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" - "version" "0.1.15" - -"rgb-regex@^1.0.1": - "integrity" "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - "resolved" "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz" - "version" "1.0.1" - -"rgba-regex@^1.0.0": - "integrity" "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - "resolved" "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz" - "version" "1.0.0" - -"rimraf@^2.2.8", "rimraf@^2.5.4", "rimraf@^2.6.1", "rimraf@^2.6.3": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"rimraf@~2.6.2": - "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - "version" "2.6.3" - dependencies: - "glob" "^7.1.3" - -"ripemd160@^2.0.0", "ripemd160@^2.0.1": - "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==" - "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "hash-base" "^3.0.0" - "inherits" "^2.0.1" - -"rodemirror@^1.6.3": - "integrity" "sha512-tqBL17eNOKlJhehNQ7uRNAB/Np9Wpc0EvvKjzBqG7oNSx1pU4+5IIPIHyPFGo3mzPAXgQXNgN9Co07V+eGTFeQ==" - "resolved" "https://registry.npmjs.org/rodemirror/-/rodemirror-1.6.3.tgz" - "version" "1.6.3" - -"rsvp@^3.3.3": - "integrity" "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" - "resolved" "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz" - "version" "3.6.2" - -"run-async@^2.2.0": - "integrity" "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - "resolved" "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - "version" "2.4.1" - -"run-queue@^1.0.0", "run-queue@^1.0.3": - "integrity" "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=" - "resolved" "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "aproba" "^1.1.1" - -"rxjs@^6.1.0", "rxjs@^6.4.0": - "integrity" "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==" - "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - "version" "6.6.7" - dependencies: - "tslib" "^1.9.0" - -"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@>=5.1.0", "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safe-buffer@^5.2.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-regex@^1.1.0": - "integrity" "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=" - "resolved" "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "ret" "~0.1.10" - -"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3", "safer-buffer@~2.1.0": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"sane@^2.0.0": - "integrity" "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=" - "resolved" "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz" - "version" "2.5.2" - dependencies: - "anymatch" "^2.0.0" - "capture-exit" "^1.2.0" - "exec-sh" "^0.2.0" - "fb-watchman" "^2.0.0" - "micromatch" "^3.1.4" - "minimist" "^1.1.1" - "walker" "~1.0.5" - "watch" "~0.18.0" - optionalDependencies: - "fsevents" "^1.2.3" - -"sass-loader@7.1.0": - "integrity" "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==" - "resolved" "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz" - "version" "7.1.0" - dependencies: - "clone-deep" "^2.0.1" - "loader-utils" "^1.0.1" - "lodash.tail" "^4.1.1" - "neo-async" "^2.5.0" - "pify" "^3.0.0" - "semver" "^5.5.0" - -"sax@^1.2.4", "sax@~1.2.4": - "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - "version" "1.2.4" - -"scheduler@^0.20.2": - "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==" - "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - "version" "0.20.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - -"schema-utils@^0.4.4": - "integrity" "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==" - "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz" - "version" "0.4.7" - dependencies: - "ajv" "^6.1.0" - "ajv-keywords" "^3.1.0" - -"schema-utils@^1.0.0": - "integrity" "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==" - "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "ajv" "^6.1.0" - "ajv-errors" "^1.0.0" - "ajv-keywords" "^3.1.0" - -"select-hose@^2.0.0": - "integrity" "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - "resolved" "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - "version" "2.0.0" - -"selfsigned@^1.9.1": - "integrity" "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==" - "resolved" "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz" - "version" "1.10.11" - dependencies: - "node-forge" "^0.10.0" - -"semver@^5.3.0", "semver@^5.4.1", "semver@^5.5.0", "semver@^5.5.1", "semver@^5.6.0", "semver@2 || 3 || 4 || 5": - "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - "version" "5.7.1" - -"semver@^6.1.1": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"semver@^6.1.2": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"semver@^6.3.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"semver@7.0.0": - "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - "version" "7.0.0" - -"send@0.17.1": - "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" - "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz" - "version" "0.17.1" - dependencies: - "debug" "2.6.9" - "depd" "~1.1.2" - "destroy" "~1.0.4" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "etag" "~1.8.1" - "fresh" "0.5.2" - "http-errors" "~1.7.2" - "mime" "1.6.0" - "ms" "2.1.1" - "on-finished" "~2.3.0" - "range-parser" "~1.2.1" - "statuses" "~1.5.0" - -"serialize-javascript@^1.4.0": - "integrity" "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" - "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz" - "version" "1.9.1" - -"serve-index@^1.7.2": - "integrity" "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=" - "resolved" "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - "version" "1.9.1" - dependencies: - "accepts" "~1.3.4" - "batch" "0.6.1" - "debug" "2.6.9" - "escape-html" "~1.0.3" - "http-errors" "~1.6.2" - "mime-types" "~2.1.17" - "parseurl" "~1.3.2" - -"serve-static@1.14.1": - "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==" - "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" - "version" "1.14.1" - dependencies: - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "parseurl" "~1.3.3" - "send" "0.17.1" - -"set-blocking@^2.0.0": - "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - "version" "2.0.0" - -"set-value@^2.0.0", "set-value@^2.0.1": - "integrity" "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==" - "resolved" "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "extend-shallow" "^2.0.1" - "is-extendable" "^0.1.1" - "is-plain-object" "^2.0.3" - "split-string" "^3.0.1" - -"setimmediate@^1.0.4": - "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - "version" "1.0.5" - -"setprototypeof@1.1.0": - "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - "version" "1.1.0" - -"setprototypeof@1.1.1": - "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" - "version" "1.1.1" - -"sha.js@^2.4.0", "sha.js@^2.4.8": - "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==" - "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - "version" "2.4.11" - dependencies: - "inherits" "^2.0.1" - "safe-buffer" "^5.0.1" - -"shallow-clone@^0.1.2": - "integrity" "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=" - "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz" - "version" "0.1.2" - dependencies: - "is-extendable" "^0.1.1" - "kind-of" "^2.0.1" - "lazy-cache" "^0.2.3" - "mixin-object" "^2.0.1" - -"shallow-clone@^1.0.0": - "integrity" "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==" - "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "is-extendable" "^0.1.1" - "kind-of" "^5.0.0" - "mixin-object" "^2.0.1" - -"shebang-command@^1.2.0": - "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "shebang-regex" "^1.0.0" - -"shebang-regex@^1.0.0": - "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - "version" "1.0.0" - -"shell-quote@1.6.1": - "integrity" "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=" - "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz" - "version" "1.6.1" - dependencies: - "array-filter" "~0.0.0" - "array-map" "~0.0.0" - "array-reduce" "~0.0.0" - "jsonify" "~0.0.0" - -"shellwords@^0.1.1": - "integrity" "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - "resolved" "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz" - "version" "0.1.1" - -"side-channel@^1.0.4": - "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" - "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "call-bind" "^1.0.0" - "get-intrinsic" "^1.0.2" - "object-inspect" "^1.9.0" - -"signal-exit@^3.0.0", "signal-exit@^3.0.2": - "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" - "version" "3.0.3" - -"simple-swizzle@^0.2.2": - "integrity" "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=" - "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - "version" "0.2.2" - dependencies: - "is-arrayish" "^0.3.1" - -"sisteransi@^0.1.1": - "integrity" "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==" - "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz" - "version" "0.1.1" - -"slash@^1.0.0": - "integrity" "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - "resolved" "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" - "version" "1.0.0" - -"slash@^2.0.0": - "integrity" "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - "resolved" "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" - "version" "2.0.0" - -"slice-ansi@^2.1.0": - "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==" - "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "ansi-styles" "^3.2.0" - "astral-regex" "^1.0.0" - "is-fullwidth-code-point" "^2.0.0" - -"snapdragon-node@^2.0.1": - "integrity" "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==" - "resolved" "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "define-property" "^1.0.0" - "isobject" "^3.0.0" - "snapdragon-util" "^3.0.1" - -"snapdragon-util@^3.0.1": - "integrity" "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==" - "resolved" "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "kind-of" "^3.2.0" - -"snapdragon@^0.8.1": - "integrity" "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==" - "resolved" "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" - "version" "0.8.2" - dependencies: - "base" "^0.11.1" - "debug" "^2.2.0" - "define-property" "^0.2.5" - "extend-shallow" "^2.0.1" - "map-cache" "^0.2.2" - "source-map" "^0.5.6" - "source-map-resolve" "^0.5.0" - "use" "^3.1.0" - -"sockjs-client@1.3.0": - "integrity" "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==" - "resolved" "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "debug" "^3.2.5" - "eventsource" "^1.0.7" - "faye-websocket" "~0.11.1" - "inherits" "^2.0.3" - "json3" "^3.3.2" - "url-parse" "^1.4.3" - -"sockjs@0.3.19": - "integrity" "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==" - "resolved" "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz" - "version" "0.3.19" - dependencies: - "faye-websocket" "^0.10.0" - "uuid" "^3.0.1" - -"source-list-map@^2.0.0": - "integrity" "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - "resolved" "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" - "version" "2.0.1" - -"source-map-resolve@^0.5.0", "source-map-resolve@^0.5.2": - "integrity" "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==" - "resolved" "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" - "version" "0.5.3" - dependencies: - "atob" "^2.1.2" - "decode-uri-component" "^0.2.0" - "resolve-url" "^0.2.1" - "source-map-url" "^0.4.0" - "urix" "^0.1.0" - -"source-map-support@^0.4.15": - "integrity" "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" - "version" "0.4.18" - dependencies: - "source-map" "^0.5.6" - -"source-map-support@^0.5.6", "source-map-support@~0.5.10": - "integrity" "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" - "version" "0.5.19" - dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" - -"source-map-url@^0.4.0": - "integrity" "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - "resolved" "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" - "version" "0.4.1" - -"source-map@^0.5.0": - "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - "version" "0.5.7" - -"source-map@^0.5.3": - "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - "version" "0.5.7" - -"source-map@^0.5.6", "source-map@^0.5.7": - "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - "version" "0.5.7" - -"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.0", "source-map@~0.6.1": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" - -"spdx-correct@^3.0.0": - "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==" - "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "spdx-expression-parse" "^3.0.0" - "spdx-license-ids" "^3.0.0" - -"spdx-exceptions@^2.1.0": - "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - "version" "2.3.0" - -"spdx-expression-parse@^3.0.0": - "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" - "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "spdx-exceptions" "^2.1.0" - "spdx-license-ids" "^3.0.0" - -"spdx-license-ids@^3.0.0": - "integrity" "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" - "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz" - "version" "3.0.10" - -"spdy-transport@^3.0.0": - "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==" - "resolved" "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "debug" "^4.1.0" - "detect-node" "^2.0.4" - "hpack.js" "^2.1.6" - "obuf" "^1.1.2" - "readable-stream" "^3.0.6" - "wbuf" "^1.7.3" - -"spdy@^4.0.0": - "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==" - "resolved" "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "debug" "^4.1.0" - "handle-thing" "^2.0.0" - "http-deceiver" "^1.2.7" - "select-hose" "^2.0.0" - "spdy-transport" "^3.0.0" - -"split-grid@^1.0.11": - "integrity" "sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ==" - "resolved" "https://registry.npmjs.org/split-grid/-/split-grid-1.0.11.tgz" - "version" "1.0.11" - -"split-string@^3.0.1", "split-string@^3.0.2": - "integrity" "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==" - "resolved" "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "extend-shallow" "^3.0.0" - -"sprintf-js@~1.0.2": - "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" - -"sshpk@^1.7.0": - "integrity" "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==" - "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" - "version" "1.16.1" - dependencies: - "asn1" "~0.2.3" - "assert-plus" "^1.0.0" - "bcrypt-pbkdf" "^1.0.0" - "dashdash" "^1.12.0" - "ecc-jsbn" "~0.1.1" - "getpass" "^0.1.1" - "jsbn" "~0.1.0" - "safer-buffer" "^2.0.2" - "tweetnacl" "~0.14.0" - -"ssri@^6.0.1": - "integrity" "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==" - "resolved" "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "figgy-pudding" "^3.5.1" - -"stable@^0.1.8": - "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - "resolved" "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - "version" "0.1.8" - -"stack-utils@^1.0.1": - "integrity" "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==" - "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "escape-string-regexp" "^2.0.0" - -"static-extend@^0.1.1": - "integrity" "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=" - "resolved" "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" - "version" "0.1.2" - dependencies: - "define-property" "^0.2.5" - "object-copy" "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", "statuses@~1.5.0": - "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - "version" "1.5.0" - -"stealthy-require@^1.1.1": - "integrity" "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - "resolved" "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" - "version" "1.1.1" - -"stream-browserify@^2.0.1": - "integrity" "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==" - "resolved" "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "inherits" "~2.0.1" - "readable-stream" "^2.0.2" - -"stream-each@^1.1.0": - "integrity" "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==" - "resolved" "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" - "version" "1.2.3" - dependencies: - "end-of-stream" "^1.1.0" - "stream-shift" "^1.0.0" - -"stream-http@^2.7.2": - "integrity" "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==" - "resolved" "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" - "version" "2.8.3" - dependencies: - "builtin-status-codes" "^3.0.0" - "inherits" "^2.0.1" - "readable-stream" "^2.3.6" - "to-arraybuffer" "^1.0.0" - "xtend" "^4.0.0" - -"stream-shift@^1.0.0": - "integrity" "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - "resolved" "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - "version" "1.0.1" - -"string_decoder@^1.0.0", "string_decoder@^1.1.1", "string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "safe-buffer" "~5.1.0" - -"string-length@^2.0.0": - "integrity" "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=" - "resolved" "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "astral-regex" "^1.0.0" - "strip-ansi" "^4.0.0" - -"string-width@^1.0.1": - "integrity" "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "code-point-at" "^1.0.0" - "is-fullwidth-code-point" "^1.0.0" - "strip-ansi" "^3.0.0" - -"string-width@^2.0.0", "string-width@^2.1.0", "string-width@^2.1.1": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" - -"string-width@^3.0.0": - "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "emoji-regex" "^7.0.1" - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^5.1.0" - -"string.prototype.trimend@^1.0.4": - "integrity" "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==" - "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - -"string.prototype.trimstart@^1.0.4": - "integrity" "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==" - "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - -"stringify-object@^3.2.2": - "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==" - "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "get-own-enumerable-property-symbols" "^3.0.0" - "is-obj" "^1.0.1" - "is-regexp" "^1.0.0" - -"strip-ansi@^3.0.0", "strip-ansi@^3.0.1": - "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "ansi-regex" "^2.0.0" - -"strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "ansi-regex" "^3.0.0" - -"strip-ansi@^5.0.0": - "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "ansi-regex" "^4.1.0" - -"strip-ansi@^5.1.0": - "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "ansi-regex" "^4.1.0" - -"strip-ansi@5.0.0": - "integrity" "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "ansi-regex" "^4.0.0" - -"strip-bom@^2.0.0": - "integrity" "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "is-utf8" "^0.2.0" - -"strip-bom@^3.0.0": - "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" - -"strip-bom@3.0.0": - "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" - -"strip-comments@^1.0.2": - "integrity" "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==" - "resolved" "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "babel-extract-comments" "^1.0.0" - "babel-plugin-transform-object-rest-spread" "^6.26.0" - -"strip-eof@^1.0.0": - "integrity" "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - "resolved" "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - "version" "1.0.0" - -"strip-indent@^3.0.0": - "integrity" "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" - "resolved" "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "min-indent" "^1.0.0" - -"strip-json-comments@^2.0.1": - "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - "version" "2.0.1" - -"style-loader@0.23.1": - "integrity" "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==" - "resolved" "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz" - "version" "0.23.1" - dependencies: - "loader-utils" "^1.1.0" - "schema-utils" "^1.0.0" - -"style-mod@^4.0.0": - "integrity" "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" - "resolved" "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz" - "version" "4.0.0" - -"stylehacks@^4.0.0": - "integrity" "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==" - "resolved" "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "browserslist" "^4.0.0" - "postcss" "^7.0.0" - "postcss-selector-parser" "^3.0.0" - -"supports-color@^2.0.0": - "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - "version" "2.0.0" - -"supports-color@^3.1.2": - "integrity" "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" - "version" "3.2.3" - dependencies: - "has-flag" "^1.0.0" - -"supports-color@^5.1.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^5.3.0", "supports-color@^5.4.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^6.1.0": - "integrity" "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" - -"svg-parser@^2.0.0": - "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - "resolved" "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - "version" "2.0.4" - -"svgo@^1.0.0", "svgo@^1.2.2": - "integrity" "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==" - "resolved" "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "chalk" "^2.4.1" - "coa" "^2.0.2" - "css-select" "^2.0.0" - "css-select-base-adapter" "^0.1.1" - "css-tree" "1.0.0-alpha.37" - "csso" "^4.0.2" - "js-yaml" "^3.13.1" - "mkdirp" "~0.5.1" - "object.values" "^1.1.0" - "sax" "~1.2.4" - "stable" "^0.1.8" - "unquote" "~1.1.1" - "util.promisify" "~1.0.0" - -"symbol-tree@^3.2.2": - "integrity" "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - "resolved" "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" - "version" "3.2.4" - -"table@^5.0.2": - "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==" - "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz" - "version" "5.4.6" - dependencies: - "ajv" "^6.10.2" - "lodash" "^4.17.14" - "slice-ansi" "^2.1.0" - "string-width" "^3.0.0" - -"tapable@^1.0.0", "tapable@^1.1.0": - "integrity" "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - "resolved" "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" - "version" "1.1.3" - -"terser-webpack-plugin@^1.1.0", "terser-webpack-plugin@1.2.2": - "integrity" "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==" - "resolved" "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz" - "version" "1.2.2" - dependencies: - "cacache" "^11.0.2" - "find-cache-dir" "^2.0.0" - "schema-utils" "^1.0.0" - "serialize-javascript" "^1.4.0" - "source-map" "^0.6.1" - "terser" "^3.16.1" - "webpack-sources" "^1.1.0" - "worker-farm" "^1.5.2" - -"terser@^3.16.1": - "integrity" "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==" - "resolved" "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz" - "version" "3.17.0" - dependencies: - "commander" "^2.19.0" - "source-map" "~0.6.1" - "source-map-support" "~0.5.10" - -"test-exclude@^4.2.1": - "integrity" "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==" - "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "arrify" "^1.0.1" - "micromatch" "^2.3.11" - "object-assign" "^4.1.0" - "read-pkg-up" "^1.0.1" - "require-main-filename" "^1.0.1" - -"text-table@^0.2.0", "text-table@0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" - -"throat@^4.0.0": - "integrity" "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" - "resolved" "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz" - "version" "4.1.0" - -"through@^2.3.6": - "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - "version" "2.3.8" - -"through2@^2.0.0": - "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==" - "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - "version" "2.0.5" - dependencies: - "readable-stream" "~2.3.6" - "xtend" "~4.0.1" - -"thunky@^1.0.2": - "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - "resolved" "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - "version" "1.1.0" - -"timers-browserify@^2.0.4": - "integrity" "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==" - "resolved" "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" - "version" "2.0.12" - dependencies: - "setimmediate" "^1.0.4" - -"timsort@^0.3.0": - "integrity" "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - "resolved" "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" - "version" "0.3.0" - -"tmp@^0.0.33": - "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==" - "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - "version" "0.0.33" - dependencies: - "os-tmpdir" "~1.0.2" - -"tmpl@1.0.x": - "integrity" "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz" - "version" "1.0.4" - -"to-arraybuffer@^1.0.0": - "integrity" "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - "resolved" "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" - "version" "1.0.1" - -"to-fast-properties@^1.0.3": - "integrity" "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - "version" "1.0.3" - -"to-fast-properties@^2.0.0": - "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" - -"to-object-path@^0.3.0": - "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=" - "resolved" "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "kind-of" "^3.0.2" - -"to-regex-range@^2.1.0": - "integrity" "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "is-number" "^3.0.0" - "repeat-string" "^1.6.1" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"to-regex@^3.0.1", "to-regex@^3.0.2": - "integrity" "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==" - "resolved" "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "define-property" "^2.0.2" - "extend-shallow" "^3.0.2" - "regex-not" "^1.0.2" - "safe-regex" "^1.1.0" - -"toidentifier@1.0.0": - "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" - "version" "1.0.0" - -"toml@^3.0.0": - "integrity" "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - "resolved" "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" - "version" "3.0.0" - -"topo@2.x.x": - "integrity" "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=" - "resolved" "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "hoek" "4.x.x" - -"tough-cookie@^2.3.3", "tough-cookie@^2.3.4", "tough-cookie@~2.5.0": - "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" - "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "psl" "^1.1.28" - "punycode" "^2.1.1" - -"tr46@^1.0.1": - "integrity" "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=" - "resolved" "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "punycode" "^2.1.0" - -"trim-right@^1.0.1": - "integrity" "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - "resolved" "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" - "version" "1.0.1" - -"tryer@^1.0.0": - "integrity" "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - "resolved" "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" - "version" "1.0.1" - -"ts-pnp@^1.0.0": - "integrity" "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" - "resolved" "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" - "version" "1.2.0" - -"ts-toolbelt@^9.6.0": - "integrity" "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" - "resolved" "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz" - "version" "9.6.0" - -"tslib@^1.9.0": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"tty-browserify@0.0.0": - "integrity" "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - "resolved" "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" - "version" "0.0.0" - -"tunnel-agent@^0.6.0": - "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" - "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - "version" "0.6.0" - dependencies: - "safe-buffer" "^5.0.1" - -"tweetnacl@^0.14.3", "tweetnacl@~0.14.0": - "integrity" "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - "version" "0.14.5" - -"type-check@~0.3.2": - "integrity" "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - "version" "0.3.2" - dependencies: - "prelude-ls" "~1.1.2" - -"type-is@~1.6.17", "type-is@~1.6.18": - "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" - "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - "version" "1.6.18" - dependencies: - "media-typer" "0.3.0" - "mime-types" "~2.1.24" - -"typedarray@^0.0.6": - "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - "version" "0.0.6" - -"uglify-js@^3.1.4", "uglify-js@3.4.x": - "integrity" "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==" - "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz" - "version" "3.4.10" - dependencies: - "commander" "~2.19.0" - "source-map" "~0.6.1" - -"unbox-primitive@^1.0.1": - "integrity" "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==" - "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "function-bind" "^1.1.1" - "has-bigints" "^1.0.1" - "has-symbols" "^1.0.2" - "which-boxed-primitive" "^1.0.2" - -"unicode-canonical-property-names-ecmascript@^1.0.4": - "integrity" "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" - "version" "1.0.4" - -"unicode-match-property-ecmascript@^1.0.4": - "integrity" "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==" - "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "unicode-canonical-property-names-ecmascript" "^1.0.4" - "unicode-property-aliases-ecmascript" "^1.0.4" - -"unicode-match-property-value-ecmascript@^1.2.0": - "integrity" "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" - "version" "1.2.0" - -"unicode-property-aliases-ecmascript@^1.0.4": - "integrity" "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" - "version" "1.1.0" - -"union-value@^1.0.0": - "integrity" "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==" - "resolved" "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "arr-union" "^3.1.0" - "get-value" "^2.0.6" - "is-extendable" "^0.1.1" - "set-value" "^2.0.1" - -"uniq@^1.0.1": - "integrity" "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - "resolved" "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" - "version" "1.0.1" - -"uniqs@^2.0.0": - "integrity" "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - "resolved" "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" - "version" "2.0.0" - -"unique-filename@^1.1.1": - "integrity" "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==" - "resolved" "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "unique-slug" "^2.0.0" - -"unique-slug@^2.0.0": - "integrity" "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==" - "resolved" "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "imurmurhash" "^0.1.4" - -"universalify@^0.1.0": - "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - "version" "0.1.2" - -"unpipe@~1.0.0", "unpipe@1.0.0": - "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - "version" "1.0.0" - -"unquote@~1.1.1": - "integrity" "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - "resolved" "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" - "version" "1.1.1" - -"unset-value@^1.0.0": - "integrity" "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=" - "resolved" "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "has-value" "^0.3.1" - "isobject" "^3.0.0" - -"upath@^1.1.1": - "integrity" "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - "resolved" "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - "version" "1.2.0" - -"upper-case@^1.1.1": - "integrity" "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - "resolved" "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" - "version" "1.1.3" - -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"urix@^0.1.0": - "integrity" "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - "resolved" "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" - "version" "0.1.0" - -"url-loader@1.1.2": - "integrity" "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==" - "resolved" "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "loader-utils" "^1.1.0" - "mime" "^2.0.3" - "schema-utils" "^1.0.0" - -"url-parse@^1.4.3": - "integrity" "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==" - "resolved" "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz" - "version" "1.5.3" - dependencies: - "querystringify" "^2.1.1" - "requires-port" "^1.0.0" - -"url@^0.11.0": - "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=" - "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz" - "version" "0.11.0" - dependencies: - "punycode" "1.3.2" - "querystring" "0.2.0" - -"use@^3.1.0": - "integrity" "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - "resolved" "https://registry.npmjs.org/use/-/use-3.1.1.tgz" - "version" "3.1.1" - -"util-deprecate@^1.0.1", "util-deprecate@^1.0.2", "util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"util.promisify@^1.0.0": - "integrity" "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==" - "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "call-bind" "^1.0.0" - "define-properties" "^1.1.3" - "for-each" "^0.3.3" - "has-symbols" "^1.0.1" - "object.getownpropertydescriptors" "^2.1.1" - -"util.promisify@~1.0.0": - "integrity" "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==" - "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "define-properties" "^1.1.3" - "es-abstract" "^1.17.2" - "has-symbols" "^1.0.1" - "object.getownpropertydescriptors" "^2.1.0" - -"util.promisify@1.0.0": - "integrity" "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==" - "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "define-properties" "^1.1.2" - "object.getownpropertydescriptors" "^2.0.3" - -"util@^0.11.0": - "integrity" "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==" - "resolved" "https://registry.npmjs.org/util/-/util-0.11.1.tgz" - "version" "0.11.1" - dependencies: - "inherits" "2.0.3" - -"util@0.10.3": - "integrity" "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=" - "resolved" "https://registry.npmjs.org/util/-/util-0.10.3.tgz" - "version" "0.10.3" - dependencies: - "inherits" "2.0.1" - -"utila@~0.4": - "integrity" "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - "resolved" "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - "version" "0.4.0" - -"utils-merge@1.0.1": - "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - "version" "1.0.1" - -"uuid@^3.0.1": - "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - "version" "3.4.0" - -"uuid@^3.3.2": - "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - "version" "3.4.0" - -"validate-npm-package-license@^3.0.1": - "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" - "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "spdx-correct" "^3.0.0" - "spdx-expression-parse" "^3.0.0" - -"vary@~1.1.2": - "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - "version" "1.1.2" - -"vendors@^1.0.0": - "integrity" "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - "resolved" "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz" - "version" "1.0.4" - -"verror@1.10.0": - "integrity" "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=" - "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - "version" "1.10.0" - dependencies: - "assert-plus" "^1.0.0" - "core-util-is" "1.0.2" - "extsprintf" "^1.2.0" - -"vis-data@^7.0.0", "vis-data@^7.1.2": - "integrity" "sha512-RPSegFxEcnp3HUEJSzhS2vBdbJ2PSsrYYuhRlpHp2frO/MfRtTYbIkkLZmPkA/Sg3pPfBlR235gcoKbtdm4mbw==" - "resolved" "https://registry.npmjs.org/vis-data/-/vis-data-7.1.2.tgz" - "version" "7.1.2" - -"vis-network@^9.0.5": - "integrity" "sha512-+pun7tQP5UruDo+4GZemeZXoD9fIEApWp5IMwHZ8J29kAGvLN5CPJsqAwaSlty6vEVfmIElfOMZk5bilSRQU5Q==" - "resolved" "https://registry.npmjs.org/vis-network/-/vis-network-9.0.5.tgz" - "version" "9.0.5" - -"vm-browserify@^1.0.1": - "integrity" "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - "resolved" "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" - "version" "1.1.2" - -"w3c-hr-time@^1.0.1": - "integrity" "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==" - "resolved" "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "browser-process-hrtime" "^1.0.0" - -"w3c-keyname@^2.2.4": - "integrity" "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" - "resolved" "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz" - "version" "2.2.4" - -"wait-for-expect@^3.0.2": - "integrity" "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==" - "resolved" "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz" - "version" "3.0.2" - -"walker@~1.0.5": - "integrity" "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=" - "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz" - "version" "1.0.7" - dependencies: - "makeerror" "1.0.x" - -"warning@^4.0.2": - "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==" - "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "loose-envify" "^1.0.0" - -"watch@~0.18.0": - "integrity" "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=" - "resolved" "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz" - "version" "0.18.0" - dependencies: - "exec-sh" "^0.2.0" - "minimist" "^1.2.0" - -"watchpack-chokidar2@^2.0.1": - "integrity" "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==" - "resolved" "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "chokidar" "^2.1.8" - -"watchpack@^1.5.0": - "integrity" "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==" - "resolved" "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" - "version" "1.7.5" - dependencies: - "graceful-fs" "^4.1.2" - "neo-async" "^2.5.0" - optionalDependencies: - "chokidar" "^3.4.1" - "watchpack-chokidar2" "^2.0.1" - -"wbuf@^1.1.0", "wbuf@^1.7.3": - "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==" - "resolved" "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - "version" "1.7.3" - dependencies: - "minimalistic-assert" "^1.0.0" - -"webidl-conversions@^4.0.2": - "integrity" "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" - "version" "4.0.2" - -"webpack-dev-middleware@3.4.0": - "integrity" "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==" - "resolved" "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz" - "version" "3.4.0" - dependencies: - "memory-fs" "~0.4.1" - "mime" "^2.3.1" - "range-parser" "^1.0.3" - "webpack-log" "^2.0.0" - -"webpack-dev-server@3.1.14": - "integrity" "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==" - "resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz" - "version" "3.1.14" - dependencies: - "ansi-html" "0.0.7" - "bonjour" "^3.5.0" - "chokidar" "^2.0.0" - "compression" "^1.5.2" - "connect-history-api-fallback" "^1.3.0" - "debug" "^3.1.0" - "del" "^3.0.0" - "express" "^4.16.2" - "html-entities" "^1.2.0" - "http-proxy-middleware" "~0.18.0" - "import-local" "^2.0.0" - "internal-ip" "^3.0.1" - "ip" "^1.1.5" - "killable" "^1.0.0" - "loglevel" "^1.4.1" - "opn" "^5.1.0" - "portfinder" "^1.0.9" - "schema-utils" "^1.0.0" - "selfsigned" "^1.9.1" - "semver" "^5.6.0" - "serve-index" "^1.7.2" - "sockjs" "0.3.19" - "sockjs-client" "1.3.0" - "spdy" "^4.0.0" - "strip-ansi" "^3.0.0" - "supports-color" "^5.1.0" - "url" "^0.11.0" - "webpack-dev-middleware" "3.4.0" - "webpack-log" "^2.0.0" - "yargs" "12.0.2" - -"webpack-log@^2.0.0": - "integrity" "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==" - "resolved" "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "ansi-colors" "^3.0.0" - "uuid" "^3.3.2" - -"webpack-manifest-plugin@2.0.4": - "integrity" "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==" - "resolved" "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "fs-extra" "^7.0.0" - "lodash" ">=3.5 <5" - "tapable" "^1.0.0" - -"webpack-sources@^1.1.0", "webpack-sources@^1.3.0": - "integrity" "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==" - "resolved" "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" - "version" "1.4.3" - dependencies: - "source-list-map" "^2.0.0" - "source-map" "~0.6.1" - -"webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^3.0.0 || ^4.0.0", "webpack@^4.0.0", "webpack@^4.4.0", "webpack@>=2", "webpack@>=2.0.0 <5.0.0", "webpack@2 || 3 || 4", "webpack@4.28.3": - "integrity" "sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg==" - "resolved" "https://registry.npmjs.org/webpack/-/webpack-4.28.3.tgz" - "version" "4.28.3" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/wasm-edit" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "acorn" "^5.6.2" - "acorn-dynamic-import" "^3.0.0" - "ajv" "^6.1.0" - "ajv-keywords" "^3.1.0" - "chrome-trace-event" "^1.0.0" - "enhanced-resolve" "^4.1.0" - "eslint-scope" "^4.0.0" - "json-parse-better-errors" "^1.0.2" - "loader-runner" "^2.3.0" - "loader-utils" "^1.1.0" - "memory-fs" "~0.4.1" - "micromatch" "^3.1.8" - "mkdirp" "~0.5.0" - "neo-async" "^2.5.0" - "node-libs-browser" "^2.0.0" - "schema-utils" "^0.4.4" - "tapable" "^1.1.0" - "terser-webpack-plugin" "^1.1.0" - "watchpack" "^1.5.0" - "webpack-sources" "^1.3.0" - -"websocket-driver@>=0.5.1": - "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" - "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - "version" "0.7.4" - dependencies: - "http-parser-js" ">=0.5.1" - "safe-buffer" ">=5.1.0" - "websocket-extensions" ">=0.1.1" - -"websocket-extensions@>=0.1.1": - "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - "version" "0.1.4" - -"whatwg-encoding@^1.0.1", "whatwg-encoding@^1.0.3": - "integrity" "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==" - "resolved" "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "iconv-lite" "0.4.24" - -"whatwg-fetch@3.0.0": - "integrity" "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - "resolved" "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz" - "version" "3.0.0" - -"whatwg-mimetype@^2.1.0", "whatwg-mimetype@^2.2.0": - "integrity" "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - "resolved" "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" - "version" "2.3.0" - -"whatwg-url@^6.4.1": - "integrity" "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz" - "version" "6.5.0" - dependencies: - "lodash.sortby" "^4.7.0" - "tr46" "^1.0.1" - "webidl-conversions" "^4.0.2" - -"whatwg-url@^7.0.0": - "integrity" "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" - "version" "7.1.0" - dependencies: - "lodash.sortby" "^4.7.0" - "tr46" "^1.0.1" - "webidl-conversions" "^4.0.2" - -"which-boxed-primitive@^1.0.2": - "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" - "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "is-bigint" "^1.0.1" - "is-boolean-object" "^1.1.0" - "is-number-object" "^1.0.4" - "is-string" "^1.0.5" - "is-symbol" "^1.0.3" - -"which-module@^2.0.0": - "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - "version" "2.0.0" - -"which@^1.2.12", "which@^1.2.9", "which@^1.3.0", "which@^1.3.1": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"word-wrap@~1.2.3": - "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - "version" "1.2.3" - -"wordwrap@^1.0.0": - "integrity" "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - "version" "1.0.0" - -"workbox-background-sync@^3.6.3": - "integrity" "sha512-ypLo0B6dces4gSpaslmDg5wuoUWrHHVJfFWwl1udvSylLdXvnrfhFfriCS42SNEe5lsZtcNZF27W/SMzBlva7Q==" - "resolved" "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-broadcast-cache-update@^3.6.3": - "integrity" "sha512-pJl4lbClQcvp0SyTiEw0zLSsVYE1RDlCPtpKnpMjxFtu8lCFTAEuVyzxp9w7GF4/b3P4h5nyQ+q7V9mIR7YzGg==" - "resolved" "https://registry.npmjs.org/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-build@^3.6.3": - "integrity" "sha512-w0clZ/pVjL8VXy6GfthefxpEXs0T8uiRuopZSFVQ8ovfbH6c6kUpEh6DcYwm/Y6dyWPiCucdyAZotgjz+nRz8g==" - "resolved" "https://registry.npmjs.org/workbox-build/-/workbox-build-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "babel-runtime" "^6.26.0" - "common-tags" "^1.4.0" - "fs-extra" "^4.0.2" - "glob" "^7.1.2" - "joi" "^11.1.1" - "lodash.template" "^4.4.0" - "pretty-bytes" "^4.0.2" - "stringify-object" "^3.2.2" - "strip-comments" "^1.0.2" - "workbox-background-sync" "^3.6.3" - "workbox-broadcast-cache-update" "^3.6.3" - "workbox-cache-expiration" "^3.6.3" - "workbox-cacheable-response" "^3.6.3" - "workbox-core" "^3.6.3" - "workbox-google-analytics" "^3.6.3" - "workbox-navigation-preload" "^3.6.3" - "workbox-precaching" "^3.6.3" - "workbox-range-requests" "^3.6.3" - "workbox-routing" "^3.6.3" - "workbox-strategies" "^3.6.3" - "workbox-streams" "^3.6.3" - "workbox-sw" "^3.6.3" - -"workbox-cache-expiration@^3.6.3": - "integrity" "sha512-+ECNph/6doYx89oopO/UolYdDmQtGUgo8KCgluwBF/RieyA1ZOFKfrSiNjztxOrGJoyBB7raTIOlEEwZ1LaHoA==" - "resolved" "https://registry.npmjs.org/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-cacheable-response@^3.6.3": - "integrity" "sha512-QpmbGA9SLcA7fklBLm06C4zFg577Dt8u3QgLM0eMnnbaVv3rhm4vbmDpBkyTqvgK/Ly8MBDQzlXDtUCswQwqqg==" - "resolved" "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-core@^3.6.3": - "integrity" "sha512-cx9cx0nscPkIWs8Pt98HGrS9/aORuUcSkWjG25GqNWdvD/pSe7/5Oh3BKs0fC+rUshCiyLbxW54q0hA+GqZeSQ==" - "resolved" "https://registry.npmjs.org/workbox-core/-/workbox-core-3.6.3.tgz" - "version" "3.6.3" - -"workbox-google-analytics@^3.6.3": - "integrity" "sha512-RQBUo/6SXtIaQTRFj4RQZ9e1gAl7D8oS5S+Hi173Kk70/BgJjzPwXpC5A249Jv5YfkCOLMQCeF9A27BiD0b0ig==" - "resolved" "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-background-sync" "^3.6.3" - "workbox-core" "^3.6.3" - "workbox-routing" "^3.6.3" - "workbox-strategies" "^3.6.3" - -"workbox-navigation-preload@^3.6.3": - "integrity" "sha512-dd26xTX16DUu0i+MhqZK/jQXgfIitu0yATM4jhRXEmpMqQ4MxEeNvl2CgjDMOHBnCVMax+CFZQWwxMx/X/PqCw==" - "resolved" "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-precaching@^3.6.3": - "integrity" "sha512-aBqT66BuMFviPTW6IpccZZHzpA8xzvZU2OM1AdhmSlYDXOJyb1+Z6blVD7z2Q8VNtV1UVwQIdImIX+hH3C3PIw==" - "resolved" "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-range-requests@^3.6.3": - "integrity" "sha512-R+yLWQy7D9aRF9yJ3QzwYnGFnGDhMUij4jVBUVtkl67oaVoP1ymZ81AfCmfZro2kpPRI+vmNMfxxW531cqdx8A==" - "resolved" "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-routing@^3.6.3": - "integrity" "sha512-bX20i95OKXXQovXhFOViOK63HYmXvsIwZXKWbSpVeKToxMrp0G/6LZXnhg82ijj/S5yhKNRf9LeGDzaqxzAwMQ==" - "resolved" "https://registry.npmjs.org/workbox-routing/-/workbox-routing-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-strategies@^3.6.3": - "integrity" "sha512-Pg5eulqeKet2y8j73Yw6xTgLdElktcWExGkzDVCGqfV9JCvnGuEpz5eVsCIK70+k4oJcBCin9qEg3g3CwEIH3g==" - "resolved" "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-streams@^3.6.3": - "integrity" "sha512-rqDuS4duj+3aZUYI1LsrD2t9hHOjwPqnUIfrXSOxSVjVn83W2MisDF2Bj+dFUZv4GalL9xqErcFW++9gH+Z27w==" - "resolved" "https://registry.npmjs.org/workbox-streams/-/workbox-streams-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "workbox-core" "^3.6.3" - -"workbox-sw@^3.6.3": - "integrity" "sha512-IQOUi+RLhvYCiv80RP23KBW/NTtIvzvjex28B8NW1jOm+iV4VIu3VXKXTA6er5/wjjuhmtB28qEAUqADLAyOSg==" - "resolved" "https://registry.npmjs.org/workbox-sw/-/workbox-sw-3.6.3.tgz" - "version" "3.6.3" - -"workbox-webpack-plugin@3.6.3": - "integrity" "sha512-RwmKjc7HFHUFHoOlKoZUq9349u0QN3F8W5tZZU0vc1qsBZDINWXRiIBCAKvo/Njgay5sWz7z4I2adnyTo97qIQ==" - "resolved" "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-3.6.3.tgz" - "version" "3.6.3" - dependencies: - "babel-runtime" "^6.26.0" - "json-stable-stringify" "^1.0.1" - "workbox-build" "^3.6.3" - -"worker-farm@^1.5.2": - "integrity" "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==" - "resolved" "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" - "version" "1.7.0" - dependencies: - "errno" "~0.1.7" - -"wrap-ansi@^2.0.0": - "integrity" "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "string-width" "^1.0.1" - "strip-ansi" "^3.0.1" - -"wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"write-file-atomic@^2.1.0": - "integrity" "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" - "version" "2.4.3" - dependencies: - "graceful-fs" "^4.1.11" - "imurmurhash" "^0.1.4" - "signal-exit" "^3.0.2" - -"write@^0.2.1": - "integrity" "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=" - "resolved" "https://registry.npmjs.org/write/-/write-0.2.1.tgz" - "version" "0.2.1" - dependencies: - "mkdirp" "^0.5.1" - -"ws@^5.2.0": - "integrity" "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==" - "resolved" "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz" - "version" "5.2.3" - dependencies: - "async-limiter" "~1.0.0" - -"xml-name-validator@^3.0.0": - "integrity" "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" - "version" "3.0.0" - -"xregexp@4.0.0": - "integrity" "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" - "resolved" "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz" - "version" "4.0.0" - -"xtend@^4.0.0", "xtend@~4.0.1": - "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - "version" "4.0.2" - -"y18n@^3.2.1 || ^4.0.0", "y18n@^4.0.0": - "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - "version" "4.0.3" - -"y18n@^3.2.1": - "integrity" "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" - "version" "3.2.2" - -"yallist@^3.0.2": - "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - "version" "3.1.1" - -"yargs-parser@^10.1.0": - "integrity" "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz" - "version" "10.1.0" - dependencies: - "camelcase" "^4.1.0" - -"yargs-parser@^9.0.2": - "integrity" "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz" - "version" "9.0.2" - dependencies: - "camelcase" "^4.1.0" - -"yargs@^11.0.0": - "integrity" "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz" - "version" "11.1.1" - dependencies: - "cliui" "^4.0.0" - "decamelize" "^1.1.1" - "find-up" "^2.1.0" - "get-caller-file" "^1.0.1" - "os-locale" "^3.1.0" - "require-directory" "^2.1.1" - "require-main-filename" "^1.0.1" - "set-blocking" "^2.0.0" - "string-width" "^2.0.0" - "which-module" "^2.0.0" - "y18n" "^3.2.1" - "yargs-parser" "^9.0.2" - -"yargs@12.0.2": - "integrity" "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz" - "version" "12.0.2" - dependencies: - "cliui" "^4.0.0" - "decamelize" "^2.0.0" - "find-up" "^3.0.0" - "get-caller-file" "^1.0.1" - "os-locale" "^3.0.0" - "require-directory" "^2.1.1" - "require-main-filename" "^1.0.1" - "set-blocking" "^2.0.0" - "string-width" "^2.0.0" - "which-module" "^2.0.0" - "y18n" "^3.2.1 || ^4.0.0" - "yargs-parser" "^10.1.0" diff --git a/flow-debugger/src/main.rs b/flow-debugger/src/main.rs deleted file mode 100644 index c370f2f..0000000 --- a/flow-debugger/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[tokio::main] -async fn main() { - warp::serve(warp::fs::dir("debugger-ui/build")) - .run(([0, 0, 0, 0], 3000)) - .await; -} diff --git a/flow-derive/Cargo.toml b/flow-derive/Cargo.toml deleted file mode 100644 index c3526b3..0000000 --- a/flow-derive/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "flow-derive" -version = "0.1.0" -authors = ["megvii"] -edition = "2018" - -[lib] -proc-macro = true - -[dependencies] -quote = "1" -syn = "1" -proc-macro2 = {version ="1", features= ["span-locations"]} -anyhow = "1.0.38" - -[dev-dependencies] -flow-rs = { path = "../flow-rs" } -toml = "0.5.8" diff --git a/flow-derive/README.md b/flow-derive/README.md deleted file mode 100644 index 51929e7..0000000 --- a/flow-derive/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# flow-derive - -### Q & A -1. Proc macro attributes are not yet supported in rust analyzer, and here is a workaround way. -```json -"rust-analyzer.diagnostics.disabled": [ - "no-such-field" -] -``` diff --git a/flow-derive/examples/node_derive.rs b/flow-derive/examples/node_derive.rs deleted file mode 100644 index ec58209..0000000 --- a/flow-derive/examples/node_derive.rs +++ /dev/null @@ -1,38 +0,0 @@ -/** - * \file flow-derive/examples/node_derive.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; - -#[allow(dead_code)] -#[inputs(first, second:dyn, third:[])] -#[outputs(front, last:dyn)] -#[derive(Node, Actor, Default)] -struct SubNode {} - -impl SubNode { - fn new(_: String, _args: &toml::value::Table) -> Self { - SubNode { - ..Default::default() - } - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - - async fn exec(&mut self, _: &Context) -> Result<()> { - let _: Envelope = self.first.recv::().await.unwrap(); - Ok(()) - } -} - -node_register!("sub", SubNode); - -fn main() {} diff --git a/flow-derive/src/actor.rs b/flow-derive/src/actor.rs deleted file mode 100644 index 19b4b2f..0000000 --- a/flow-derive/src/actor.rs +++ /dev/null @@ -1,101 +0,0 @@ -/** - * \file flow-derive/src/actor.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::utils::*; -use crate::{lit, type_name}; -use proc_macro2::TokenStream; -use quote::{quote, quote_spanned}; -use syn::{spanned::Spanned, DeriveInput}; - -pub fn expand(input: DeriveInput) -> TokenStream { - let ident = input.ident; - let is_local = attr(&input.attrs, "local").is_some(); - let spawn_func = if is_local { - lit::ident("spawn_local") - } else { - lit::ident("spawn") - }; - - fn send_empty_f((_, ident, ty): ExtractParams) -> TokenStream { - if match_last_ty(ty, "Vec") { - quote_spanned! {ident.span()=> - for chan in &self.#ident { - chan.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok(); - } - } - } else if match_last_ty(ty, "DynPorts") { - quote_spanned! (ident.span()=> - for chan in self.#ident.cache().values() { - chan.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok(); - } - ) - } else { - quote_spanned! (ident.span()=>self.#ident.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok();) - } - } - fn min_empty_n_f((_, ident, ty): ExtractParams) -> TokenStream { - if match_last_ty(ty, "Vec") { - quote_spanned! {ident.span()=> - for chan in &self.#ident { - min_empty_n = std::cmp::min(chan.empty_n(), min_empty_n) - } - } - } else if match_last_ty(ty, "DynPorts") { - quote_spanned! (ident.span()=> - for chan in self.#ident.cache().values() { - min_empty_n = std::cmp::min(chan.empty_n(), min_empty_n) - } - ) - } else { - quote_spanned! (ident.span()=> min_empty_n = std::cmp::min(self.#ident.empty_n(), min_empty_n);) - } - } - - let send_empty = extract_ports(&input.data, type_name::OUT_T, send_empty_f); - let recv_empty_n = extract_ports(&input.data, type_name::IN_T, min_empty_n_f); - let inputs_n = recv_empty_n.len(); - - let (imp_g, ty_g, where_g) = input.generics.split_for_impl(); - quote! { - impl#imp_g flow_rs::node::Actor for #ident#ty_g - #where_g { - fn start(mut self: Box, ctx: flow_rs::graph::Context, resources: flow_rs::resource::ResourceCollection) -> flow_rs::rt::task::JoinHandle<()> { - flow_rs::rt::task::#spawn_func(async move { - - self.initialize(resources).await; - let mut empty_n = 0; - loop { - let ret = self.exec(&ctx).await; - if #inputs_n > 0 { - let mut min_empty_n = usize::MAX; - #(#recv_empty_n )* - - for _ in empty_n..min_empty_n { - #(#send_empty )* - } - - empty_n = min_empty_n; - } - match ret { - Ok(_) if self.is_allinp_closed() => break, - Err(_) => { - ctx.close(); - break; - }, - _ => (), - } - } - self.close(); - self.finalize().await; - }) - } - } - } -} diff --git a/flow-derive/src/internal.rs b/flow-derive/src/internal.rs deleted file mode 100644 index 6b12ce3..0000000 --- a/flow-derive/src/internal.rs +++ /dev/null @@ -1,131 +0,0 @@ -/** - * \file flow-derive/src/internal.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::{lit, utils::*}; -use proc_macro2::{Span, TokenStream}; -use quote::{quote, ToTokens}; -use syn::{ - braced, - parse::{Parse, ParseStream, Result}, - punctuated::Punctuated, - spanned::Spanned, - Field, Ident, Token, VisPublic, Visibility, -}; - -pub struct CollectionSlice { - name: ID, - expr: TokenStream, -} - -impl Parse for CollectionSlice { - fn parse(input: ParseStream) -> Result { - let name: ID = input.parse()?; - input.parse::()?; - let expr: TokenStream = input.parse()?; - Ok(CollectionSlice { name, expr }) - } -} - -pub fn submit_expand(input: CollectionSlice) -> TokenStream { - let name = &input.name; - let expr = &input.expr; - let init = Ident::new(&format!("__init{}", hash(expr)), Span::call_site()); - quote! { - #[allow(non_upper_case_globals)] - #[flow_rs::ctor] - fn #init() { - flow_rs::registry::__submit_only_in_ctor(#name, #expr); - } - } -} - -pub struct FeatureDeclare { - name: Ident, - fields: Punctuated, -} - -impl Parse for FeatureDeclare { - fn parse(input: ParseStream) -> Result { - let name: Ident = input.parse()?; - input.parse::()?; - let content; - braced!(content in input); - let fields = content - .parse_terminated(Field::parse_named) - .unwrap_or_default(); - - Ok(FeatureDeclare { name, fields }) - } -} - -pub fn feature_expand(mut input: FeatureDeclare) -> TokenStream { - let name = &input.name; - let args_type = lit::ident(format!("__args{}", name)); - let args_name = lit::ident(format!("{}_args", name)); - let init = lit::ident(format!("__init{}", name)); - let fields = &mut input.fields; - fields.iter_mut().for_each(|field| { - field.vis = Visibility::Public(VisPublic { - pub_token: Token![pub](field.span()), - }); - }); - quote! { - #[derive(serde::Deserialize, Default)] - pub struct #args_type { - #fields - } - pub static #name: feature::Feature = feature::Feature::new(); - lazy_static::lazy_static! { - pub static ref #args_name: std::sync::RwLock> - = std::sync::RwLock::new(std::collections::HashMap::new()); - } - #[flow_rs::ctor] - fn #init() { - flow_rs::registry::__submit_only_in_ctor(stringify!(#name), feature::FeatureCommand { - start: Box::new(|k, json| { - #name.notify(); - let mut args = #args_name.write().unwrap(); - args.insert(k, serde_json::from_value(json).unwrap()); - }), - stop: Box::new(|k| { - let mut args = #args_name.write().unwrap(); - if let Some(_) = args.remove(&k) { - let into_object = |json| match json { - serde_json::Value::Object(json) => json, - _ => unreachable!(), - }; - - let args = into_object(serde_json::json!({ - "seq_id": k, - })); - - let others = into_object( - serde_json::to_value(protocol::EventMessage { - event: protocol::EVENT_STOP.to_owned(), - args, - }) - .unwrap(), - ); - server::PORT.0.try_send(protocol::ProtocolMessage { - ty: protocol::TYPE_EVENT.to_owned(), - others, - }).ok(); - } - if args.is_empty() { - #name.disable(); - } - }), - disable: Box::new(|| { - #name.disable(); - }), - }); - } - } -} diff --git a/flow-derive/src/lib.rs b/flow-derive/src/lib.rs deleted file mode 100644 index 3395be8..0000000 --- a/flow-derive/src/lib.rs +++ /dev/null @@ -1,117 +0,0 @@ -/** - * \file flow-derive/src/lib.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod actor; -mod internal; -mod lit; -mod node; -mod ports; -mod resource; -mod type_name; -mod utils; - -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, DeriveInput, ItemStruct}; - -/// A proc macro used to define inputs of a node. `#[inputs(port_name[:port_type], ..)]` -/// -/// | Annotation | Description | -/// | :- | :- | -/// | `port_name` | SimplePort, which is a Receiver of a MPMC channel | -/// | `port_name: []` | ListPort, which is `Vec` | -/// | `port_name: dyn` | DynamicPort, which is a port created dynamic, see `flow_rs::node::DynamicPort` for more detail | -#[proc_macro_attribute] -pub fn inputs(ports: TokenStream, input: TokenStream) -> TokenStream { - let ports = parse_macro_input!(ports as ports::PortSequence); - let fields = ports::in_expand(&ports); - let names = ports::name_expand(&ports); - let item_struct = parse_macro_input!(input as ItemStruct); - ports_expand("inputs", item_struct, fields, names).into() -} - -/// A proc macro used to define outputs of a node. `#[outputs(port_name[:port_type], ..)]` -/// -/// | Annotation | Description | -/// | :- | :- | -/// | `port_name` | SimplePort, which is a Sender of a MPMC channel | -/// | `port_name: []` | ListPort, which is `Vec` | -/// | `port_name: dyn` | DynamicPort, which is a port created dynamic, see `flow_rs::node::DynamicPort` for more detail | -#[proc_macro_attribute] -pub fn outputs(ports: TokenStream, input: TokenStream) -> TokenStream { - let ports = parse_macro_input!(ports as ports::PortSequence); - let fields = ports::out_expand(&ports); - let names = ports::name_expand(&ports); - let item_struct = parse_macro_input!(input as ItemStruct); - ports_expand("outputs", item_struct, fields, names).into() -} - -#[proc_macro_derive(Node)] -pub fn node_derive(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as DeriveInput); - node::expand(input).into() -} - -/// attributes(local): spawn actor by `flow_rs::rt::task::spawn_local` -#[proc_macro_derive(Actor, attributes(local))] -pub fn actor_derive(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as DeriveInput); - actor::expand(input).into() -} - -/// A proc macro used to register a node. `node_register!("NodeType", NodeType)` -#[proc_macro] -pub fn node_register(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as node::NodeDefine); - node::registry_expand(input).into() -} - -/// A proc macro used to register a resource. `resource_register!("ResourceType", ResourceType)` -#[proc_macro] -pub fn resource_register(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as resource::ResourceDefine); - resource::registry_expand(input).into() -} - -#[doc(hidden)] -#[proc_macro] -pub fn submit(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as internal::CollectionSlice); - internal::submit_expand(input).into() -} - -#[doc(hidden)] -#[proc_macro] -pub fn feature(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as internal::FeatureDeclare); - internal::feature_expand(input).into() -} - -fn ports_expand( - prefix: &str, - mut item_struct: ItemStruct, - fields: Vec, - names: Vec, -) -> proc_macro2::TokenStream { - for field in fields { - utils::add_field(&mut item_struct, field).unwrap(); - } - let ident = &item_struct.ident; - let func_ident = lit::ident(format!("{}_name", prefix)); - let (imp_g, ty_g, where_g) = item_struct.generics.split_for_impl(); - quote! { - #item_struct - impl#imp_g #ident#ty_g #where_g { - fn #func_ident() -> Vec { - vec![#(#names),*].into_iter().map(|n: &str| n.to_owned()).collect() - } - } - } -} diff --git a/flow-derive/src/lit.rs b/flow-derive/src/lit.rs deleted file mode 100644 index f1e4c88..0000000 --- a/flow-derive/src/lit.rs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * \file flow-derive/src/lit.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use proc_macro2::Span; -use std::fmt::Display; - -use syn::{Ident, LitStr}; - -pub fn string(lit: T) -> LitStr { - LitStr::new(lit.to_string().as_str(), Span::call_site()) -} - -pub fn ident(lit: impl AsRef) -> Ident { - Ident::new(lit.as_ref(), Span::call_site()) -} diff --git a/flow-derive/src/node.rs b/flow-derive/src/node.rs deleted file mode 100644 index 7634cc8..0000000 --- a/flow-derive/src/node.rs +++ /dev/null @@ -1,159 +0,0 @@ -/** - * \file flow-derive/src/node.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::type_name; -use crate::utils::*; -use proc_macro2::TokenStream; -use quote::{quote, quote_spanned}; -use syn::parse::{Parse, ParseStream, Result}; -use syn::spanned::Spanned; -use syn::{DeriveInput, Token}; -pub struct NodeDefine { - name: syn::Expr, - ty: syn::Type, -} -impl Parse for NodeDefine { - fn parse(input: ParseStream) -> Result { - let name: syn::Expr = input.parse()?; - input.parse::()?; - let ty: syn::Type = input.parse()?; - Ok(NodeDefine { name, ty }) - } -} -pub fn registry_expand(input: NodeDefine) -> TokenStream { - let name = &input.name; - let ty = &input.ty; - quote! { - flow_rs::submit!(#name.to_owned(), - flow_rs::node::NodeSlice{ - cons: Box::new(|name: String, args: &toml::value::Table| Box::new(<#ty>::new(name, args))), - info: flow_rs::node::NodeInfo { - inputs: <#ty>::inputs_name(), - outputs: <#ty>::outputs_name(), - } - } - ); - } -} - -pub fn expand(input: DeriveInput) -> TokenStream { - let ident = input.ident; - type IterArgs<'a> = ExtractParams<'a>; - fn set_f((port_func, ident, ty): IterArgs) -> TokenStream { - if match_last_ty(ty, "Vec") { - quote_spanned! {ident.span()=> - if port_name == concat!('[', stringify!(#ident), ']') { - if tag.is_none() { - if let Some(p) = self.#ident.iter_mut().find(|p| p.is_none()) { - *p = channel.#port_func(); - } else { - self.#ident.push(channel.#port_func()); - } - } else { - let i = tag.unwrap() as usize; - match self.#ident.len().cmp(&i) { - std::cmp::Ordering::Greater => { - debug_assert!(self.#ident[i].is_none()); - self.#ident[i] = channel.#port_func(); - } - std::cmp::Ordering::Less => { - self.#ident.resize(i+1, Default::default()); - self.#ident[i] = channel.#port_func(); - } - std::cmp::Ordering::Equal => { - self.#ident.push(channel.#port_func()); - } - } - } - } else - } - } else if match_last_ty(ty, "DynPorts") { - quote! {} - } else { - quote_spanned! {ident.span()=> - if port_name == stringify!(#ident) { - self.#ident = channel.#port_func(); - } else - } - } - } - fn set_dyn_f((_, ident, ty): IterArgs) -> TokenStream { - if match_last_ty(ty, "DynPorts") { - quote_spanned! {ident.span()=> - if port_name == concat!("dyn@", stringify!(#ident)) { - self.#ident = flow_rs::node::DynPorts::new(local_key, target, cap, brokers); - } else - } - } else { - quote! {} - } - } - fn close_f((_, ident, ty): IterArgs) -> TokenStream { - if match_last_ty(ty, "Vec") { - quote_spanned! {ident.span()=> - self.#ident.clear(); - } - } else { - quote!() - } - } - fn is_close_f((_, ident, ty): IterArgs) -> TokenStream { - if match_last_ty(ty, "Vec") { - quote_spanned! {ident.span()=> - for chan in &self.#ident { - is_closed = is_closed && chan.is_closed(); - } - } - } else { - quote_spanned! (ident.span()=> is_closed = is_closed && self.#ident.is_closed();) - } - } - - let seti = extract_ports(&input.data, type_name::IN_T, set_f); - let seto = extract_ports(&input.data, type_name::OUT_T, set_f); - let set_dyni = extract_ports(&input.data, type_name::IN_T, set_dyn_f); - let set_dyno = extract_ports(&input.data, type_name::OUT_T, set_dyn_f); - let closeo = extract_ports(&input.data, type_name::OUT_T, close_f); - let is_closei = extract_ports(&input.data, type_name::IN_T, is_close_f); - - let (imp_g, ty_g, where_g) = input.generics.split_for_impl(); - quote! { - impl#imp_g flow_rs::node::Node for #ident#ty_g - #where_g { - fn set_port(&mut self, port_name: &str, tag: Option, channel: &flow_rs::channel::ChannelStorage) { - #(#seti) * - #(#seto) * - { unreachable!() } - } - fn set_port_dynamic( - &mut self, - local_key: u64, - port_name: &str, - target: String, - cap: usize, - brokers: Vec, - ) { - #(#set_dyni) * - #(#set_dyno) * - { unreachable!() } - } - fn close(&mut self) { - #(#closeo)* - } - - fn is_allinp_closed(&self) -> bool { - use flow_rs::channel::ChannelBase; - let mut is_closed = true; - #(#is_closei)* - is_closed - } - } - } -} diff --git a/flow-derive/src/ports.rs b/flow-derive/src/ports.rs deleted file mode 100644 index e0ddd40..0000000 --- a/flow-derive/src/ports.rs +++ /dev/null @@ -1,117 +0,0 @@ -/** - * \file flow-derive/src/ports.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::{ - lit::{self, string}, - type_name, -}; -use proc_macro2::TokenStream; -use quote::quote_spanned; -use syn::{ - bracketed, - parse::{Parse, ParseStream, Result}, - punctuated::Punctuated, - LitStr, Token, -}; - -enum PortType { - Unit, - List, - Dyn, -} - -struct Port { - name: syn::Ident, - ty: PortType, -} - -impl Parse for Port { - fn parse(input: ParseStream) -> Result { - let name: syn::Ident = input.parse()?; - Ok(if input.peek(Token![:]) { - input.parse::()?; - if input.peek(syn::token::Dyn) { - input.parse::()?; - Port { - name, - ty: PortType::Dyn, - } - } else if input.peek(syn::token::Bracket) { - let _content; - bracketed!(_content in input); - Port { - name, - ty: PortType::List, - } - } else { - return Err(input.error("expect []")); - } - } else { - Port { - name, - ty: PortType::Unit, - } - }) - } -} - -pub struct PortSequence { - fields: Punctuated, -} - -impl Parse for PortSequence { - fn parse(input: ParseStream) -> Result { - Ok(PortSequence { - fields: input.parse_terminated(Port::parse).unwrap_or_default(), - }) - } -} - -pub fn in_expand(ports: &PortSequence) -> Vec { - expand(ports, type_name::IN_T) -} - -pub fn out_expand(ports: &PortSequence) -> Vec { - expand(ports, type_name::OUT_T) -} - -fn expand(ports: &PortSequence, extend_ty: &str) -> Vec { - let extend_ty = lit::ident(extend_ty); - ports - .fields - .iter() - .map(|port| { - let Port { name, ty } = port; - match ty { - PortType::Unit => { - quote_spanned!(name.span()=> #name: flow_rs::channel::#extend_ty) - } - PortType::List => { - quote_spanned!(name.span()=> #name: Vec) - } - PortType::Dyn => { - quote_spanned!(name.span()=> #name: flow_rs::node::DynPorts) - } - } - }) - .collect() -} - -pub fn name_expand(ports: &PortSequence) -> Vec { - ports - .fields - .iter() - .map(|port| match port.ty { - PortType::Dyn => string(format!("dyn@{}", port.name)), - PortType::List => string(format!("[{}]", port.name)), - PortType::Unit => string(&port.name), - }) - .collect() -} diff --git a/flow-derive/src/resource.rs b/flow-derive/src/resource.rs deleted file mode 100644 index 3af0abc..0000000 --- a/flow-derive/src/resource.rs +++ /dev/null @@ -1,29 +0,0 @@ -use proc_macro2::TokenStream; -use quote::quote; -use syn::parse::{Parse, ParseStream, Result}; -use syn::Token; - -pub struct ResourceDefine { - name: syn::Expr, - ty: syn::Type, -} -impl Parse for ResourceDefine { - fn parse(input: ParseStream) -> Result { - let name: syn::Expr = input.parse()?; - input.parse::()?; - let ty: syn::Type = input.parse()?; - Ok(ResourceDefine { name, ty }) - } -} - -pub fn registry_expand(input: ResourceDefine) -> TokenStream { - let name = &input.name; - let ty = &input.ty; - quote! { - flow_rs::submit!(#name.to_owned(), - flow_rs::node::ResourceSlice{ - cons: Box::new(|name: String, args: &toml::value::Table| Box::new(<#ty>::new(name, args))), - } - ); - } -} diff --git a/flow-derive/src/type_name.rs b/flow-derive/src/type_name.rs deleted file mode 100644 index 86b6325..0000000 --- a/flow-derive/src/type_name.rs +++ /dev/null @@ -1,13 +0,0 @@ -/** - * \file flow-derive/src/type_name.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ - -pub const IN_T: &str = "Receiver"; -pub const OUT_T: &str = "Sender"; diff --git a/flow-derive/src/utils.rs b/flow-derive/src/utils.rs deleted file mode 100644 index 37aa3b3..0000000 --- a/flow-derive/src/utils.rs +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file flow-derive/src/utils.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::lit; -use anyhow::Result; -use proc_macro2::TokenStream; -use std::collections::hash_map; -use std::hash::Hasher; -use syn::{parse::Parser, Field, Fields, Ident, ItemStruct, Type}; - -pub fn hash(input: &TokenStream) -> u64 { - let mut hasher = hash_map::DefaultHasher::new(); - hasher.write(input.to_string().as_bytes()); - hasher.finish() -} - -pub fn fields(data: &syn::Data) -> syn::punctuated::Iter { - match data { - syn::Data::Struct(ref item) => match item.fields { - syn::Fields::Named(ref fields) => fields.named.iter(), - syn::Fields::Unnamed(ref fields) => fields.unnamed.iter(), - _ => unreachable!(), - }, - _ => unreachable!(), - } -} - -pub fn attr<'a>(attrs: &'a [syn::Attribute], name: &str) -> Option<&'a syn::Attribute> { - attrs.iter().find(|attr| { - attr.path - .segments - .first() - .map(|p| p.ident == name) - .unwrap_or(false) - }) -} - -pub fn match_last_ty(ty: &syn::Type, wrapper: &str) -> bool { - match ty { - syn::Type::Path(ref p) => p - .path - .segments - .last() - .map(|seg| seg.ident == wrapper) - .unwrap_or(false), - _ => false, - } -} - -pub fn last_inner_ty(ty: &syn::Type) -> Option<&syn::Type> { - if let syn::Type::Path(ref p) = ty { - if p.path.segments.is_empty() { - return None; - } - - if let syn::PathArguments::AngleBracketed(ref inner_ty) = - p.path.segments.last().unwrap().arguments - { - if inner_ty.args.len() != 1 { - return None; - } - - let inner_ty = inner_ty.args.first().unwrap(); - if let syn::GenericArgument::Type(ref t) = inner_ty { - return Some(t); - } - } - } - None -} - -pub fn add_field(item: &mut ItemStruct, field: TokenStream) -> Result<()> { - match item.fields { - Fields::Named(ref mut fields) => fields.named.push(Field::parse_named.parse2(field)?), - Fields::Unnamed(ref mut fields) => fields.unnamed.push(Field::parse_unnamed.parse2(field)?), - _ => unreachable!(), - } - Ok(()) -} - -pub type ExtractParams<'a> = (&'a Ident, &'a Option, &'a Type); - -pub fn extract_ports( - data: &syn::Data, - ty_name: &str, - f: fn(ExtractParams) -> TokenStream, -) -> Vec { - let port_func = lit::ident(ty_name.to_lowercase()); - fields(data) - .filter(|field| { - match_last_ty(&field.ty, ty_name) - || (match_last_ty(&field.ty, "DynPorts") - && match_last_ty(last_inner_ty(&field.ty).unwrap(), ty_name)) - || (match_last_ty(&field.ty, "Vec") - && match_last_ty(last_inner_ty(&field.ty).unwrap(), ty_name)) - }) - .map(|field| (&port_func, &field.ident, &field.ty)) - .map(f) - .collect() -} diff --git a/flow-message/Cargo.lock b/flow-message/Cargo.lock deleted file mode 100644 index 8089072..0000000 --- a/flow-message/Cargo.lock +++ /dev/null @@ -1,390 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cross" -version = "0.1.0" -dependencies = [ - "byteorder", - "dashmap", - "enum-as-inner", - "im", - "paste 1.0.5", - "pyo3", -] - -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if", - "num_cpus", -] - -[[package]] -name = "enum-as-inner" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "im" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111c1983f3c5bb72732df25cddacee9b546d08325fb584b5ebd38148be7b0246" -dependencies = [ - "bitmaps", - "rand_core", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "indoc" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" -dependencies = [ - "indoc-impl", - "proc-macro-hack", -] - -[[package]] -name = "indoc-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", - "unindent", -] - -[[package]] -name = "instant" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "libc" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" - -[[package]] -name = "lock_api" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - -[[package]] -name = "paste" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" -dependencies = [ - "paste-impl", - "proc-macro-hack", -] - -[[package]] -name = "paste" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" - -[[package]] -name = "paste-impl" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" -dependencies = [ - "proc-macro-hack", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro2" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "pyo3" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35100f9347670a566a67aa623369293703322bb9db77d99d7df7313b575ae0c8" -dependencies = [ - "cfg-if", - "indoc", - "libc", - "parking_lot", - "paste 0.1.18", - "pyo3-build-config", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d12961738cacbd7f91b7c43bc25cfeeaa2698ad07a04b3be0aa88b950865738f" -dependencies = [ - "once_cell", -] - -[[package]] -name = "pyo3-macros" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0bc5215d704824dfddddc03f93cb572e1155c68b6761c37005e1c288808ea8" -dependencies = [ - "pyo3-macros-backend", - "quote", - "syn", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71623fc593224afaab918aa3afcaf86ed2f43d34f6afde7f3922608f253240df" -dependencies = [ - "proc-macro2", - "pyo3-build-config", - "quote", - "syn", -] - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - -[[package]] -name = "rand_xoshiro" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004" -dependencies = [ - "rand_core", -] - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "smallvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" - -[[package]] -name = "syn" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "unindent" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/flow-message/Cargo.toml b/flow-message/Cargo.toml deleted file mode 100644 index 6bd31b6..0000000 --- a/flow-message/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "flow-message" -version = "0.1.0" -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -byteorder = "1.4.3" -dashmap = "4.0.2" -enum-as-inner = "0.3.3" -im = "15.0.0" -paste = "1.0.5" -pyo3 = "0.14.4" diff --git a/flow-message/src/cross/cow_list.rs b/flow-message/src/cross/cow_list.rs deleted file mode 100644 index d0049ed..0000000 --- a/flow-message/src/cross/cow_list.rs +++ /dev/null @@ -1,63 +0,0 @@ -use super::*; - -impl private::IndexGetDataRefForGetRef for CowList { - fn get_ref(&self, key: &usize) -> Option<&data::Data> { - self.get(*key) - } -} - -impl private::IndexGetDataRefForGet for CowList { - fn get_ref(&self, key: &usize) -> Option<&data::Data> { - self.get(*key) - } -} - -impl private::IndexSetData for CowList { - fn set(&mut self, key: usize, data: data::Data) { - self.set(key, data); - } -} - -impl private::IndexGetDataMut for CowList { - fn get_mut(&mut self, key: &usize) -> Option<&mut data::Data> { - self.get_mut(*key) - } -} - -impl VectorOpr for CowList -where - T: From, - data::Data: From, -{ - fn xpop_front(&mut self) -> Option { - self.pop_front().map(T::from) - } - - fn xpop_back(&mut self) -> Option { - self.pop_back().map(T::from) - } - - fn xpush_back(&mut self, value: T) { - self.push_back(data::Data::from(value)) - } - - fn xpush_front(&mut self, value: T) { - self.push_front(data::Data::from(value)) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_basis() { - let mut list = CowList::new(); - list.xpush_back(1f64); - list.xpush_back(1i64); - list.xpush_back(false); - assert_eq!(list.len(), 3); - assert_eq!(list.xget(&1), Some(1i64)); - assert_eq!(list.xpop_back(), Some(false)); - } -} diff --git a/flow-message/src/cross/cow_map.rs b/flow-message/src/cross/cow_map.rs deleted file mode 100644 index 9f182e6..0000000 --- a/flow-message/src/cross/cow_map.rs +++ /dev/null @@ -1,52 +0,0 @@ -use super::*; - -impl private::IndexSetData for CowMap { - fn set(&mut self, key: String, data: data::Data) { - self.insert(key, data); - } -} - -impl private::IndexGetDataRefForGet for CowMap { - fn get_ref(&self, key: &str) -> Option<&data::Data> { - self.get(key) - } -} - -impl private::IndexGetDataRefForGetRef for CowMap { - fn get_ref(&self, key: &str) -> Option<&data::Data> { - self.get(key) - } -} - -impl private::IndexGetDataMut for CowMap { - fn get_mut(&mut self, key: &str) -> Option<&mut data::Data> { - self.get_mut(key) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_basis() { - let mut map = CowMap::new(); - map.xset("a".to_owned(), 1i64); - map.xset("b".to_owned(), 1f64); - let mut sub = CowMap::new(); - sub.xset("d".to_owned(), false); - map.xset("c".to_owned(), sub); - - assert_eq!(map.xget("b"), Some(1f64)); - let has_c: Option<&mut CowMap> = map.xget_mut("c"); - assert!(has_c.is_some()); - let sub = has_c.unwrap(); - assert_eq!(sub.xget("d"), Some(false)); - sub.xset("e".to_owned(), true); - - let has_c: Option<&CowMap> = map.xget_ref("c"); - assert!(has_c.is_some()); - let sub = has_c.unwrap(); - assert_eq!(sub.xget("e"), Some(true)); - } -} diff --git a/flow-message/src/cross/data/list.rs b/flow-message/src/cross/data/list.rs deleted file mode 100644 index 17445e7..0000000 --- a/flow-message/src/cross/data/list.rs +++ /dev/null @@ -1,117 +0,0 @@ -use super::*; -use byteorder::{ByteOrder, NativeEndian}; -use paste::paste; -use std::convert::From; -use std::sync::Arc; - -macro_rules! impl_from_value_type { - ($ty:ty, $value_type: path) => { - impl From> for Data { - fn from(mut src: Vec<$ty>) -> Self { - let length = src.len(); - let capacity = src.capacity(); - let ptr = src.as_mut_ptr(); - let byte_n = std::mem::size_of::<$ty>(); - src.leak(); - Self { - ty: DataType::Collection(CollectionType::List($value_type)), - data: DataStorage::Bytes(Arc::new(unsafe { - Vec::from_raw_parts(ptr as *mut u8, length * byte_n, capacity * byte_n) - })), - } - } - } - - impl From for Vec<$ty> { - fn from(src: Data) -> Self { - match src.ty { - DataType::Collection(CollectionType::List($value_type)) => { - let mut bytes = src - .data - .into_bytes() - .map_err(|_| ()) - .unwrap() - .as_ref() - .clone(); - let length = bytes.len() / std::mem::size_of::<$ty>(); - let capacity = bytes.capacity() / std::mem::size_of::<$ty>(); - let ptr = bytes.as_mut_ptr(); - bytes.leak(); - unsafe { Vec::from_raw_parts(ptr as *mut $ty, length, capacity) } - } - _ => unreachable!("type is not match"), - } - } - } - }; -} - -impl_from_value_type!(f64, ValueType::Float); -impl_from_value_type!(i64, ValueType::Int); -impl_from_value_type!(u64, ValueType::Uint); -impl_from_value_type!(u8, ValueType::Byte); -impl_from_value_type!(bool, ValueType::Bool); - -macro_rules! impl_index_get { - ($ty:ty, $call_ty:ty, $value_type: path) => { - impl IndexGet for Data { - fn get(&self, index: usize) -> Option<$ty> { - match self.ty { - DataType::Collection(CollectionType::List($value_type)) => { - let index = index * std::mem::size_of::<$call_ty>(); - let bytes = self.data.as_bytes().unwrap(); - if bytes.len() >= index + std::mem::size_of::<$call_ty>() { - Some(paste! {NativeEndian::[](&bytes[index..]) as $ty}) - } else { - None - } - } - _ => unreachable!("type is not match"), - } - } - } - - impl IndexSet for Data { - fn set(&mut self, index: usize, value: $ty) { - match self.ty { - DataType::Collection(CollectionType::List($value_type)) => { - let index = index * std::mem::size_of::<$call_ty>(); - let bytes = self.data.as_bytes_mut().unwrap(); - paste! {NativeEndian::[](&mut Arc::make_mut(bytes)[index..], value)}; - } - _ => unreachable!("type is not match"), - } - } - } - }; - ($ty:ty, $mapper:expr, $value_type: path) => { - impl IndexGet for Data { - fn get(&self, index: usize) -> Option<$ty> { - match self.ty { - DataType::Collection(CollectionType::List($value_type)) => { - self.data.as_bytes().unwrap().get(index).map($mapper) - } - _ => unreachable!("type is not match"), - } - } - } - - impl IndexSet for Data { - fn set(&mut self, index: usize, value: $ty) { - match self.ty { - DataType::Collection(CollectionType::List($value_type)) => { - let bytes = self.data.as_bytes_mut().unwrap(); - Arc::make_mut(bytes)[index] = value as u8; - } - _ => unreachable!("type is not match"), - } - } - } - }; -} - -impl_index_get!(f64, f64, ValueType::Float); -impl_index_get!(i64, i64, ValueType::Int); -impl_index_get!(u64, u64, ValueType::Uint); -impl_index_get!(u8, |v| *v, ValueType::Byte); -impl_index_get!(bool, |v| *v != 0, ValueType::Bool); diff --git a/flow-message/src/cross/data/mod.rs b/flow-message/src/cross/data/mod.rs deleted file mode 100644 index 93bcca6..0000000 --- a/flow-message/src/cross/data/mod.rs +++ /dev/null @@ -1,214 +0,0 @@ -mod list; -mod value; - -use im::Vector; - -use super::*; -use enum_as_inner::EnumAsInner; - -pub trait IndexGet -where - Idx: ?Sized, -{ - fn get(&self, index: Idx) -> Option; -} - -pub trait IndexSet -where - Idx: ?Sized, -{ - fn set(&mut self, index: Idx, value: Value); -} - -pub trait Get { - fn get(&self) -> Output; -} - -pub trait Set { - fn set(&mut self, value: Value); -} - -pub trait GetRef<'a, Output> -where - Output: 'a, -{ - fn get_ref(&'a self) -> Output; -} - -pub trait GetMut<'a, Output> -where - Output: 'a, -{ - fn get_mut(&'a mut self) -> Output; -} - -#[derive(Debug, Clone, Copy)] -pub enum ValueType { - Float, - Int, - Uint, - Byte, - Bool, -} - -impl ValueType { - fn width(&self) -> usize { - match *self { - ValueType::Float | ValueType::Int | ValueType::Uint => 8, - ValueType::Byte | ValueType::Bool => 1, - } - } -} - -#[derive(Debug, Clone, Copy)] -pub enum CollectionType { - List(ValueType), - CowList, - Map, - CowMap, -} - -#[derive(Debug, Clone, Copy)] -pub enum DataType { - Value(ValueType), - Collection(CollectionType), -} - -#[derive(EnumAsInner, Clone)] -pub enum DataStorage { - Bytes(Arc>), // immutable bytes, List or Value - Datas(CowList), // CowList - Ref(Map), // Map - CowRef(CowMap), // CowMap -} - -#[derive(Clone)] -pub struct Data { - ty: DataType, - data: DataStorage, -} - -impl Data { - pub fn ty(&self) -> DataType { - self.ty - } - - pub fn data(&self) -> &DataStorage { - &self.data - } - - pub fn len(&self) -> usize { - match self.ty { - DataType::Value(_) => 1usize, - DataType::Collection(CollectionType::List(value_ty)) => { - self.data.as_bytes().unwrap().len() / value_ty.width() - } - DataType::Collection(CollectionType::Map) => self.data.as_ref().unwrap().len(), - DataType::Collection(CollectionType::CowList) => self.data.as_datas().unwrap().len(), - DataType::Collection(CollectionType::CowMap) => self.data.as_cow_ref().unwrap().len(), - } - } - - pub fn is_empty(&self) -> bool { - self.len() == 0 - } -} - -impl<'a> GetRef<'a, &'a Map> for Data { - fn get_ref(&self) -> &Map { - match self.ty { - DataType::Collection(CollectionType::Map) => self.data.as_ref().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl<'a> GetRef<'a, &'a CowList> for Data { - fn get_ref(&self) -> &Vector { - match self.ty { - DataType::Collection(CollectionType::CowList) => self.data.as_datas().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl<'a> GetRef<'a, &'a CowMap> for Data { - fn get_ref(&self) -> &CowStorage { - match self.ty { - DataType::Collection(CollectionType::CowMap) => self.data.as_cow_ref().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl<'a> GetMut<'a, &'a mut Map> for Data { - fn get_mut(&mut self) -> &mut Map { - match self.ty { - DataType::Collection(CollectionType::Map) => self.data.as_ref_mut().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl<'a> GetMut<'a, &'a mut CowList> for Data { - fn get_mut(&mut self) -> &mut Vector { - match self.ty { - DataType::Collection(CollectionType::CowList) => self.data.as_datas_mut().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl<'a> GetMut<'a, &'a mut CowMap> for Data { - fn get_mut(&mut self) -> &mut CowStorage { - match self.ty { - DataType::Collection(CollectionType::CowMap) => self.data.as_cow_ref_mut().unwrap(), - _ => unreachable!("type is not match"), - } - } -} - -impl From for Data { - fn from(r: CowMap) -> Self { - Self { - ty: DataType::Collection(CollectionType::CowMap), - data: DataStorage::CowRef(r), - } - } -} - -impl From for Data { - fn from(r: Map) -> Self { - Self { - ty: DataType::Collection(CollectionType::Map), - data: DataStorage::Ref(r), - } - } -} - -impl From for Data { - fn from(datas: CowList) -> Self { - Self { - ty: DataType::Collection(CollectionType::CowList), - data: DataStorage::Datas(datas), - } - } -} - -impl From for CowMap { - fn from(data: Data) -> Self { - data.data.into_cow_ref().map_err(|_| ()).unwrap() - } -} - -impl From for Map { - fn from(data: Data) -> Self { - data.data.into_ref().map_err(|_| ()).unwrap() - } -} - -impl From for CowList { - fn from(data: Data) -> Self { - data.data.into_datas().map_err(|_| ()).unwrap() - } -} diff --git a/flow-message/src/cross/data/value.rs b/flow-message/src/cross/data/value.rs deleted file mode 100644 index 2df8f89..0000000 --- a/flow-message/src/cross/data/value.rs +++ /dev/null @@ -1,104 +0,0 @@ -use super::*; -use byteorder::{ByteOrder, NativeEndian}; -use paste::paste; -use std::convert::From; -use std::sync::Arc; - -macro_rules! impl_from_value_type { - ($ty:ty, $call_ty:ty, $value_type: path) => { - impl From<$ty> for Data { - fn from(v: $ty) -> Self { - let mut data = vec![0;std::mem::size_of::<$ty>()]; - paste! {NativeEndian::[](&mut data, v as $call_ty)}; - Data { - ty: DataType::Value($value_type), - data: DataStorage::Bytes(Arc::new(data)), - } - } - } - - impl From for $ty { - fn from(data: Data) -> Self { - match data.ty { - DataType::Value($value_type) => { - paste! {NativeEndian::[](data.data.as_bytes().unwrap().as_slice()) as $ty} - } - _ => unreachable!("type is not match"), - } - } - } - }; - ($ty:ty, $mapper:expr, $value_type: path) => { - impl From<$ty> for Data { - fn from(v: $ty) -> Self { - Data { - ty: DataType::Value($value_type), - data: DataStorage::Bytes(Arc::new(vec![v as u8])), - } - } - } - - impl From for $ty { - fn from(data: Data) -> Self { - $mapper(data.data.as_bytes().unwrap()[0]) - } - } - }; -} - -impl_from_value_type!(u64, u64, ValueType::Uint); -impl_from_value_type!(i64, i64, ValueType::Int); -impl_from_value_type!(f64, f64, ValueType::Float); -impl_from_value_type!(bool, |x| x != 0, ValueType::Bool); -impl_from_value_type!(u8, |x| x, ValueType::Byte); - -macro_rules! impl_get_set { - ($ty:ty, $call_ty:ty, $value_type: path) => { - impl Get<$ty> for Data { - fn get(&self) -> $ty { - match self.ty { - DataType::Value($value_type) => { - paste! {NativeEndian::[](self.data.as_bytes().unwrap().as_slice()) as $ty} - } - _ => unreachable!("type is not match"), - } - } - } - impl Set<$ty> for Data { - fn set(&mut self, value: $ty) { - match self.ty { - DataType::Value($value_type) => { - paste! {NativeEndian::[](Arc::make_mut(self.data.as_bytes_mut().unwrap()).as_mut(), value)} - } - _ => unreachable!("type is not match"), - } - } - } - }; - ($ty:ty, $mapper:expr, $value_type: path) => { - impl Get<$ty> for Data { - fn get(&self) -> $ty { - match self.ty { - DataType::Value($value_type) => $mapper(self.data.as_bytes().unwrap()[0]), - _ => unreachable!("type is not match"), - } - } - } - impl Set<$ty> for Data { - fn set(&mut self, value: $ty) { - match self.ty { - DataType::Value($value_type) => { - Arc::make_mut(self.data.as_bytes_mut().unwrap())[0] = value as u8; - } - _ => unreachable!("type is not match"), - } - } - } - }; -} - -impl_get_set!(f64, f64, ValueType::Float); -impl_get_set!(i64, i64, ValueType::Int); -impl_get_set!(u64, u64, ValueType::Uint); -impl_get_set!(bool, |v| v != 0, ValueType::Bool); -impl_get_set!(u8, |v| v, ValueType::Byte); diff --git a/flow-message/src/cross/list.rs b/flow-message/src/cross/list.rs deleted file mode 100644 index eb4033b..0000000 --- a/flow-message/src/cross/list.rs +++ /dev/null @@ -1,35 +0,0 @@ -use super::*; - -impl IndexGet for List -where - Output: Copy, - data::Data: data::IndexGet, -{ - fn xget(&self, i: &usize) -> Option { - data::IndexGet::get(self, *i) - } -} - -impl IndexSet for List -where - Value: Copy, - data::Data: data::IndexSet, -{ - fn xset(&mut self, i: usize, data: Value) { - data::IndexSet::set(self, i, data) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_basis() { - let list = List::from(vec![0i64, 1, 2, 3, 4]); - assert_eq!(list.len(), 5); - assert_eq!(list.xget(&3), Some(3i64)); - let list: Vec = list.into(); - assert_eq!(list, vec![0i64, 1, 2, 3, 4]); - } -} diff --git a/flow-message/src/cross/map.rs b/flow-message/src/cross/map.rs deleted file mode 100644 index 0e5a935..0000000 --- a/flow-message/src/cross/map.rs +++ /dev/null @@ -1,77 +0,0 @@ -use super::data::GetRef; -use super::*; -use dashmap::mapref::one::Ref; - -pub struct MapRef<'a> { - inner: Ref<'a, String, data::Data>, -} - -impl<'a> MapRef<'a> { - fn new(inner: Ref<'a, String, data::Data>) -> Self { - MapRef { inner } - } -} - -impl<'a> AsRef for MapRef<'a> { - fn as_ref(&self) -> &List { - self.inner.value() - } -} - -impl<'a> AsRef for MapRef<'a> { - fn as_ref(&self) -> &Map { - GetRef::get_ref(self.inner.value()) - } -} - -impl<'a> AsRef for MapRef<'a> { - fn as_ref(&self) -> &CowMap { - GetRef::get_ref(self.inner.value()) - } -} - -impl private::IndexSetData for Map { - fn set(&mut self, key: String, data: data::Data) { - self.as_ref().insert(key, data); - } -} - -impl IndexGet for Map -where - T: Copy, - data::Data: data::Get, -{ - fn xget(&self, key: &str) -> Option { - self.as_ref() - .get(key) - .map(|data| data::Get::get(data.value())) - } -} - -impl<'a> IndexGetRef<'a, str, MapRef<'a>> for Map { - fn xget_ref(&'a self, key: &str) -> Option> { - self.as_ref().get(key).map(MapRef::new) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_basis() { - let mut map: Map = Default::default(); - map.xset("a".to_owned(), 1i64); - map.xset("b".to_owned(), 1f64); - let mut sub: Map = Default::default(); - sub.xset("d".to_owned(), false); - map.xset("c".to_owned(), sub); - - assert_eq!(map.xget("b"), Some(1f64)); - let has_c = map.xget_ref("c"); - assert!(has_c.is_some()); - let elem_ref = has_c.unwrap(); - let sub: &Map = elem_ref.as_ref(); - assert_eq!(sub.xget("d"), Some(false)); - } -} diff --git a/flow-message/src/cross/mod.rs b/flow-message/src/cross/mod.rs deleted file mode 100644 index e7236e9..0000000 --- a/flow-message/src/cross/mod.rs +++ /dev/null @@ -1,127 +0,0 @@ -#![allow(dead_code)] - -mod cow_list; -mod cow_map; -mod data; -mod list; -mod map; -mod python; - -use dashmap::DashMap; -use im::{OrdMap, Vector}; -use std::sync::Arc; - -type Storage = Arc>; -type CowStorage = OrdMap; - -pub type CowMap = CowStorage; -pub type Map = Storage; -pub type List = data::Data; -pub type CowList = Vector; - -pub trait VectorOpr { - fn xpush_back(&mut self, value: T); - fn xpush_front(&mut self, value: T); - fn xpop_front(&mut self) -> Option; - fn xpop_back(&mut self) -> Option; -} - -pub trait IndexSet { - fn xset(&mut self, key: K, value: T); -} - -pub trait IndexGet -where - Output: Copy, - Idx: ?Sized, -{ - fn xget(&self, i: &Idx) -> Option; -} - -pub trait IndexGetRef<'a, Idx, Output> -where - Idx: ?Sized, - Output: 'a, -{ - fn xget_ref(&'a self, i: &Idx) -> Option; -} - -pub trait IndexGetMut<'a, Idx, Output> -where - Idx: ?Sized, - Output: 'a, -{ - fn xget_mut(&'a mut self, i: &Idx) -> Option; -} - -#[doc(hidden)] -mod private { - use super::*; - pub trait IndexSetData { - fn set(&mut self, key: Idx, value: data::Data); - } - pub trait IndexGetDataRefForGet - where - Idx: ?Sized, - { - fn get_ref(&self, key: &'_ Idx) -> Option<&data::Data>; - } - pub trait IndexGetDataRefForGetRef - where - Idx: ?Sized, - { - fn get_ref(&self, key: &'_ Idx) -> Option<&data::Data>; - } - pub trait IndexGetDataMut - where - Idx: ?Sized, - { - fn get_mut(&mut self, key: &'_ Idx) -> Option<&mut data::Data>; - } - - impl IndexSet for T - where - T: IndexSetData, - U: Into, - { - fn xset(&mut self, key: Idx, value: U) { - self.set(key, value.into()); - } - } - - impl IndexGet for T - where - U: Copy, - T: IndexGetDataRefForGet, - data::Data: data::Get, - Idx: ?Sized, - { - fn xget(&self, key: &Idx) -> Option { - self.get_ref(key).map(|data| data::Get::get(data)) - } - } - - impl<'a, Idx, T, U> IndexGetRef<'a, Idx, U> for T - where - U: 'a, - T: IndexGetDataRefForGetRef, - data::Data: data::GetRef<'a, U>, - Idx: ?Sized, - { - fn xget_ref(&'a self, key: &Idx) -> Option { - self.get_ref(key).map(|data| data::GetRef::get_ref(data)) - } - } - - impl<'a, Idx, T, U> IndexGetMut<'a, Idx, U> for T - where - U: 'a, - T: IndexGetDataMut, - data::Data: data::GetMut<'a, U>, - Idx: ?Sized, - { - fn xget_mut(&'a mut self, key: &Idx) -> Option { - self.get_mut(key).map(|data| data::GetMut::get_mut(data)) - } - } -} diff --git a/flow-message/src/cross/python/cow_list.rs b/flow-message/src/cross/python/cow_list.rs deleted file mode 100644 index a69d6f4..0000000 --- a/flow-message/src/cross/python/cow_list.rs +++ /dev/null @@ -1,90 +0,0 @@ -use super::*; -use pyo3::{PyIterProtocol, PySequenceProtocol}; - -#[pyproto] -impl PySequenceProtocol for PyCowList { - fn __len__(&self) -> usize { - self.as_ref().len() - } - - fn __setitem__(&mut self, idx: isize, value: PyObject) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let data = to_data(py, value)?; - let len = self.as_ref().len(); - let idx = cvt_idx(len, idx); - self.as_mut().set(idx, data); - Ok(()) - } - - fn __getitem__(&self, idx: isize) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let len = self.as_ref().len(); - let idx = cvt_idx(len, idx); - if let Some(data) = self.as_ref().get(idx) { - from_data(py, data) - } else { - Err(pyo3::exceptions::PyTypeError::new_err("Idx out of bound")) - } - } - - fn __delitem__(&mut self, idx: isize) -> PyResult<()> { - let len = self.as_ref().len(); - let idx = cvt_idx(len, idx); - self.as_mut().remove(idx); - Ok(()) - } - - fn __concat__(&self, other: Py) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let other = other.borrow(py); - let newlist = self - .as_ref() - .iter() - .chain(other.as_ref().iter()) - .cloned() - .collect::(); - Py::new( - py, - PyCowList { - inner: Some(newlist), - }, - ) - .map(|list| list.to_object(py)) - } - - fn __repeat__(&self, count: isize) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let mut newlist = self.as_ref().clone(); - for _ in 0..count - 1 { - for data in self.as_ref() { - newlist.push_back(data.clone()); - } - } - Py::new( - py, - PyCowList { - inner: Some(newlist), - }, - ) - .map(|list| list.to_object(py)) - } -} - -#[pyproto] -impl PyIterProtocol for PyCowList { - fn __iter__(this: PyRefMut) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let mut elements = std::vec::Vec::new(); - for element in this.as_ref().iter() { - elements.push(from_data(py, &element.clone())?); - } - - Ok(super::iterator::PyObjectIterator::new(elements.into_iter())) - } -} diff --git a/flow-message/src/cross/python/cow_map.rs b/flow-message/src/cross/python/cow_map.rs deleted file mode 100644 index a8997db..0000000 --- a/flow-message/src/cross/python/cow_map.rs +++ /dev/null @@ -1,48 +0,0 @@ -use super::*; -use pyo3::{PyIterProtocol, PyMappingProtocol}; - -#[pyproto] -impl PyMappingProtocol for PyCowMap { - fn __len__(&self) -> usize { - self.as_ref().len() - } - fn __setitem__(&mut self, attr: String, value: PyObject) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let data = to_data(py, value)?; - self.as_mut().insert(attr, data); - Ok(()) - } - - fn __getitem__(&self, attr: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - if let Some(data) = self.as_ref().get(attr) { - from_data(py, data) - } else { - Err(pyo3::exceptions::PyTypeError::new_err("Key Error")) - } - } - - fn __delitem__(&mut self, attr: &str) -> PyResult<()> { - self.as_mut().remove(attr); - Ok(()) - } -} - -#[pyproto] -impl PyIterProtocol for PyCowMap { - fn __iter__(this: PyRefMut) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let mut elements = std::vec::Vec::new(); - for (k, v) in this.as_ref().iter() { - elements.push((k.to_object(py), from_data(py, &v.clone())?)); - } - - Ok(super::iterator::PyObjectPairIterator::new( - elements.into_iter(), - )) - } -} diff --git a/flow-message/src/cross/python/iterator.rs b/flow-message/src/cross/python/iterator.rs deleted file mode 100644 index 6aaf816..0000000 --- a/flow-message/src/cross/python/iterator.rs +++ /dev/null @@ -1,46 +0,0 @@ -use pyo3::prelude::{pyclass, pyproto}; -use pyo3::{Py, PyIterProtocol, PyObject, PyRefMut, PyResult}; - -#[pyclass] -pub struct PyObjectIterator { - iterator: std::vec::IntoIter, -} - -impl PyObjectIterator { - #[must_use] - pub fn new(iterator: std::vec::IntoIter) -> Self { - PyObjectIterator { iterator } - } -} - -#[pyproto] -impl PyIterProtocol for PyObjectIterator { - fn __iter__(slf: PyRefMut) -> PyResult> { - Ok(slf.into()) - } - fn __next__(mut slf: PyRefMut) -> PyResult> { - Ok(slf.iterator.next()) - } -} - -#[pyclass] -pub struct PyObjectPairIterator { - iterator: std::vec::IntoIter<(PyObject, PyObject)>, -} - -impl PyObjectPairIterator { - #[must_use] - pub fn new(iterator: std::vec::IntoIter<(PyObject, PyObject)>) -> Self { - PyObjectPairIterator { iterator } - } -} - -#[pyproto] -impl PyIterProtocol for PyObjectPairIterator { - fn __iter__(slf: PyRefMut) -> PyResult> { - Ok(slf.into()) - } - fn __next__(mut slf: PyRefMut) -> PyResult> { - Ok(slf.iterator.next()) - } -} diff --git a/flow-message/src/cross/python/list.rs b/flow-message/src/cross/python/list.rs deleted file mode 100644 index b94455e..0000000 --- a/flow-message/src/cross/python/list.rs +++ /dev/null @@ -1,78 +0,0 @@ -use super::*; -use pyo3::PySequenceProtocol; - -#[pyproto] -impl PySequenceProtocol for PyList { - fn __len__(&self) -> usize { - self.as_ref().len() - } - - fn __setitem__(&mut self, idx: isize, value: PyObject) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let value = value.as_ref(py); - let len = self.as_ref().len(); - let idx = cvt_idx(len, idx); - if value.is_instance::()? - || value.is_instance::()? - { - let value: i64 = value.extract()?; - match self.as_ref().ty() { - data::DataType::Collection(data::CollectionType::List(data::ValueType::Byte)) => { - self.as_mut().xset(idx, value as u8); - } - _ => self.as_mut().xset(idx, value), - } - } else if value.is_instance::()? { - let value: bool = value.extract()?; - self.as_mut().xset(idx, value); - } else if value.is_instance::()? { - let value: f64 = value.extract()?; - self.as_mut().xset(idx, value); - } else { - unimplemented!() - } - Ok(()) - } - - fn __getitem__(&self, idx: isize) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let len = self.as_ref().len(); - let idx = cvt_idx(len, idx); - - match self.as_ref().ty() { - data::DataType::Collection(data::CollectionType::List(data::ValueType::Int)) => { - let value: PyResult = self - .as_ref() - .xget(&(idx)) - .ok_or_else(|| pyo3::exceptions::PyTypeError::new_err("Idx out of bound")); - value.map(|value| value.to_object(py)) - } - data::DataType::Collection(data::CollectionType::List(data::ValueType::Float)) => { - let value: PyResult = self - .as_ref() - .xget(&(idx)) - .ok_or_else(|| pyo3::exceptions::PyTypeError::new_err("Idx out of bound")); - value.map(|value| value.to_object(py)) - } - data::DataType::Collection(data::CollectionType::List(data::ValueType::Bool)) => { - let value: PyResult = self - .as_ref() - .xget(&(idx)) - .ok_or_else(|| pyo3::exceptions::PyTypeError::new_err("Idx out of bound")); - value.map(|value| value.to_object(py)) - } - data::DataType::Collection(data::CollectionType::List(data::ValueType::Byte)) => { - let value: PyResult = self - .as_ref() - .xget(&(idx)) - .ok_or_else(|| pyo3::exceptions::PyTypeError::new_err("Idx out of bound")); - value.map(|value| value.to_object(py)) - } - _ => { - unimplemented!() - } - } - } -} diff --git a/flow-message/src/cross/python/map.rs b/flow-message/src/cross/python/map.rs deleted file mode 100644 index d8f21f5..0000000 --- a/flow-message/src/cross/python/map.rs +++ /dev/null @@ -1,51 +0,0 @@ -use super::*; -use pyo3::{PyIterProtocol, PyMappingProtocol}; - -#[pyproto] -impl PyMappingProtocol for PyMap { - fn __len__(&self) -> usize { - self.as_ref().len() - } - fn __setitem__(&mut self, attr: String, value: PyObject) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let data = to_data(py, value)?; - self.as_mut().insert(attr, data); - Ok(()) - } - - fn __getitem__(&self, attr: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - if let Some(data) = self.as_ref().get(attr) { - from_data(py, data) - } else { - Err(pyo3::exceptions::PyTypeError::new_err("Key Error")) - } - } - - fn __delitem__(&mut self, attr: &str) -> PyResult<()> { - self.as_mut().remove(attr); - Ok(()) - } -} - -#[pyproto] -impl PyIterProtocol for PyMap { - fn __iter__(this: PyRefMut) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let mut elements = std::vec::Vec::new(); - for pair in this.as_ref().iter() { - elements.push(( - pair.key().to_object(py), - from_data(py, &pair.value().clone())?, - )); - } - - Ok(super::iterator::PyObjectPairIterator::new( - elements.into_iter(), - )) - } -} diff --git a/flow-message/src/cross/python/mod.rs b/flow-message/src/cross/python/mod.rs deleted file mode 100644 index 2070a4b..0000000 --- a/flow-message/src/cross/python/mod.rs +++ /dev/null @@ -1,143 +0,0 @@ -mod cow_list; -mod cow_map; -mod iterator; -mod list; -mod map; - -use super::*; -use paste::paste; -use pyo3::prelude::*; - -const UAM: &str = "Use After Move"; - -macro_rules! declare_py { - ($name:ident, $name_str:literal) => { - paste! { - #[pyclass(name = $name_str)] - struct [] { - inner: Option<$name> - } - impl [] { - fn take(&mut self) -> $name { - self.inner.take().expect(UAM) - } - fn as_ref(&self) -> &$name { - self.inner.as_ref().expect(UAM) - } - fn as_mut(&mut self) -> &mut $name { - self.inner.as_mut().expect(UAM) - } - } - } - }; -} - -declare_py!(List, "List"); -declare_py!(Map, "Map"); -declare_py!(CowList, "CowList"); -declare_py!(CowMap, "CowMap"); - -#[inline] -fn cvt_idx(len: usize, idx: isize) -> usize { - if idx < 0 { - len - idx.abs() as usize - } else { - idx as usize - } -} - -fn to_data(py: Python, object: PyObject) -> PyResult { - let value = object.as_ref(py); - if value.is_instance::()? || value.is_instance::()? { - let value: i64 = value.extract()?; - Ok(data::Data::from(value)) - } else if value.is_instance::()? { - let value: bool = value.extract()?; - Ok(data::Data::from(value)) - } else if value.is_instance::()? { - let value: f64 = value.extract()?; - Ok(data::Data::from(value)) - } else if value.is_instance::()? - || value.is_instance::()? - { - let value: Vec = value.extract()?; - Ok(data::Data::from(value)) - } else if value.is_instance::()? { - let value: String = value.extract()?; - Ok(data::Data::from(value.into_bytes())) - } else if value.is_instance::()? { - let value: Py = value.extract()?; - let mut b = value.borrow_mut(py); - Ok(b.take()) - } else if value.is_instance::()? { - let value: Py = value.extract()?; - let mut b = value.borrow_mut(py); - Ok(data::Data::from(b.take())) - } else if value.is_instance::()? { - let value: Py = value.extract()?; - let mut b = value.borrow_mut(py); - Ok(data::Data::from(b.take())) - } else if value.is_instance::()? { - let value: Py = value.extract()?; - let mut b = value.borrow_mut(py); - Ok(data::Data::from(b.take())) - } else { - unimplemented!() - } -} - -fn from_data(py: Python, data: impl std::ops::Deref) -> PyResult { - match data.ty() { - data::DataType::Value(data::ValueType::Int) => { - let value: i64 = data::Get::get(&*data); - Ok(value.to_object(py)) - } - data::DataType::Value(data::ValueType::Float) => { - let value: f64 = data::Get::get(&*data); - Ok(value.to_object(py)) - } - data::DataType::Value(data::ValueType::Bool) => { - let value: bool = data::Get::get(&*data); - Ok(value.to_object(py)) - } - data::DataType::Value(data::ValueType::Byte) => { - let value: u8 = data::Get::get(&*data); - Ok(value.to_object(py)) - } - data::DataType::Collection(data::CollectionType::List(_)) => { - let list = data.clone(); - Py::new(py, PyList { inner: Some(list) }).map(|inner| inner.to_object(py)) - } - data::DataType::Collection(data::CollectionType::Map) => { - let map: &Map = data::GetRef::get_ref(&*data); - Py::new( - py, - PyMap { - inner: Some(map.to_owned()), - }, - ) - .map(|inner| inner.to_object(py)) - } - data::DataType::Collection(data::CollectionType::CowList) => { - let map: &CowList = data::GetRef::get_ref(&*data); - Py::new( - py, - PyCowList { - inner: Some(map.to_owned()), - }, - ) - .map(|inner| inner.to_object(py)) - } - data::DataType::Collection(data::CollectionType::CowMap) => { - let map: &CowMap = data::GetRef::get_ref(&*data); - Py::new( - py, - PyCowMap { - inner: Some(map.to_owned()), - }, - ) - .map(|inner| inner.to_object(py)) - } - _ => unimplemented!(), - } -} diff --git a/flow-message/src/lib.rs b/flow-message/src/lib.rs deleted file mode 100644 index 6c897f2..0000000 --- a/flow-message/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod cross; diff --git a/flow-plugins/Cargo.toml b/flow-plugins/Cargo.toml deleted file mode 100644 index 11cbc29..0000000 --- a/flow-plugins/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "flow-plugins" -version = "0.1.0" -authors = ["megvii"] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -flow-rs = { path = "../flow-rs" } -toml = "0.5.8" -ffmpeg-next = { git = "https://github.com/Easonzero/rust-ffmpeg", branch = "master" } -futures-util = "0.3" -pyo3 = "0.14.1" -numpy = "0.14.1" -anyhow = "1.0.42" -image = "0.23.14" -oneshot = "0.1.2" -log = "0.4" -pretty_env_logger = "0.3" -rweb = { version="0.12.5", features=["openapi"] } -mime = "0.3.16" -indexmap = "1" -hyper = "0.14.11" -headers = "0.3.4" -serde = "1.0.127" -urlencoding = "2.1.0" -rand = "0.8.4" -serde_json = "1.0.66" diff --git a/flow-plugins/examples/image_input.toml b/flow-plugins/examples/image_input.toml deleted file mode 100644 index 99a4183..0000000 --- a/flow-plugins/examples/image_input.toml +++ /dev/null @@ -1,13 +0,0 @@ -main = "input_image" - -[[graphs]] -name = "input_image" -connections = [{ cap=16, ports=["server:inp", "server:out"] }] - - # ImageInput: - # @inp: input port, message format: Any - # @out: output port, message format: dict { 'data': , 'extra_data': } (pyobject) - [[graphs.nodes]] - name = "server" - ty = "ImageInput" - urls = ["", ""] # image folder path diff --git a/flow-plugins/examples/image_server.toml b/flow-plugins/examples/image_server.toml deleted file mode 100644 index a3bcc88..0000000 --- a/flow-plugins/examples/image_server.toml +++ /dev/null @@ -1,15 +0,0 @@ -main = "image" - -[[graphs]] -name = "image" -connections = [{ cap=16, ports=["server:inp", "server:out"] }] - - # ImageServer: - # @inp: input port, message format: JSON string (python) if response format is json - # dict { 'data': } (pyobject) if response is image - # @out: output port, message format: dict { 'data': , 'extra_data': } (pyobject) - [[graphs.nodes]] - name = "server" - ty = "ImageServer" - port = 3030 # int, the port on which server will listen - response = "image" # json | image, which means response format diff --git a/flow-plugins/examples/video_input.toml b/flow-plugins/examples/video_input.toml deleted file mode 100644 index 3ab6657..0000000 --- a/flow-plugins/examples/video_input.toml +++ /dev/null @@ -1,31 +0,0 @@ -main = "input_video" - -[[graphs]] -name = "subgraph" -inputs = [{name="inp", cap=16, ports=["trans:inp"]}] -outputs = [{name="out", cap=16, ports=["trans:out"]}] - - [[graphs.nodes]] - name = "trans" - ty = "Transform" - -[[graphs]] -name = "video" -connections = [ - { cap=16, ports=["server:inp", "trans:out"] }, - { cap=16, ports=["server:out", "trans:inp"] } -] - - # VideoInput: - # @inp: input port, message format: Any - # @out: output port, message format: dict { 'data': } (pyobject) - [[graphs.nodes]] - name = "server" - ty = "VideoInput" - urls = ["1.ts", "2.ts"] # video urls - repeat = 10 # repeat times - # just an example, which can not run because of invalid message format - [[graphs.nodes]] - name = "trans" - ty = "subgraph" - diff --git a/flow-plugins/examples/video_server.toml b/flow-plugins/examples/video_server.toml deleted file mode 100644 index e2c5feb..0000000 --- a/flow-plugins/examples/video_server.toml +++ /dev/null @@ -1,31 +0,0 @@ -main = "video" - -[[graphs]] -name = "subgraph" -inputs = [{name="inp", cap=16, ports=["trans:inp"]}] -outputs = [{name="out", cap=16, ports=["trans:out"]}] - - [[graphs.nodes]] - name = "trans" - ty = "Transform" - -[[graphs]] -name = "video" -connections = [ - { cap=16, ports=["server:inp", "trans:out"] }, - { cap=16, ports=["server:out", "trans:inp"] } -] - - # VideoServer: - # @inp: input port, message format: JSON string (pyobject) - # @out: output port, message format: dict { 'data': } (pyobject) - [[graphs.nodes]] - name = "server" - ty = "VideoServer" - port = 8080 # int, the port on which server will listen - # just an example, which can not run because of invalid message format - [[graphs.nodes]] - name = "trans" - ty = "subgraph" - - diff --git a/flow-plugins/src/image_input.rs b/flow-plugins/src/image_input.rs deleted file mode 100644 index 5afea92..0000000 --- a/flow-plugins/src/image_input.rs +++ /dev/null @@ -1,110 +0,0 @@ -/** - * \file flow-plugins/src/image_input.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; -use futures_util::join; -use image::io::Reader as ImageReader; -use numpy::ToPyArray; -use pyo3::prelude::*; -use pyo3::types::IntoPyDict; -use std::fs; -use std::path::Path; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor)] -struct ImageInput { - urls: Vec, -} - -impl ImageInput { - fn new(_: String, args: &Table) -> ImageInput { - ImageInput { - urls: args["urls"] - .as_array() - .expect("expect string array for urls") - .iter() - .map(|n| n.as_str().unwrap().to_owned()) - .collect(), - inp: Default::default(), - out: Default::default(), - } - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - let out = std::mem::take(&mut self.out); - let urls = std::mem::take(&mut self.urls); - let decode = rt::task::spawn(async move { - let mut partial_id = 0u64; - for path in &urls { - if Path::new(&path).is_dir() { - match fs::read_dir(&path) { - Err(why) => { - println!("{:?}", why.kind()); - break; - } - Ok(dirs) => { - for dir in dirs { - let filepath = &dir.unwrap().path(); - if Path::new(&filepath).is_file() { - // skip sub directory - let decode_img = ImageReader::open(&filepath) - .unwrap() - .decode() - .expect("decode image fail"); - let img = decode_img.into_bgr8(); - - let pyobject: PyObject = - Python::with_gil(|py| -> PyResult<_> { - let data = img.as_raw(); - let ndarray = data.to_pyarray(py).reshape([ - img.height() as usize, - img.width() as usize, - 3, - ])?; - - Ok([ - ("data", ndarray.to_object(py)), - ( - "extra_data", - Path::new(&filepath).file_stem().to_object(py), - ), - ] - .into_py_dict(py) - .into()) - }) - .unwrap(); - - let mut envelope = Envelope::new(pyobject); - envelope.info_mut().partial_id = Some(partial_id); - partial_id += 1; - out.send(envelope).await.ok(); - } - } - } - } - } - } - }); - - let inp = std::mem::take(&mut self.inp); - let receiver = - rt::task::spawn(async move { while inp.recv::().await.is_ok() {} }); - - join!(receiver, decode); - Ok(()) - } -} - -node_register!("ImageInput", ImageInput); diff --git a/flow-plugins/src/image_server.rs b/flow-plugins/src/image_server.rs deleted file mode 100644 index a5c39c9..0000000 --- a/flow-plugins/src/image_server.rs +++ /dev/null @@ -1,164 +0,0 @@ -/** - * \file flow-plugins/src/image_server.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::utils::bare_json::BareJson; -use crate::utils::either::Either; -use crate::utils::error::reject_cause; -use crate::utils::image::Image; -use anyhow::Result; -use flow_rs::prelude::*; -use flow_rs::rt::sync::Mutex; -use futures_util::join; -use numpy::ToPyArray; -use pyo3::prelude::*; -use pyo3::types::{IntoPyDict, PyDict}; -use rweb::*; -use std::collections::HashMap; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor)] -struct ImageServer { - port: u16, - ty: RespTy, -} - -type Mapping = HashMap>; - -#[derive(Copy, Clone)] -enum RespTy { - Image, - Json, -} - -#[derive(Clone)] -struct State { - ty: RespTy, - mapping: Arc>, - out: Sender, - counter: Arc, -} - -#[post("/analyze/{extra_data}")] -#[openapi(summary = "analyze an image")] -async fn analyze( - #[data] state: State, - img: Image, - extra_data: String, -) -> Result, Rejection> { - let img = img.into_bgr8(); - let id = state.id(); - - let pyobject: PyObject = Python::with_gil(|py| -> PyResult<_> { - let data = img.as_raw(); - let ndarray = - data.to_pyarray(py) - .reshape([img.height() as usize, img.width() as usize, 3])?; - - Ok([ - ("data", ndarray.to_object(py)), - ("extra_data", extra_data.to_object(py)), - ] - .into_py_dict(py) - .into()) - }) - .map_err(reject_cause)?; - - let r = { - let (s, r) = oneshot::channel(); - state.mapping.lock().await.insert(id, s); - let envelope = Envelope::with_info( - pyobject, - EnvelopeInfo { - partial_id: Some(id), - ..Default::default() - }, - ); - state.out.send(envelope).await.ok(); - r - }; - let message = r.await.map_err(reject_cause)?; - match state.ty { - RespTy::Image => Python::with_gil(|py| -> PyResult<_> { - let dict: &PyDict = message.extract(py)?; - flow_rs::helper::uget_slice(py, dict.get_item("data").expect("error key")) - }) - .map_err(reject_cause) - .map(|data| Image::from_raw(img.width(), img.height(), &data).unwrap()) - .map(Either::Left), - RespTy::Json => Python::with_gil(|py| message.extract::(py)) - .map_err(reject_cause) - .map(BareJson::new) - .map(Either::Right), - } -} - -impl ImageServer { - fn new(_: String, args: &Table) -> ImageServer { - let response = args.get("response").map(|resp| resp.as_str()).flatten(); - ImageServer { - ty: if response == Some("json") { - RespTy::Json - } else { - RespTy::Image - }, - port: args["port"] - .as_integer() - .expect("expect args[port] in node[ImageServer]") - .to_owned() as u16, - inp: Default::default(), - out: Default::default(), - } - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - let state = State::new(self.ty, std::mem::take(&mut self.out)); - let mapping = state.mapping.clone(); - let inp = std::mem::take(&mut self.inp); - - let (spec, filter) = openapi::spec().build(move || analyze(state)); - - join! { - serve(filter.or(openapi_docs(spec))).run(([0, 0, 0, 0], self.port)), - async move { - while let Ok(mut msg) = inp.recv::().await { - let id = msg.info().partial_id.expect("partial_id required by image_server"); - let msg = msg.unpack(); - let mut mapping = mapping.lock().await; - if let Some(sender) = mapping.remove(&id) { - sender.send(msg).ok(); - } - } - } - }; - Ok(()) - } -} - -node_register!("ImageServer", ImageServer); - -impl State { - fn new(ty: RespTy, out: Sender) -> State { - State { - ty, - mapping: Default::default(), - out, - counter: Arc::new(AtomicU64::new(0)), - } - } - fn id(&self) -> u64 { - self.counter.fetch_add(1, Ordering::Relaxed) - } -} diff --git a/flow-plugins/src/lib.rs b/flow-plugins/src/lib.rs deleted file mode 100644 index 4da368f..0000000 --- a/flow-plugins/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * \file flow-plugins/src/lib.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod image_input; -mod image_server; - -mod utils; -mod video_input; -mod video_server; - -#[doc(hidden)] -pub fn export() { - pyo3::prepare_freethreaded_python(); - pretty_env_logger::init(); -} diff --git a/flow-plugins/src/utils/bare_json.rs b/flow-plugins/src/utils/bare_json.rs deleted file mode 100644 index 13f30c8..0000000 --- a/flow-plugins/src/utils/bare_json.rs +++ /dev/null @@ -1,64 +0,0 @@ -/** - * \file flow-plugins/src/utils/bare_json.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use headers::{ContentType, HeaderMapExt}; -use indexmap::IndexMap; -use mime::Mime; -use rweb::openapi::*; -use rweb::*; -use std::borrow::Cow; -use std::str::FromStr; - -#[derive(Schema)] -pub(crate) struct BareJson { - inner: String, -} - -impl BareJson { - pub fn new(inner: String) -> BareJson { - BareJson { inner } - } -} - -impl ResponseEntity for BareJson { - fn describe_responses() -> Responses { - let mut resps = IndexMap::new(); - - let mut content = IndexMap::new(); - content.insert( - Cow::Borrowed("application/json"), - MediaType { - schema: Some(ObjectOrReference::Object(Self::describe())), - examples: None, - encoding: Default::default(), - }, - ); - - resps.insert( - Cow::Borrowed("200"), - Response { - content, - ..Default::default() - }, - ); - resps - } -} - -impl Reply for BareJson { - #[inline] - fn into_response(self) -> reply::Response { - let mut resp = reply::Response::new(self.inner.into()); - resp.headers_mut().typed_insert(ContentType::from( - Mime::from_str("application/json").unwrap(), - )); - resp - } -} diff --git a/flow-plugins/src/utils/codec.rs b/flow-plugins/src/utils/codec.rs deleted file mode 100644 index 036bea1..0000000 --- a/flow-plugins/src/utils/codec.rs +++ /dev/null @@ -1,104 +0,0 @@ -/** - * \file flow-plugins/src/utils/codec.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use ffmpeg_next::format::{input, Pixel}; -use ffmpeg_next::media::Type; -use ffmpeg_next::software::scaling::{context::Context, flag::Flags}; -use ffmpeg_next::util::frame::video::Video; -use flow_rs::prelude::*; -use numpy::ToPyArray; -use pyo3::prelude::*; -use pyo3::types::IntoPyDict; -use std::path::Path; -use std::sync::Once; - -static ONCE_INIT: Once = Once::new(); - -pub fn decode_video( - id: u64, - path: impl AsRef, - sender: &Sender, -) -> Result<(), ffmpeg_next::Error> { - ONCE_INIT.call_once(|| { - ffmpeg_next::init().unwrap(); - }); - - let mut ictx = input(&path)?; - - let input = ictx - .streams() - .best(Type::Video) - .ok_or(ffmpeg_next::Error::StreamNotFound)?; - - let video_stream_index = input.index(); - - let mut decoder = input.codec().decoder().video()?; - - let mut scaler = Context::get( - decoder.format(), - decoder.width(), - decoder.height(), - Pixel::BGR24, - decoder.width(), - decoder.height(), - Flags::BILINEAR, - )?; - - let mut fid = 0; - - 'main: for (stream, packet) in ictx.packets() { - if stream.index() == video_stream_index { - decoder.send_packet(&packet)?; - - let mut decoded = Video::empty(); - - while decoder.receive_frame(&mut decoded).is_ok() { - let mut bgr_frame = Video::empty(); - scaler.run(&decoded, &mut bgr_frame)?; - - let ndarray = Python::with_gil(|py| -> PyResult<_> { - let data = bgr_frame.data(0); - let ndarray = data.to_pyarray(py).reshape([ - bgr_frame.height() as usize, - bgr_frame.stride(0) / 3, - 3, - ])?; - - Ok([("data", ndarray.to_object(py))] - .into_py_dict(py) - .to_object(py)) - }) - .unwrap(); - - let envelope = Envelope::with_info( - ndarray, - EnvelopeInfo { - from_addr: Some(id), - partial_id: Some(fid), - ..Default::default() - }, - ); - let ret = flow_rs::rt::task::block_on(async { sender.send(envelope).await }); - fid += 1; - - if matches!(ret, Err(_)) { - break 'main; - } - } - } - } - - decoder.send_eof()?; - - let mut decoded = Video::empty(); - while decoder.receive_frame(&mut decoded).is_ok() {} - - Ok(()) -} diff --git a/flow-plugins/src/utils/either.rs b/flow-plugins/src/utils/either.rs deleted file mode 100644 index 90e6544..0000000 --- a/flow-plugins/src/utils/either.rs +++ /dev/null @@ -1,58 +0,0 @@ -/** - * \file flow-plugins/src/utils/either.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use rweb::openapi::{ResponseEntity, Responses}; -use rweb::*; - -#[derive(Schema)] -pub(crate) enum Either { - Left(L), - Right(R), -} - -impl Reply for Either -where - L: Reply, - R: Reply, -{ - #[inline] - fn into_response(self) -> reply::Response { - match self { - Either::Left(l) => l.into_response(), - Either::Right(r) => r.into_response(), - } - } -} - -impl ResponseEntity for Either -where - L: ResponseEntity, - R: ResponseEntity, -{ - fn describe_responses() -> Responses { - let mut lresps = L::describe_responses(); - let rresps = R::describe_responses(); - - for (k, rresp) in &rresps { - if lresps.contains_key(k) { - let lresp = lresps.get_mut(k).unwrap(); - for (k, v) in &rresp.content { - if !lresp.content.contains_key(k) { - lresp.content.insert(k.clone(), v.clone()); - } - } - } else { - lresps.insert(k.clone(), rresp.clone()); - } - } - - lresps - } -} diff --git a/flow-plugins/src/utils/error.rs b/flow-plugins/src/utils/error.rs deleted file mode 100644 index a30c420..0000000 --- a/flow-plugins/src/utils/error.rs +++ /dev/null @@ -1,39 +0,0 @@ -/** - * \file flow-plugins/src/utils/error.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use std::fmt::Debug; - -use rweb::Rejection; - -#[derive(Debug)] -struct RejectCause -where - T: 'static + Debug + Send + Sync, -{ - err: T, -} - -impl rweb::reject::Reject for RejectCause where T: 'static + Debug + Send + Sync {} - -impl From for RejectCause -where - T: 'static + Debug + Send + Sync, -{ - fn from(err: T) -> Self { - RejectCause { err } - } -} - -pub fn reject_cause(err: T) -> Rejection -where - T: 'static + Debug + Send + Sync, -{ - rweb::reject::custom(RejectCause::from(err)) -} diff --git a/flow-plugins/src/utils/image.rs b/flow-plugins/src/utils/image.rs deleted file mode 100644 index c9fbb6f..0000000 --- a/flow-plugins/src/utils/image.rs +++ /dev/null @@ -1,150 +0,0 @@ -/** - * \file flow-plugins/src/utils/image.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use flow_rs::rt::io::prelude::WriteExt; -use futures_util::{pin_mut, StreamExt}; -use headers::{AcceptRanges, ContentLength, ContentType, HeaderMapExt}; -use hyper::Body; -use image::GenericImageView; -use indexmap::IndexMap; -use std::borrow::Cow; -use std::io::Cursor; -use std::ops::Deref; -use std::str::FromStr; - -use super::error::reject_cause; - -use mime::Mime; -use rweb::openapi::{ - Entity, MediaType, ObjectOrReference, Response, ResponseEntity, Responses, Schema, Type, -}; -use rweb::*; - -pub struct Image(image::DynamicImage); - -impl Image { - pub fn into_bgr8(self) -> image::ImageBuffer, Vec> { - self.0.into_bgr8() - } - - pub fn from_raw(w: u32, h: u32, buf: &[u8]) -> Option { - let mut owned = vec![]; - owned.extend_from_slice(buf); - image::ImageBuffer::from_raw(w, h, owned) - .map(|buf| Image(image::DynamicImage::ImageBgr8(buf))) - } -} - -impl Entity for Image { - fn describe() -> Schema { - Schema { - description: Cow::Borrowed("image"), - schema_type: Some(Type::String), - format: Cow::Borrowed("binary"), - ..Default::default() - } - } -} - -impl ResponseEntity for Image { - fn describe_responses() -> Responses { - let mut resps = IndexMap::new(); - - let mut content = IndexMap::new(); - content.insert( - Cow::Borrowed("image/jpeg"), - MediaType { - schema: Some(ObjectOrReference::Object(Self::describe())), - examples: None, - encoding: Default::default(), - }, - ); - - resps.insert( - Cow::Borrowed("200"), - Response { - content, - ..Default::default() - }, - ); - resps - } -} - -impl Deref for Image { - type Target = image::DynamicImage; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl FromRequest for Image { - type Filter = rweb::filters::BoxedFilter<(Image,)>; - - fn is_body() -> bool { - true - } - - fn content_type() -> &'static str { - "image/*" - } - - fn new() -> Self::Filter { - rweb::header::("content-type") - .and(filters::body::stream()) - .and_then(extract_image) - .boxed() - } -} - -impl Reply for Image { - #[inline] - fn into_response(self) -> reply::Response { - use image::codecs::jpeg::JpegEncoder as Encoder; - let mut buf = vec![]; - let mut encoder = Encoder::new(&mut buf); - encoder - .encode(self.as_bytes(), self.width(), self.height(), self.color()) - .unwrap(); - let len = buf.len(); - let mut resp = reply::Response::new(Body::from(buf)); - - resp.headers_mut().typed_insert(ContentLength(len as u64)); - resp.headers_mut() - .typed_insert(ContentType::from(Mime::from_str("image/jpeg").unwrap())); - resp.headers_mut().typed_insert(AcceptRanges::bytes()); - - resp - } -} - -async fn extract_image( - mime: Mime, - body: impl Stream>, -) -> Result { - if mime == mime::IMAGE_STAR { - let mut buf = Vec::with_capacity(1024 * 1024 * 3); - pin_mut!(body); - while let Some(inner) = body.next().await { - let inner = inner.map_err(reject_cause)?; - buf.write_all(inner.chunk()).await.map_err(reject_cause)?; - } - - use image::io::Reader as ImageReader; - let reader = ImageReader::new(Cursor::new(buf)) - .with_guessed_format() - .map_err(reject_cause)?; - let image = Image(reader.decode().map_err(reject_cause)?); - Ok(image) - } else { - Err(rweb::reject::reject()) - } -} diff --git a/flow-plugins/src/utils/mod.rs b/flow-plugins/src/utils/mod.rs deleted file mode 100644 index a97a27f..0000000 --- a/flow-plugins/src/utils/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -/** - * \file flow-plugins/src/utils/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -pub mod bare_json; -pub mod codec; -pub mod either; -pub mod error; -pub mod image; -#[allow(dead_code)] -pub mod multipart; diff --git a/flow-plugins/src/utils/multipart.rs b/flow-plugins/src/utils/multipart.rs deleted file mode 100644 index 8f18ee7..0000000 --- a/flow-plugins/src/utils/multipart.rs +++ /dev/null @@ -1,101 +0,0 @@ -/** - * \file flow-plugins/src/utils/multipart.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use mime::Mime; -use rand::distributions::{Alphanumeric, Distribution}; -use std::str::FromStr; - -pub struct MultipartWriter { - inner: W, - boundary: String, - data_written: bool, -} - -impl MultipartWriter { - pub fn new(inner: W) -> Self { - let mut boundary = String::with_capacity(32); - boundary.extend( - Alphanumeric - .sample_iter(rand::thread_rng()) - .take(32) - .map(|c| c as char), - ); - MultipartWriter { - inner, - boundary, - data_written: false, - } - } - - fn get_field_header(&self, name: &str, content_type: &Mime) -> String { - format!( - "--{}\r\nContent-Disposition: attachment; name=\"{}\"\r\nContent-Type: {}\r\n\r\n", - self.boundary, name, content_type - ) - } - - pub fn into_inner(self) -> W { - self.inner - } - - pub fn header(&self) -> Mime { - Mime::from_str(format!("multipart/form-data; boundary={}", self.boundary).as_str()).unwrap() - } -} - -impl MultipartWriter { - fn write_field_header(&mut self, name: &str, content_type: &Mime) -> std::io::Result<()> { - let mut header = std::io::Cursor::new(self.get_field_header(name, content_type)); - std::io::copy(&mut header, &mut self.inner)?; - self.data_written = true; - Ok(()) - } - - pub fn write_field_with( - &mut self, - name: &str, - content_type: &Mime, - f: F, - ) -> std::io::Result<&mut Self> - where - F: Fn(&mut W) -> std::io::Result<()>, - { - self.write_field_header(name, content_type)?; - f(&mut self.inner)?; - self.inner.write_all(b"\r\n")?; - Ok(self) - } - - pub fn write_field( - &mut self, - name: &str, - content_type: &Mime, - mut contents: R, - ) -> std::io::Result<&mut Self> { - self.write_field_header(name, content_type)?; - std::io::copy(&mut contents, &mut self.inner)?; - self.inner.write_all(b"\r\n")?; - Ok(self) - } - - pub fn write_text(&mut self, name: &str, text: &str) -> std::io::Result<&mut Self> { - self.write_field(name, &mime::TEXT_PLAIN, text.as_bytes()) - } - - pub fn finish(&mut self) -> std::io::Result<()> { - if self.data_written { - self.inner.write_all(b"--")?; - self.inner.write_all(self.boundary.as_bytes())?; - self.inner.write_all(b"--\r\n")?; - } - self.inner.flush()?; - Ok(()) - } -} diff --git a/flow-plugins/src/video_input.rs b/flow-plugins/src/video_input.rs deleted file mode 100644 index 5890d4f..0000000 --- a/flow-plugins/src/video_input.rs +++ /dev/null @@ -1,99 +0,0 @@ -/** - * \file flow-plugins/src/video_input.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::utils::codec; -use ::log::error; -use anyhow::Result; -use flow_rs::prelude::*; -use futures_util::future::join_all; -use serde::Serialize; -use std::path::Path; -use toml::value::Table; - -#[inputs(inp:dyn)] -#[outputs(out:dyn)] -#[derive(Node, Default)] -struct VideoInput { - urls: Vec, - repeat: u32, -} - -#[derive(Serialize)] -struct VideoDescp { - id: u64, - url: String, -} - -impl VideoInput { - fn new(_: String, args: &Table) -> VideoInput { - VideoInput { - urls: args["urls"] - .as_array() - .expect("expect string array for urls") - .iter() - .map(|n| n.as_str().unwrap().to_owned()) - .collect(), - repeat: args["repeat"] - .as_integer() - .expect("expect args[repeat] in node[VideoInput]") - .to_owned() as u32, - ..Default::default() - } - } -} - -node_register!("VideoInput", VideoInput); - -impl Actor for VideoInput { - fn start( - mut self: Box, - _: Context, - resources: ResourceCollection, - ) -> rt::task::JoinHandle<()> { - rt::task::spawn(async move { - let mut recv_conns = vec![]; - - let mut id = 0u64; - for _ in 0..self.repeat { - for url in self.urls.iter() { - if Path::new(&url).is_file() { - id += 1; - // create multiple stream - self.out - .create(id.to_owned(), resources.clone()) - .await - .expect("broker has closed"); - let (_, port) = self.out.fetch().await.expect("broker has closed"); - let url_cloned = url.clone(); - let port_cloned = port.clone(); - flow_rs::rt::task::spawn_blocking( - move || -> Result<(), ffmpeg_next::Error> { - if let Err(err) = codec::decode_video(id, &url_cloned, &port_cloned) - { - error!("video[{}] {} decode fault: {:?}", id, url_cloned, err); - Err(err) - } else { - port_cloned.close(); - Ok(()) - } - }, - ); - - // recv streams - let (_, port) = self.inp.fetch().await.unwrap(); - recv_conns.push(async move { while port.recv_any().await.is_ok() {} }); - } - } - } - - join_all(recv_conns).await; - }) - } -} diff --git a/flow-plugins/src/video_server.rs b/flow-plugins/src/video_server.rs deleted file mode 100644 index 4a41d5c..0000000 --- a/flow-plugins/src/video_server.rs +++ /dev/null @@ -1,230 +0,0 @@ -/** - * \file flow-plugins/src/video_server.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::utils::codec; -use super::utils::error; -use ::log::error; -use anyhow::Result; -use flow_rs::prelude::*; -use flow_rs::rt::sync::Mutex; -use futures_util::{pin_mut, select, stream::FuturesUnordered, FutureExt, StreamExt}; -use pyo3::prelude::*; -use rweb::*; -use serde::Serialize; -use std::collections::HashMap; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; -use toml::value::Table; - -type RwebResult = Result; - -#[inputs(inp:dyn)] -#[outputs(out:dyn)] -#[derive(Node, Actor, Default)] -struct VideoServer { - port: u16, - resources: Option, -} - -#[derive(Serialize)] -struct VideoDescp { - id: u64, - url: String, -} - -#[derive(Clone)] -struct State { - mapping: Arc>>, - sender: flow_rs::rt::channel::Sender<(u64, String, oneshot::Sender)>, - counter: Arc, -} - -struct Messages { - mapping: HashMap>, -} - -type MessagesWithLock = Arc>; - -#[post("/start/{url}")] -#[openapi(summary = "start a video stream")] -async fn start(#[data] state: State, url: String) -> RwebResult { - let id = state.id(); - let (s, r) = oneshot::channel(); - state.sender.send((id, url, s)).await.ok(); - r.await.unwrap() -} - -#[post("/stop/{id}")] -#[openapi(summary = "stop a video stream by id")] -async fn stop(#[data] state: State, id: u64) -> RwebResult { - if let Some((_, sender)) = state.mapping.lock().await.remove(&id) { - sender.close(); - Ok(format!("stop stream {} success", id)) - } else { - Err(reject::not_found()) - } -} - -#[get("/list")] -#[openapi(summary = "list all video streams")] -async fn list(#[data] state: State) -> Result { - let mapping = state.mapping.lock().await; - let mut videos = vec![]; - for (descp, _) in mapping.values() { - videos.push(descp); - } - Ok(rweb::reply::json(&videos)) -} - -#[get("/get_msgs/{id}")] -#[openapi(summary = "get messages from video analyze by id")] -async fn get_msgs(#[data] messages: MessagesWithLock, id: u64) -> Result { - let mut messages = messages.lock().await; - if let Some(messages) = messages.mapping.get_mut(&id) { - let ret = Ok(rweb::reply::json(messages)); - messages.clear(); - ret - } else { - Err(reject::not_found()) - } -} - -impl VideoServer { - fn new(_: String, args: &Table) -> VideoServer { - VideoServer { - port: args["port"] - .as_integer() - .expect("expect args[port] in node[VideoServer]") - .to_owned() as u16, - ..Default::default() - } - } - - async fn initialize(&mut self, resources: ResourceCollection) { - self.resources = Some(resources); - } - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &flow_rs::graph::Context) -> Result<()> { - let (s, r) = flow_rs::rt::channel::unbounded(); - let state = State::new(s); - let mapping = state.mapping.clone(); - let messages = Messages::new().with_lock(); - let messages_cloned = messages.clone(); - - let (spec, filter) = openapi::spec().build(move || { - start(state.clone()) - .or(stop(state.clone())) - .or(list(state)) - .or(get_msgs(messages_cloned)) - }); - - let mut recv_msgs = FuturesUnordered::new(); - let mut recv_conns = FuturesUnordered::new(); - let mut spawn_decode = FuturesUnordered::new(); - let listen = serve(filter.or(openapi_docs(spec))) - .run(([0, 0, 0, 0], self.port)) - .fuse(); - recv_conns.push(self.inp.fetch()); - spawn_decode.push(r.recv()); - - pin_mut!(listen); - - loop { - select! { - // server listen - _ = listen => break, - // spawn task to wait message from subgraph - conns = recv_conns.select_next_some() => { - if let Ok((id, port)) = conns { - let messages = messages.clone(); - recv_msgs.push(async move { - while let Ok(mut msg) = port.recv().await { - let messages_map = &mut messages.lock().await.mapping; - let messages = messages_map.entry(id).or_default(); - let msg = Python::with_gil(|py| -> PyResult<_> { - let msg: PyObject = msg.unpack(); - let msg = msg.as_ref(py).extract()?; - Ok(msg) - }).expect("plugin[VideoServier] only support python string as input"); - messages.push(msg); - } - }); - recv_conns.push(self.inp.fetch()); - } - }, - // wait message from subgraph - _ = recv_msgs.select_next_some() => {}, - // spawn subgraph - ret = spawn_decode.select_next_some() => { - if let Ok((id, url, waker)) = ret { - self.out.create(id, self.resources.clone().unwrap()).await.expect("broker has closed"); - let (_, port) = self.out.fetch().await.expect("broker has closed"); - let url = urlencoding::decode(&url).unwrap().into_owned(); - let url_cloned = url.clone(); - let port_cloned = port.clone(); - let handle = flow_rs::rt::task::spawn_blocking(move || -> Result<(), ffmpeg_next::Error> { - if let Err(err) = codec::decode_video(id, &url_cloned, &port_cloned) { - error!("video[{}] {} decode fault: {:?}", id, url_cloned, err); - Err(err) - } else { - port_cloned.close(); - Ok(()) - } - }); - match flow_rs::rt::future::timeout(std::time::Duration::from_millis(200), handle).await { - Ok(ret) => match ret { - Ok(_) => { - mapping.lock().await.insert(id, (VideoDescp { id, url }, port)); - waker.send(Ok(format!("start stream whose id is {}", id))).ok() - } - Err(err) => waker.send(Err(error::reject_cause(err))).ok(), - }, - Err(_) => { - mapping.lock().await.insert(id, (VideoDescp { id, url }, port)); - waker.send(Ok(format!("start stream whose id is {}", id))).ok() - } - }; - spawn_decode.push(r.recv()); - } - }, - } - } - - Ok(()) - } -} - -node_register!("VideoServer", VideoServer); - -impl State { - fn new( - sender: flow_rs::rt::channel::Sender<(u64, String, oneshot::Sender)>, - ) -> State { - State { - mapping: Default::default(), - sender, - counter: Arc::new(AtomicU64::new(0)), - } - } - fn id(&self) -> u64 { - self.counter.fetch_add(1, Ordering::Relaxed) - } -} - -impl Messages { - fn new() -> Messages { - Messages { - mapping: Default::default(), - } - } - fn with_lock(self) -> MessagesWithLock { - Arc::new(Mutex::new(self)) - } -} diff --git a/flow-python/.gitattributes b/flow-python/.gitattributes deleted file mode 100644 index e69de29..0000000 diff --git a/flow-python/examples/cat_finder/README.md b/flow-python/examples/cat_finder/README.md deleted file mode 100644 index 1d50aa9..0000000 --- a/flow-python/examples/cat_finder/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# 猫猫围栏 - -## 一、功能概述 -注册的猫猫离开围栏,会收到一条告警信息。未注册的不会报警。 CPU 配置已提供,没有 GPU 也可以运行。 - -## 二、[模型和自测数据下载](../../../docs/download-models.zh.md) - -## 三、软件安装 - -启动 redis-server -```bash -$ sudo apt install redis-server -$ redis-server & -... -756417:M 18 Aug 2021 17:46:14.641 * Ready to accept connections -``` - -安装 megengine(1.6.0 引入 lite 接口,简化推理并提供模型加密方案) -```bash -$ conda activate py38 -$ python3 -m pip install --upgrade pip -$ python3 -m pip install megengine==1.6.0rc1 -f https://megengine.org.cn/whl/mge.html -$ python3 -... ->>> import megengine as mge ->>> mge.__version__ -'1.6.0' -``` - -**此处 30xx 卡常见问题**:Ampere 架构的卡安装 megengine,需要看这个 [issue](https://github.com/MegEngine/MegEngine/issues/212)。解决 30xx 强依赖 cuda11 而 mge 又无法分发(EAR 约束)的问题。 - -## 四、图片注册 - -启动图片服务 -```bash -$ cd flow-python/examples -$ pip3 install -r requires.txt -$ run_with_plugins -c cat_finder/image_gpu.toml -p cat_finder # 有 GPU 的机器执行这个 -$ run_with_plugins -c cat_finder/image_cpu.toml -p cat_finder # 无 GPU 的 laptop 执行这句 -``` - -现在 8081 端口部署了“猫体注册”服务,只需要打开浏览器上传图片、猫咪名称即可。`cat_finder/image_gpu.toml` 详细解释见 [how-to-add-graph](../../../docs/how-to-add-my-service/appendix-A-graph-definition.zh.md) 。这里只需要浏览器打开主机所在 8081 端口服务(如 http://127.0.0.1:8081/docs )。 - -![](images/cat_finder_image_select.jpg) - -测试图片在软链接后的 `models/cat_finder_testdata` 目录。打开浏览器 UI 中选择图片、填写名称,提交即可。成功后 -* 用 redis-cli `keys *`可查到对应 BASE64 特征 -* 前端展示检测框 - -![](images/cat_finder_image_result.jpg) - -**此处 wsl2 常见问题**:win10 wsl2 用 127.0.0.1 地址打不开服务,**注意 127 是指物理机, wsl2 运行的是虚拟机**,需要 `wsl -- ifconfig` 获取 ip,后面都用虚拟机的 ip。 - -**此处 docker 常见问题**:服务部署在 docker 里、客户端无法直连,这里提供一些方法: - -1) 运行时容器使用端口映射。例如把内部容器的 8081 映射成外部物理机的 18081、把 8082 映射成 18082 -```bash -$ docker run -p 18081:8081 -p 18082:8082 -it ubuntu /bin/bash -``` -此时用`docker ps`可以看到 PORTS 映射关系 -```bash -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -d4b5b563051e ubuntu "/bin/bash" 9 seconds ago Up 8 seconds 0.0.0.0:18081->8081/tcp, :::18081->8081/tcp, 0.0.0.0:18082->8082/tcp, :::18082->8082/tcp nostalgic_swartz - -``` -浏览器打开宿主机的 ip:18081 端口即可使用 - -2)在容器内用 `cURL` 发 HTTP POST 请求,不再用 web UI -```bash -$ curl http://127.0.0.1:8081/analyze/my_cat_name -X POST --header "Content-Type:image/*" --data-binary @test.jpeg --output out.jpg -``` -`my_cat_name` 是注册的猫咪名称;`test.jpeg` 是测试图片;`output.jpg` 是返回的可视化图片。 - -3)Python 提供了调用参照 [image_client.py](../../examples/misc/image_client.py) - -## 五、准备视频识别 - -启动解析服务 -```bash -$ cd flow-python/examples -$ run_with_plugins -c cat_finder/video_gpu.toml -p cat_finder # 有 GPU 的机器 -$ run_with_plugins -c cat_finder/video_cpu.toml -p cat_finder # 无 GPU 的设备用这句 -``` -浏览器打开 8082 端口服务(如 http://127.0.0.1:8082/docs ,注意区分物理机和虚拟机的对应 ip) - -![](images/cat_finder_video_select.jpg) - -可以看到 MegFlow 提供了 4 个 API:启/停一路解析、消费当前解析结果、列出所有信息。 - -开启一路视频流解析需要流的 url,这里有两种方法: - -1)准备一个 rtsp 视频流地址,做测试输入(流地址部署不方便,也可以直接用离线文件的绝对路径代替)。模型包目录提供了测试视频,在 `models/cat_finder_testdata`,需要用户自行部署 live555 服务。最直接的办法: -```bash -$ wget https://github.com/aler9/rtsp-simple-server/releases/download/v0.17.2/rtsp-simple-server_v0.17.2_linux_amd64.tar.gz -$ -$ tar xvf rtsp-simple-server_v0.17.2_linux_amd64.tar.gz && ./rtsp-simple-server -$ ffmpeg -re -stream_loop -1 -i ${models}/cat_finder_testdata/test1.ts -c copy -f rtsp rtsp://127.0.0.1:8554/test1.ts -``` - -* 想用 laptop/树莓派摄像头可搜索 Camera 推流教程 -* 也可以手机拍摄视频,再用 ffmpeg 转成 .ts 格式推到 live555 server - -相关教程已整合在 [如何生成自己的 rtsp 流地址](../../../docs/how-to-build-and-run/generate-rtsp.zh.md) 。 - -2)如果 rtsp 流地址部署不方便,也可以直接用离线文件的绝对路径代替,也就是在 WebUI 中输入类似`/mnt/data/stream/file.ts` 的路径。需要自行保证服务器可访问这个文件、并且格式是可以被 ffmpeg 解析的(例如 .ts/.mp4/.h264/.h265)。 - -## 六、视频识别 FAQ - -* 如果用 wsl2 部署,注意区分物理机和虚拟机的 ip -* 如果服务部署在 docker 里,同样可以把 8082 端口映射到宿主机端口 - -## 七、运行 - -### 1)WebUI 方式 - -`try it out` 其中的 `/start/{url}` 接口,输入 rtsp 地址(如“rtsp://127.0.0.1:8554/test1.ts”或者“/home/name/file.mp4”),会返回 stream_id(例如 0)。 - -* 服务将打印相关日志 - -```bash -2021-08-30 15:17:30.361 | DEBUG | cat_finder.shaper:exec:82 - shaper recv failed_ids [1] -2021-08-30 15:17:31.760 | DEBUG | warehouse.detection_yolox.lite:inference:157 - YOLOX infer time: 0.4643s -2021-08-30 15:17:34.094 | INFO | cat_finder.track:exec:27 - stream tracker finish -2021-08-30 15:17:34.094 | INFO | cat_finder.shaper:exec:47 - stream shaper finish -2021-08-30 15:17:34.201 | DEBUG | warehouse.reid_alignedreid.lite:inference:57 - ReID infer time: 0.1072s -2021-08-30 15:17:34.203 | INFO | cat_finder.redis_proxy:search_key:72 - key: b'feature.laohu' dist: 0.7931023836135864 -2021-08-30 15:17:34.203 | INFO | cat_finder.redis_proxy:search_key:72 - key: b'feature.pingai' dist: 0.5928362607955933 -``` - -* 用 stream_id 做 `/get_msgs/{id}` 的入参,可拉取这路流的解析结果 -* redis-cli `keys *` 可看到报警信息 -```bash -$ redis-cli -127.0.0.1:6379> keys * -1) "feature.laohu" -2) "notification.cat_finder" -3) "feature.pingai" -``` -用 `rpop notification.cat_finder` 可消费报警消息。 - -### 2)命令行方式 -对应的 `cURL` 命令参考 -```bash -$ curl -X POST 'http://127.0.0.1:8082/start/rtsp%3A%2F%2F127.0.0.1%3A8554%2Ftest1.ts' # start rtsp://127.0.0.1:8554/test1.ts -start stream whose id is 2% -$ curl 'http://127.0.0.1:8082/list' # list all stream -[{"id":1,"url":"rtsp://10.122.101.175:8554/test1.ts"},{"id":0,"url":"rtsp://10.122.101.175:8554/test1.ts"}]% -``` -路径中的 `%2F`、`%3A` 是 [URL](https://www.ietf.org/rfc/rfc1738.txt) 的转义字符 - -### 3)Python 代码方式 -参照 [video_client.py](../../examples/misc/video_client.py) 实现 - -## 八、 Web 实时展示解析结果 - -参考 [tutorial04](../../../docs/how-to-add-my-service/04-web-visualization.zh.md) 操作说明 diff --git a/flow-python/examples/cat_finder/__init__.py b/flow-python/examples/cat_finder/__init__.py deleted file mode 100644 index f57558f..0000000 --- a/flow-python/examples/cat_finder/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 diff --git a/flow-python/examples/cat_finder/det.py b/flow-python/examples/cat_finder/det.py deleted file mode 100644 index bb89a25..0000000 --- a/flow-python/examples/cat_finder/det.py +++ /dev/null @@ -1,84 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import numpy as np -from loguru import logger -from megflow import register -from warehouse.detection_yolox import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class Detect: - def __init__(self, name, args): - logger.info("loading YOLOX detection...") - self._tsize = args['tsize'] - self._interval = args['interval'] - self._visualize = args['visualize'] - self.name = name - - # load detect model and warmup - self._predictor = PredictorLite(path=args['path'], - confthre=args['conf'], - nmsthre=args['nms'], - test_size=(self._tsize, self._tsize), - device=args['device'], - device_id=args['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._predictor.inference(warmup_data) - logger.info(" YOLOX loaded.") - - @staticmethod - def restrict(val, min, max): - assert min < max - if val < min: - val = min - if val > max: - val = max - return val - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - - msg = envelope.msg - msg['items'] = [] - - process = envelope.partial_id % self._interval == 0 - if process: - data = msg['data'] - outputs = self._predictor.inference(data) - # skip if detect nothing - if outputs is not None: - items = [] - - for i in range(outputs.shape[0]): - output = outputs[i] - # if neither cat nor dog, skip - if round(output[6]) != 15 and round(output[6]) != 16: - continue - - item = dict() - item["bbox"] = output[0:4] - item["cls"] = round(output[6]) - item["score"] = output[4] * output[5] - items.append(item) - msg['items'] = items - - # import cv2 - # x = self._predictor.visual(outputs, data) - # name = 'frame{0:07d}.jpg'.format(envelope.partial_id) - # cv2.imwrite(name, x) - - if self._visualize == 1: - msg['data'] = self._predictor.visual(outputs, data) - msg['process'] = process - self.out.send(envelope) diff --git a/flow-python/examples/cat_finder/image_cpu.toml b/flow-python/examples/cat_finder/image_cpu.toml deleted file mode 100644 index 94e188c..0000000 --- a/flow-python/examples/cat_finder/image_cpu.toml +++ /dev/null @@ -1,54 +0,0 @@ -main = "cat_finder_image" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "reid_image:inp"] }, - { cap = 16, ports = ["reid_image:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "det" - ty = "Detect" - model = "yolox-s" - conf = 0.25 - nms = 0.45 - tsize = 640 - path = "models/cat_finder_models/yolox_s.mge" - interval = 1 - visualize = 1 - device = "cpu" - device_id = 0 - - [[graphs.nodes]] - name = "reid_image" - ty = "ReIDImage" - path = "models/cat_finder_models/resnet50.mge" - device = "cpu" - device_id = 1 - - [[graphs.nodes]] - name = "redis_proxy" - ty = "RedisProxy" - ip = "127.0.0.1" - port = "6379" - mode = "save" - prefix = "feature." - -[[graphs]] -name = "cat_finder_image" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "ImageServer" - port = 8081 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/cat_finder/image_gpu.toml b/flow-python/examples/cat_finder/image_gpu.toml deleted file mode 100644 index 7f47a27..0000000 --- a/flow-python/examples/cat_finder/image_gpu.toml +++ /dev/null @@ -1,54 +0,0 @@ -main = "cat_finder_image" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "reid_image:inp"] }, - { cap = 16, ports = ["reid_image:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "det" - ty = "Detect" - model = "yolox-s" - conf = 0.25 - nms = 0.45 - tsize = 640 - path = "models/cat_finder_models/yolox_s.mge" - interval = 1 - visualize = 1 - device = "gpu" - device_id = 0 - - [[graphs.nodes]] - name = "reid_image" - ty = "ReIDImage" - path = "models/cat_finder_models/resnet50.mge" - device = "gpu" - device_id = 0 - - [[graphs.nodes]] - name = "redis_proxy" - ty = "RedisProxy" - ip = "127.0.0.1" - port = "6379" - mode = "save" - prefix = "feature." - -[[graphs]] -name = "cat_finder_image" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "ImageServer" - port = 8081 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/cat_finder/images/cat_finder_image_result.jpg b/flow-python/examples/cat_finder/images/cat_finder_image_result.jpg deleted file mode 100644 index e75cd8fe96901aafeb176e324dc7ce15333e4ec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38640 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

6v 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

  • 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 diff --git a/flow-python/examples/cat_finder/images/image.png b/flow-python/examples/cat_finder/images/image.png deleted file mode 100644 index a7746db332425c471b89375722b5ceda7c30a658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17719 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 V_w3gi_>&@(h3O7<#a5@#{{rmBqs#yR diff --git a/flow-python/examples/cat_finder/redis_proxy.py b/flow-python/examples/cat_finder/redis_proxy.py deleted file mode 100644 index b30cac6..0000000 --- a/flow-python/examples/cat_finder/redis_proxy.py +++ /dev/null @@ -1,119 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import base64 -import binascii -import json -import redis -import numpy as np -from loguru import logger -from megflow import register - - -@register(inputs=['inp'], outputs=['out']) -class RedisProxy: - def __init__(self, name, args): - logger.info("init redis pool...") - self.name = name - self._mode = args['mode'] - self._prefix = args['prefix'] - self._db = dict() - - ip = args['ip'] - port = args['port'] - self._pool = redis.ConnectionPool(host=ip, - port=port, - decode_responses=False) - - # save feature with highest detection score - def save_feature(self, r, name, items): - if len(items) == 0: - return None - - score = 0.0 - best_item = None - for item in items: - if item["score"] > score: - best_item = item - score = item["score"] - - assert best_item['feature'] is not None - value = base64.b64encode(best_item['feature'].tobytes()) - - try: - r.set(f'{self._prefix}{name}', value) - except redis.exceptions.ConnectionError as e: - logger.error(str(e)) - return value - - def search_key(self, r, feature): - redis_keys = r.keys(self._prefix + '*') - for key in redis_keys: - if key not in self._db: - try: - value_base64 = r.get(key) - assert value_base64 is not None - self._db[key] = np.frombuffer( - base64.b64decode(value_base64), dtype=np.float32) - except redis.exceptions.ConnectionError as e: - logger.error(str(e)) - except binascii.Error as e: - logger.error(f'decode feature failed, key {key}, reason {str(e)}') - - assert feature is not None - if len(self._db) == 0: - logger.error("feature db empty") - return {} - - min_dist = float("inf") - min_key = '' - for k, v in self._db.items(): - dist = np.linalg.norm(v - feature) - logger.info(f'key: {k} dist: {dist}') - if dist < min_dist: - min_key = k - min_dist = dist - min_key = min_key.decode('utf-8') - - name = min_key.replace(self._prefix, '', 1) - # send notification - r.lpush('notification.cat_finder', f'{name} leaving the room') - return {"name": name, "distance": str(min_dist)} - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - image = envelope.msg - items = image['items'] - assert isinstance(items, list) - - r = redis.Redis(connection_pool=self._pool) - - if self._mode == 'save': - self.save_feature(r, image["extra_data"], items) - - results = [] - for item in items: - result = dict() - result['bbox'] = item['bbox'].tolist() - result['score'] = str(item['score']) - results.append(result) - # self.out.send(envelope.repack(json.dumps(results))) - self.out.send(envelope) - - elif self._mode == 'search': - results = self.search_key(r, image['feature']) - self.out.send(envelope.repack(json.dumps(results))) - - else: - logger.error(f'unknown mode: {self._mode}') - self.out.send(envelope) diff --git a/flow-python/examples/cat_finder/reid_image.py b/flow-python/examples/cat_finder/reid_image.py deleted file mode 100644 index 4205599..0000000 --- a/flow-python/examples/cat_finder/reid_image.py +++ /dev/null @@ -1,52 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import numpy as np -from loguru import logger -from megflow import register - -from warehouse.reid_alignedreid import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class ReIDImage: - def __init__(self, name, args): - logger.info("loading Image Reid...") - self.name = name - - # load ReID model and warmup - self._model = PredictorLite(path=args['path'], - device=args['device'], - device_id=args['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._model.inference(warmup_data) - logger.info("Image Reid loaded.") - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - image = envelope.msg - - data = image['data'] - items = image['items'] - assert isinstance(items, list) - - for item in items: - bbox = item['bbox'] - crop = data[round(bbox[1]):round(bbox[3]), - round(bbox[0]):round(bbox[2])] - - # cv2.imwrite(f'reid_image_{envelope.partial_id}.jpg', crop) - feature = self._model.inference(crop) - item['feature'] = feature - logger.info(f'feature {feature}') - self.out.send(envelope) diff --git a/flow-python/examples/cat_finder/reid_video.py b/flow-python/examples/cat_finder/reid_video.py deleted file mode 100644 index ae2e523..0000000 --- a/flow-python/examples/cat_finder/reid_video.py +++ /dev/null @@ -1,47 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import numpy as np -from loguru import logger -from megflow import register - -from warehouse.reid_alignedreid import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class ReIDVideo: - def __init__(self, name, args): - logger.info("loading Video Reid...") - self.name = name - - # load ReID model and warmup - self._model = PredictorLite(path=args['path'], - device=args['device'], - device_id=args['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._model.inference(warmup_data) - logger.info(" Video Reid loaded.") - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - msg = envelope.msg - - # for crop in image['shaper']: - # cv2.imwrite(f'reid_video_{envelope.partial_id}.jpg', crop) - # logger.info(f'envelope id {envelope.partial_id}') - - msg['features'] = [] - if 'crop' in msg: - msg['feature'] = self._model.inference(msg['crop']) - # logger.info(image['features']) - self.out.send(envelope) diff --git a/flow-python/examples/cat_finder/shaper.py b/flow-python/examples/cat_finder/shaper.py deleted file mode 100644 index 58eb592..0000000 --- a/flow-python/examples/cat_finder/shaper.py +++ /dev/null @@ -1,89 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from loguru import logger -from megflow import register -from warehouse.quality_naive import Quality - - -@register(inputs=['inp'], outputs=['out']) -class Shaper: - def __init__(self, name, args): - self.name = name - self._mode = args['mode'] - self._map = dict() - - def expand(self, box, max_w, max_h, ratio): - l = box[0] - r = box[2] - t = box[1] - b = box[3] - center_x = (l + r) / 2 - center_y = (t + b) / 2 - w_side = (r - l) * ratio / 2 - h_side = (b - t) * ratio / 2 - - l = center_x - w_side - r = center_x + w_side - t = center_y - h_side - b = center_y + h_side - l = max(0, l) - t = max(0, t) - r = min(max_w, r) - b = min(max_h, b) - return int(l), int(t), int(r), int(b) - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - logger.info('stream shaper finish') - # last frame, throw out all cropped image - for id in self._map: - self.out.send(self._map[id]) - self._map.clear() - return - - msg = envelope.msg - - # update the BEST - if 'tracks' in msg: - for track in msg['tracks']: - tid = track['tid'] - box = track['bbox'] - if tid not in self._map: - self._map[tid] = envelope.repack(msg) - - data = msg['data'] - l, t, r, b = self.expand(box, data.shape[1], data.shape[0], 1.1) - crop = data[t:b, l:r] - assert crop is not None - quality = Quality.area(crop) - - if self._mode == 'BEST': - tid_msg = self._map[tid].msg - # save best image - if 'quality' not in tid_msg: - tid_msg['quality'] = -1 - - old_quality = tid_msg['quality'] - if quality > old_quality: - tid_msg['quality'] = quality - tid_msg['crop'] = crop - - if 'failed_ids' in msg: - ids = msg['failed_ids'] - if len(ids) > 0: - logger.debug(f'shaper recv failed_ids {ids}') - - for id in ids: - if id in self._map: - self.out.send(self._map[id]) - self._map.pop(id) diff --git a/flow-python/examples/cat_finder/track.py b/flow-python/examples/cat_finder/track.py deleted file mode 100644 index f4a90ba..0000000 --- a/flow-python/examples/cat_finder/track.py +++ /dev/null @@ -1,38 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from loguru import logger -from megflow import register - -from warehouse.track_iou import Tracker - - -@register(inputs=['inp'], outputs=['out']) -class Track: - def __init__(self, name, _): - self.name = name - self._tracker = Tracker() - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - logger.info('stream tracker finish') - return - - msg = envelope.msg - if msg['process']: - items = msg['items'] - - tracks, failed_ids = self._tracker.track(items) - msg['tracks'] = tracks - msg['failed_ids'] = failed_ids - # logger.debug(f'track output: {tracks}, failed_ids: {failed_ids}') - self.out.send(envelope) diff --git a/flow-python/examples/cat_finder/video_cpu.toml b/flow-python/examples/cat_finder/video_cpu.toml deleted file mode 100644 index 0d8576c..0000000 --- a/flow-python/examples/cat_finder/video_cpu.toml +++ /dev/null @@ -1,66 +0,0 @@ -main = "cat_finder_video" - -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/cat_finder_models/yolox_s.mge" -interval = 5 -visualize = 0 -device = "cpu" -device_id = 0 - -[[nodes]] -name = "reid_video" -ty = "ReIDVideo" -path = "models/cat_finder_models/resnet50.mge" -device = "cpu" -device_id = 1 - -[[nodes]] -name = "redis_proxy" -ty = "RedisProxy" -ip = "127.0.0.1" -port = "6379" -mode = "search" -prefix = "feature." - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "track:inp"] }, - { cap = 16, ports = ["track:out", "shaper:inp"] }, - { cap = 16, ports = ["shaper:out", "reid_video:inp"] }, - { cap = 16, ports = ["reid_video:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "track" - ty = "Track" - - [[graphs.nodes]] - name = "shaper" - ty = "Shaper" - mode = "BEST" - - -[[graphs]] -name = "cat_finder_video" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8082 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/cat_finder/video_gpu.toml b/flow-python/examples/cat_finder/video_gpu.toml deleted file mode 100644 index 59622ff..0000000 --- a/flow-python/examples/cat_finder/video_gpu.toml +++ /dev/null @@ -1,66 +0,0 @@ -main = "cat_finder_video" - -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/cat_finder_models/yolox_s.mge" -interval = 5 -visualize = 0 -device = "gpu" -device_id = 0 - -[[nodes]] -name = "reid_video" -ty = "ReIDVideo" -path = "models/cat_finder_models/resnet50.mge" -device = "gpu" -device_id = 0 - -[[nodes]] -name = "redis_proxy" -ty = "RedisProxy" -ip = "127.0.0.1" -port = "6379" -mode = "search" -prefix = "feature." - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "track:inp"] }, - { cap = 16, ports = ["track:out", "shaper:inp"] }, - { cap = 16, ports = ["shaper:out", "reid_video:inp"] }, - { cap = 16, ports = ["reid_video:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "track" - ty = "Track" - - [[graphs.nodes]] - name = "shaper" - ty = "Shaper" - mode = "BEST" - - -[[graphs]] -name = "cat_finder_video" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8082 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/cat_finder/video_visualize.toml b/flow-python/examples/cat_finder/video_visualize.toml deleted file mode 100644 index d4e64ee..0000000 --- a/flow-python/examples/cat_finder/video_visualize.toml +++ /dev/null @@ -1,73 +0,0 @@ -main = "cat_finder_video" - -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/cat_finder_models/yolox_s.mge" -interval = 5 -visualize = 0 -device = "gpu" -device_id = 0 - -[[nodes]] -name = "reid_video" -ty = "ReIDVideo" -path = "models/cat_finder_models/resnet50.mge" -device = "gpu" -device_id = 0 - -[[nodes]] -name = "redis_proxy" -ty = "RedisProxy" -ip = "127.0.0.1" -port = "6379" -mode = "search" -prefix = "feature." - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out_source", cap = 16, ports = ["redis_proxy:out"] }, { name = "out_hang", cap = 16, ports = ["visualize:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "track:inp"] }, - { cap = 16, ports = ["track:out", "shaper:inp"] }, - { cap = 16, ports = ["shaper:out", "reid_video:inp"] }, - { cap = 16, ports = ["shaper:visualize", "visualize:inp"]}, - { cap = 16, ports = ["reid_video:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "track" - ty = "Track" - - [[graphs.nodes]] - name = "shaper" - ty = "ShaperVisualize" - mode = "BEST" - - [[graphs.nodes]] - name = "visualize" - ty = "Visualize" - livego_manger_url="http://localhost:8090/control/get?room=megflow-test" - livego_upload_url_template="rtmp://localhost:1935/live/{}" - - -[[graphs]] -name = "cat_finder_video" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out_source"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8082 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/cat_finder/visualize/__init__.py b/flow-python/examples/cat_finder/visualize/__init__.py deleted file mode 100644 index 7821200..0000000 --- a/flow-python/examples/cat_finder/visualize/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .visualize import * -from .shaper_visualize import * diff --git a/flow-python/examples/cat_finder/visualize/shaper_visualize.py b/flow-python/examples/cat_finder/visualize/shaper_visualize.py deleted file mode 100644 index f99df44..0000000 --- a/flow-python/examples/cat_finder/visualize/shaper_visualize.py +++ /dev/null @@ -1,92 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from loguru import logger -from megflow import register -from warehouse.quality_naive import Quality - - -@register(inputs=['inp'], outputs=['out', 'visualize']) -class ShaperVisualize: - def __init__(self, name, args): - self.name = name - self._mode = args['mode'] - self._map = dict() - - def expand(self, box, max_w, max_h, ratio): - l = box[0] - r = box[2] - t = box[1] - b = box[3] - center_x = (l + r) / 2 - center_y = (t + b) / 2 - w_side = (r - l) * ratio / 2 - h_side = (b - t) * ratio / 2 - - l = center_x - w_side - r = center_x + w_side - t = center_y - h_side - b = center_y + h_side - l = max(0, l) - t = max(0, t) - r = min(max_w, r) - b = min(max_h, b) - return int(l), int(t), int(r), int(b) - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - logger.info('stream shaper finish') - # last frame, throw out all cropped image - for id in self._map: - self.out.send(self._map[id]) - self._map.clear() - return - - msg = envelope.msg - - # update the BEST - if 'tracks' in msg: - for track in msg['tracks']: - tid = track['tid'] - box = track['bbox'] - if tid not in self._map: - self._map[tid] = envelope.repack(msg) - - data = msg['data'] - l, t, r, b = self.expand(box, data.shape[1], data.shape[0], - 1.1) - crop = data[t:b, l:r] - assert crop is not None - quality = Quality.area(crop) - - if self._mode == 'BEST': - tid_msg = self._map[tid].msg - # save best image - if 'quality' not in tid_msg: - tid_msg['quality'] = -1 - - old_quality = tid_msg['quality'] - if quality > old_quality: - tid_msg['quality'] = quality - tid_msg['crop'] = crop - - ids = msg['failed_ids'] - if len(ids) > 0: - logger.debug(f'shaper recv failed_ids {ids}') - - for id in ids: - if id in self._map: - msg['crop'] = self._map[id].msg['crop'] - self.out.send(self._map[id]) - self._map.pop(id) - - self.visualize.send(envelope) diff --git a/flow-python/examples/cat_finder/visualize/visualize.py b/flow-python/examples/cat_finder/visualize/visualize.py deleted file mode 100644 index f9f8f11..0000000 --- a/flow-python/examples/cat_finder/visualize/visualize.py +++ /dev/null @@ -1,169 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import subprocess -import time - -import numpy as np -from loguru import logger -from megflow import register -import requests -import cv2 - - -class BrightnessMemo: - def __init__(self): - self.memo = dict() - - - def query_by_tid(self, tid): - now = time.time() - if tid in self.memo: - diff = (now - self.memo[tid]) - return int(255 * min(1.0, diff)) - else: - self.memo[tid] = now - return int(0) - - -class Interpolator: - def __init__(self): - self.data_queue = [] - self.brightness = BrightnessMemo() - - def push(self, id, msg): - item = dict() - item['id'] = id - item['data'] = msg['data'] - if 'tracks' in msg: - item['tracks'] = msg['tracks'] - if 'crop' in msg: - item['crop'] = msg['crop'] - self.data_queue.append(item) - - def interpolate(self, begin, end, step): - ret = [[] for _ in range(step)] - - end_map = dict() - # convert end tracks to hashmap - for item in end["tracks"]: - end_map[item['tid']] = item['bbox'] - - for item in begin['tracks']: - tid = item['tid'] - if tid in end_map: - a = item['bbox'] - b = end_map[tid] - for j in range(step): - new_l = a[0] + (b[0] - a[0]) / step * j - new_t = a[1] + (b[1] - a[1]) / step * j - new_r = a[2] + (b[2] - a[2]) / step * j - new_b = a[3] + (b[3] - a[3]) / step * j - ret[j].append( - np.array((new_l, new_t, new_r, new_b, tid), - dtype=np.float32)) - else: - bbox = item['bbox'] - ret[0].append( - np.array((bbox[0], bbox[1], bbox[2], bbox[3], tid), - dtype=np.float32)) - return ret - - def pop(self): - ret = [] - end_idx = -1 - for i, item in enumerate(self.data_queue): - if i == 0: - continue - if 'tracks' in item: - end_idx = i - - if end_idx != -1: - bboxes_list = self.interpolate(self.data_queue[0], - self.data_queue[end_idx], end_idx) - assert len(bboxes_list) == end_idx - - # prepare crop - crop = None - if 'crop' in self.data_queue[end_idx]: - crop = self.data_queue[end_idx]['crop'] - crop = cv2.resize(crop, (128, 128)) - - # real draw - for i in range(end_idx): - data = self.data_queue[i]['data'] - bboxes = bboxes_list[i] - for _, bbox in enumerate(bboxes): - print(bbox) - brightness = self.brightness.query_by_tid(bbox[4]) - # cv2.putText(data, str(bbox[4]), (int(bbox[0]), int(bbox[1])), cv2.FONT_HERSHEY_SIMPLEX, 2.0, (255,255,255)) - cv2.rectangle(data, (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (brightness, brightness, brightness), 3) - - if crop is not None: - data[0:128, 0:128, :] = crop - ret.append(data) - - for i in range(end_idx): - self.data_queue.pop(0) - return ret - - -@register(inputs=['inp'], outputs=['out']) -class Visualize: - def __init__(self, _, args): - logger.info("connect livego manager...") - - manage_url = args["livego_manger_url"] - api_result = requests.get(manage_url) - if not api_result.ok: - raise Exception(f'request channel failed, from {manage_url}') - channel = api_result.json()['data'] - self.upload_url = args['livego_upload_url_template'].format(channel) - logger.info(f"manage url {manage_url} , upload url {self.upload_url}") - - self.interpolator = Interpolator() - self.conn = None - - def __del__(self): - if self.conn is not None: - self.conn.terminate() - self.conn = None - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - data = envelope.msg['data'] - - # build connection - if self.conn is None: - (frame_height, frame_width, _) = data.shape - command = [ - 'ffmpeg', '-y', '-f', 'rawvideo', '-vcodec', 'rawvideo', - '-pix_fmt', 'bgr24', '-s', - "{}x{}".format(frame_width, frame_height), '-r', - str(25), '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', - '-preset', 'ultrafast', '-f', 'flv', self.upload_url - ] - self.conn = subprocess.Popen(command, stdin=subprocess.PIPE) - - self.interpolator.push(envelope.partial_id, envelope.msg) - outputs = self.interpolator.pop() - for drawed_image in outputs: - # try write visualized image - try: - self.conn.stdin.write(drawed_image.tobytes()) - except IOError as e: - logger.error(f"write failed: {e}") - self.conn.terminate() - self.conn = None diff --git a/flow-python/examples/electric_bicycle/README.md b/flow-python/examples/electric_bicycle/README.md deleted file mode 100644 index ff4249e..0000000 --- a/flow-python/examples/electric_bicycle/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# 电梯电瓶车报警 - -## 功能概述 -镜头前出现电瓶车立即报警,不会对同一辆车重复报警。本服务和[猫猫围栏](../cat_finder/README.md)在推送时机上有区别,猫是离开时才通知,电瓶车是进入就提示。一些安装命令和常见问题处理方式在[猫猫围栏](../cat_finder/README.md)已经说明,强烈建议先看上一个教程。 - -## 软硬件环境 - -*nix 系统(Linux/Mac),x86 芯片。支持 onnx runtime 即可。 - -## [模型下载](../../../docs/download-models.zh.md) - -## 启动服务 - -安装运行依赖 -```bash -$ apt install redis-server -$ redis-server & -... -$ conda activate py38 -$ pip3 install onnxruntime --user -``` - -准备一个 rtsp 视频流地址或者视频文件绝对路径做测试输入。相关教程已整合在 [如何生成自己的 rtsp 流地址](../../../docs/how-to-build-and-run/generate-rtsp.zh.md) 。这里仅仅需要 -```bash -$ wget https://github.com/aler9/rtsp-simple-server/releases/download/v0.17.2/rtsp-simple-server_v0.17.2_linux_amd64.tar.gz -$ -$ tar xvf rtsp-simple-server_v0.17.2_linux_amd64.tar.gz && ./rtsp-simple-server -$ ffmpeg -re -stream_loop -1 -i ${models}/cat_finder_testdata/test1.ts -c copy -f rtsp rtsp://127.0.0.1:8554/test1.ts -``` - -启动服务 -```bash -$ cd flow-python/examples -$ run_with_plugins -c electric_bicycle/electric_bicycle.toml -p electric_bicycle -``` -服务配置文件在`electric_bicycle/electric_bicycle.toml`,解释参考 [how-to-add-graph](../../../docs/how-to-add-my-service/01-single-classification-model.zh.md) 。这里只需要打开 8083 端口服务,操作和[猫猫围栏](../cat_finder/README.md) 近似。 - -```bash -$ google-chrome-stable http://127.0.0.1:8083/docs -``` diff --git a/flow-python/examples/electric_bicycle/__init__.py b/flow-python/examples/electric_bicycle/__init__.py deleted file mode 100644 index f57558f..0000000 --- a/flow-python/examples/electric_bicycle/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 diff --git a/flow-python/examples/electric_bicycle/det.py b/flow-python/examples/electric_bicycle/det.py deleted file mode 100644 index 942123f..0000000 --- a/flow-python/examples/electric_bicycle/det.py +++ /dev/null @@ -1,74 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import numpy as np -from loguru import logger -from megflow import register -from warehouse.detection_memd import load_onnx_model, run - - -@register(inputs=['inp'], outputs=['out']) -class Detect: - def __init__(self, name, args): - logger.info("loading MEMD detection...") - self._nms = args['nms_thres'] - self._score = args['score_thres'] - self._interval = args['interval'] - self._visualize = args['visualize'] - self.name = name - - # load model and warmup - self._model = load_onnx_model(args['path']) - warmup_data = np.zeros((256, 256, 3), dtype=np.uint8) - run(self._model, warmup_data, ["elec_cycle"], self._score, - self._nms) - - logger.info(" MEMD loaded.") - - @staticmethod - def restrict(val, min, max): - assert min < max - if val < min: - val = min - if val > max: - val = max - return round(val) - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - image = envelope.msg - - process = envelope.partial_id % self._interval == 0 - image['items'] = [] - - if process: - data = image['data'] - outputs = run(self._model, data, ["elec_cycle"], - self._score, self._nms) - - items = [] - (max_h, max_w, _) = data.shape - for output in outputs: - item = dict() - bbox = output[0:4] - bbox[0] = self.restrict(bbox[0], 0, max_w) - bbox[1] = self.restrict(bbox[1], 0, max_h) - bbox[2] = self.restrict(bbox[2], bbox[0], max_w) - bbox[3] = self.restrict(bbox[3], bbox[1], max_h) - item["bbox"] = bbox - item["cls"] = 0 - item["score"] = output[4] - items.append(item) - image['items'] = items - - self.out.send(envelope) diff --git a/flow-python/examples/electric_bicycle/electric_bicycle.toml b/flow-python/examples/electric_bicycle/electric_bicycle.toml deleted file mode 100644 index 8a2bbe3..0000000 --- a/flow-python/examples/electric_bicycle/electric_bicycle.toml +++ /dev/null @@ -1,53 +0,0 @@ -main = "electric_bicycle" - -[[nodes]] -name = "det" -ty = "Detect" -path = "models/memd_models/model.onnx" -interval = 5 -visualize = 0 -score_thres = 0.5 -nms_thres = 0.5 - -[[nodes]] -name = "redis_proxy" -ty = "RedisProxy" -ip = "127.0.0.1" -port = "6379" -key = "notification.electric_bicycle" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["redis_proxy:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "track:inp"] }, - { cap = 16, ports = ["track:out", "shaper:inp"] }, - { cap = 16, ports = ["shaper:out", "redis_proxy:inp"] }, -] - - [[graphs.nodes]] - name = "track" - ty = "Track" - - [[graphs.nodes]] - name = "shaper" - ty = "Shaper" - mode = "FAST" - - -[[graphs]] -name = "electric_bicycle" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8083 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/electric_bicycle/redis_proxy.py b/flow-python/examples/electric_bicycle/redis_proxy.py deleted file mode 100644 index 6baa1a2..0000000 --- a/flow-python/examples/electric_bicycle/redis_proxy.py +++ /dev/null @@ -1,50 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import redis -from loguru import logger -from megflow import register - - -@register(inputs=['inp'], outputs=['out']) -class RedisProxy: - def __init__(self, name, args): - logger.info("init redis pool...") - self.name = name - self._key = args['key'] - self._db = dict() - - ip = args['ip'] - port = args['port'] - - self._pool = redis.ConnectionPool(host=ip, - port=port, - decode_responses=False) - logger.info('redis pool initialized.') - - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - msg = envelope.msg - crops = msg['shaper'] - assert isinstance(crops, list) - - if len(crops) > 0: - try: - r = redis.Redis(connection_pool=self._pool) - alert = f'{len(crops)} electric bicycle occur !' - logger.info('alert {}'.format(alert)) - r.lpush(self._key, alert) - self.out.send(envelope.repack(alert)) - except redis.exceptions.ConnectionError as e: - logger.error(str(e)) diff --git a/flow-python/examples/electric_bicycle/shaper.py b/flow-python/examples/electric_bicycle/shaper.py deleted file mode 100644 index defc6aa..0000000 --- a/flow-python/examples/electric_bicycle/shaper.py +++ /dev/null @@ -1,67 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from megflow import register - - -@register(inputs=['inp'], outputs=['out']) -class Shaper: - def __init__(self, name, args): - self.name = name - self._mode = args['mode'] - self._map = dict() - - self.idx = 0 - - def expand(self, box, max_w, max_h, ratio): - l = box[0] - r = box[2] - t = box[1] - b = box[3] - center_x = (l + r) / 2 - center_y = (t + b) / 2 - w_side = (r - l) * ratio / 2 - h_side = (b - t) * ratio / 2 - - l = center_x - w_side - r = center_x + w_side - t = center_y - h_side - b = center_y + h_side - l = max(0, l) - t = max(0, t) - r = min(max_w, r) - b = min(max_h, b) - return int(l), int(t), int(r), int(b) - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - self._map.clear() - return - - msg = envelope.msg - - # push the first - msg['shaper'] = [] - for track in msg['tracks']: - tid = track['tid'] - box = track['bbox'] - if tid not in self._map: - self._map[tid] = dict() - - data = msg['data'] - l, t, r, b = self.expand(box, data.shape[1], data.shape[0], - 1.1) - crop = data[t:b, l:r] - msg['shaper'].append(crop) - # cv2.imwrite(f'shaper_{envelope.partial_id}.jpg', crop) - - self.out.send(envelope) diff --git a/flow-python/examples/electric_bicycle/track.py b/flow-python/examples/electric_bicycle/track.py deleted file mode 100644 index 8ef8a90..0000000 --- a/flow-python/examples/electric_bicycle/track.py +++ /dev/null @@ -1,35 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from megflow import register - -from warehouse.track_iou import Tracker - - -@register(inputs=['inp'], outputs=['out']) -class Track: - def __init__(self, name, _): - self.name = name - self._tracker = Tracker() - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - - items = envelope.msg['items'] - # logger.debug(f'track input: {items}') - - tracks, failed_ids = self._tracker.track(items) - envelope.msg['tracks'] = tracks - envelope.msg['failed_ids'] = failed_ids - # logger.debug(f'track output: {tracks}, failed_ids: {failed_ids}') - self.out.send(envelope) diff --git a/flow-python/examples/logical_test/__init__.py b/flow-python/examples/logical_test/__init__.py deleted file mode 100644 index f57558f..0000000 --- a/flow-python/examples/logical_test/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 diff --git a/flow-python/examples/logical_test/buffer.py b/flow-python/examples/logical_test/buffer.py deleted file mode 100644 index 2f4ca8f..0000000 --- a/flow-python/examples/logical_test/buffer.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 - -from megflow import res_register - - -@res_register() -class Buffer: - def __init__(self, name, args): - self.name = name - self.n = args['n'] - self.i = 0 - - def get(self): - self.i += 1 - return self.i % self.n diff --git a/flow-python/examples/logical_test/logical_test.png b/flow-python/examples/logical_test/logical_test.png deleted file mode 100644 index 312ad6fedd545cf15f7487c34bbf022b216cbb49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16244 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 diff --git a/flow-python/examples/logical_test/logical_test.toml b/flow-python/examples/logical_test/logical_test.toml deleted file mode 100644 index 1eb1771..0000000 --- a/flow-python/examples/logical_test/logical_test.toml +++ /dev/null @@ -1,80 +0,0 @@ -main = "logical_test" - -[[resources]] -name = "global_buf" -ty = "Buffer" -n = 10 - -[[nodes]] -name = "shared" -ty = "RepeatProcess" - -[[graphs]] -name = "TransGraph0" -inputs = [{ name = "whatever", cap = 16, ports = ["shared:inp"] }] -connections = [ - { cap = 16, ports = ["shared:out", "trans:inp"] }, - { cap = 16, ports = ["trans:out", "destination:inp"] } -] - - [[graphs.nodes]] - name = "trans" - ty = "Transform" - - [[graphs.nodes]] - name = "destination" - ty = "Printer" - res = ["global_buf", "parent_buf", "buf"] - - [[graphs.resources]] - name = "buf" - ty = "Buffer" - n = 5 - -[[graphs]] -name = "TransGraph1" -inputs = [{ name = "whatever", cap = 16, ports = ["shared:inp"] }] -connections = [ - { cap = 16, ports = ["shared:out", "trans:inp"] }, - { cap = 16, ports = ["trans:out", "destination:inp"] } -] - - [[graphs.nodes]] - name = "trans" - ty = "Transform" - - [[graphs.nodes]] - name = "destination" - ty = "Printer" - res = ["global_buf", "parent_buf", "buf"] - - [[graphs.resources]] - name = "buf" - ty = "Buffer" - n = 10 - -[[graphs]] -name = "logical_test" -connections = [ - { cap = 1, ports = ["source:out", "demux:inp"] }, - { cap = 1, ports = ["demux:out", "destination:whatever"] } -] - - [[graphs.nodes]] - name = "source" - ty = "Source" - n = 300 - - [[graphs.nodes]] - name = "demux" - ty = "DynDemux" - - [[graphs.nodes]] - name = "destination" - ty = "TransGraph0|TransGraph1" - res = ["parent_buf"] - - [[graphs.resources]] - name = "parent_buf" - ty = "Buffer" - n = 2 diff --git a/flow-python/examples/logical_test/printer.py b/flow-python/examples/logical_test/printer.py deleted file mode 100644 index aa0c3fb..0000000 --- a/flow-python/examples/logical_test/printer.py +++ /dev/null @@ -1,36 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -from megflow import register - -instance_id = 0 - - -@register('Printer', inputs=['inp']) -class Node: - def __init__(self, name, args): - global instance_id - self.id = instance_id - instance_id += 1 - self.count = 0 - - def exec(self): - envelope = self.inp.recv() - if envelope is not None: - self.count += 1 - gbuf = self.global_buf.get() - pbuf = self.parent_buf.get() - buf = self.buf.get() - - # print( - # 'Printer[{}] get msg: {}, buf(global, parent, local): ({}, {}, {})' - # .format(self.id, envelope.msg['message'], gbuf, pbuf, buf)) - else: - assert self.count == 10 diff --git a/flow-python/examples/logical_test/process.py b/flow-python/examples/logical_test/process.py deleted file mode 100644 index 7d49ed7..0000000 --- a/flow-python/examples/logical_test/process.py +++ /dev/null @@ -1,59 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -from megflow import register -import multiprocessing as mp -from multiprocessing import Process, Pipe - - -def repeat(n, s, r): - while True: - envelope = r.recv() - if envelope is None: - break - for i in range(n): - msg = {} - msg['message'] = "a message[{}] repeat {} by process node".format( - envelope.msg['message'], i) - s.send(envelope.repack(msg)) - print('==== logical_test pass ====') - - -@register(inputs=['inp'], outputs=['out'], exclusive=True) -class RepeatProcess: - def __init__(self, name, args): - self.name = name - s1, r1 = Pipe() - s2, r2 = Pipe() - self.send = s1 - self.recv = r2 - - mp.set_start_method('fork') - self.p = Process(target=repeat, args=(10, s2, r1)) - self.p.start() - - def __del__(self): - self.send.send(None) - self.p.join() - - def exec(self): - envelope = self.inp.recv() - - if envelope is None: - return - - try: - self.send.send(envelope) - except: - pass - - for i in range(10): - envelope = self.recv.recv() - self.out.send(envelope) diff --git a/flow-python/examples/logical_test/source.py b/flow-python/examples/logical_test/source.py deleted file mode 100644 index 2b48628..0000000 --- a/flow-python/examples/logical_test/source.py +++ /dev/null @@ -1,33 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -from megflow import register, Envelope, sleep - - -@register(outputs=['out']) -class Source: - def __init__(self, name, args): - self.n = args['n'] - - def exec(self): - for i in range(self.n): - msg = {} - msg['message'] = 'send to {}'.format(i) - envelope = Envelope.pack(msg) - envelope.to_addr = i - envelope.tag = "TransGraph{}".format(i % 2) - self.out.send(envelope) - - sleep(5) - - for i in range(self.n): - envelope = Envelope.pack(None) - envelope.to_addr = i - self.out.send(envelope) diff --git a/flow-python/examples/misc/dump_resnet.py b/flow-python/examples/misc/dump_resnet.py deleted file mode 100644 index fc85150..0000000 --- a/flow-python/examples/misc/dump_resnet.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# pylint: skip-file -import argparse -import sys - -# pylint: disable=import-error -import resnet.model as resnet_model -# pylint: disable=import-error -import shufflenet.model as snet_model - -import numpy as np - -import megengine as mge -import megengine.functional as F -from megengine import jit - - -def dump_static_graph(model, graph_name, shape): - model.eval() - - data = mge.Tensor(np.ones(shape, dtype=np.uint8)) - - @jit.trace(capture_as_const=True) - def pred_func(data): - out = data.astype(np.float32) - - output_h, output_w = 224, 224 - # resize - print(shape) - M = mge.tensor(np.array([[1,0,0], [0,1,0], [0,0,1]], dtype=np.float32)) - M_shape = F.concat([data.shape[0],M.shape]) - M = F.broadcast_to(M, M_shape) - out = F.vision.warp_perspective(out, M, (output_h, output_w), format='NHWC') - # mean - _mean = mge.Tensor(np.array([103.530, 116.280, 123.675], dtype=np.float32)) - out = F.sub(out, _mean) - # div - _div = mge.Tensor(np.array([57.375, 57.120, 58.395], dtype=np.float32)) - out = F.div(out, _div) - # dimshuffile - out = F.transpose(out, (0,3,1,2)) - - outputs = model(out) - return outputs - - pred_func(data) - pred_func.dump( - graph_name, - arg_names=["data"], - optimize_for_inference=True, - enable_fuse_conv_bias_nonlinearity=True, - ) - - -def main(): - parser = argparse.ArgumentParser(description="MegEngine Classification Dump .mge") - parser.add_argument( - "-a", - "--arch", - default="resnet18", - help="model architecture (default: resnet18)", - ) - parser.add_argument( - "-s", - "--shape", - type=int, - nargs='+', - default="1 3 224 224", - help="input shape (default: 1 3 224 224)" - ) - parser.add_argument( - "-o", - "--output", - type=str, - default="model.mge", - help="output filename" - ) - - args = parser.parse_args() - if 'resnet' in args.arch: - model = getattr(resnet_model, args.arch)(pretrained=True) - elif 'shufflenet' in args.arch: - model = getattr(snet_model, args.arch)(pretrained=True) - else: - print('unavailable arch {}'.format(args.arch)) - sys.exit() - print(model) - dump_static_graph(model, args.output, tuple(args.shape)) - - -if __name__ == "__main__": - main() diff --git a/flow-python/examples/misc/image_client.py b/flow-python/examples/misc/image_client.py deleted file mode 100644 index 4b3394e..0000000 --- a/flow-python/examples/misc/image_client.py +++ /dev/null @@ -1,30 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -import cv2 -import requests - - -def test(): - ip = 'localhost' - port = '8084' - user_define_string = 'content' - url = f'http://{ip}:{port}/analyze/{user_define_string}' - img = cv2.imread("./test.jpg") - _, data = cv2.imencode(".jpg", img) - data = data.tobytes() - - headers = {'Content-Length': f'{len(data)}', 'Content-Type': 'image/*'} - res = requests.post(url, data=data, headers=headers) - print(res.content) - - -if __name__ == "__main__": - test() diff --git a/flow-python/examples/misc/video_client.py b/flow-python/examples/misc/video_client.py deleted file mode 100644 index 22ba281..0000000 --- a/flow-python/examples/misc/video_client.py +++ /dev/null @@ -1,28 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -import urllib -import requests - - -def test(): - ip = 'localhost' - port = '8085' - video_path = 'rtsp://127.0.0.1:8554/vehicle.ts' - video_path = urllib.parse.quote(video_path, safe='') - url = 'http://{}:{}/start/{}'.format(ip, port, video_path) - - res = requests.post(url) - ret = res.content - print(ret) - - -if __name__ == "__main__": - test() diff --git a/flow-python/examples/misc/visualize_client/demo.css b/flow-python/examples/misc/visualize_client/demo.css deleted file mode 100644 index 6e2ee3d..0000000 --- a/flow-python/examples/misc/visualize_client/demo.css +++ /dev/null @@ -1,108 +0,0 @@ -.mainContainer { - display: block; - width: 100%; - margin-left: auto; - margin-right: auto; -} -@media screen and (min-width: 1152px) { - .mainContainer { - display: block; - width: 1152px; - margin-left: auto; - margin-right: auto; - } -} - -.video-container { - position: relative; - margin-top: 8px; -} - -.video-container:before { - display: block; - content: ""; - width: 100%; - padding-bottom: 56.25%; -} - -.video-container > div { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.video-container video { - width: 100%; - height: 100%; -} - -.urlInput { - display: block; - width: 100%; - margin-left: auto; - margin-right: auto; - margin-top: 8px; - margin-bottom: 8px; -} - -.centeredVideo { - display: block; - width: 100%; - height: 100%; - margin-left: auto; - margin-right: auto; - margin-bottom: auto; -} - -.controls { - display: block; - width: 100%; - text-align: left; - margin-left: auto; - margin-right: auto; - margin-top: 8px; - margin-bottom: 10px; -} - -.logcatBox { - border-color: #CCCCCC; - font-size: 11px; - font-family: Menlo, Consolas, monospace; - display: block; - width: 100%; - text-align: left; - margin-left: auto; - margin-right: auto; -} - -.url-input , .options { - font-size: 13px; -} - -.url-input { - display: flex; -} - -.url-input label { - flex: initial; -} - -.url-input input { - flex: auto; - margin-left: 8px; -} - -.url-input button { - flex: initial; - margin-left: 8px; -} - -.options { - margin-top: 5px; -} - -.hidden { - display: none; -} diff --git a/flow-python/examples/misc/visualize_client/index.html b/flow-python/examples/misc/visualize_client/index.html deleted file mode 100644 index bff07f5..0000000 --- a/flow-python/examples/misc/visualize_client/index.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - flv.js demo - - - - - -
    -
    -
    -
    - - - -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    -
    -
    - - - - - - -
    - -
    - - - - - - - - diff --git a/flow-python/examples/misc/visualize_client/push_video.py b/flow-python/examples/misc/visualize_client/push_video.py deleted file mode 100644 index 192f861..0000000 --- a/flow-python/examples/misc/visualize_client/push_video.py +++ /dev/null @@ -1,24 +0,0 @@ -import sys -import os -import requests - -def main(ip, filename): - url_template = "http://{}:8090/control/get?room=megflow-test" - url = url_template.format(ip) - print(url) - result = requests.get(url) - if not result.ok: - raise Exception('req channel failed') - channel = result.json()['data'] - upload_cmd = f'ffmpeg -re -i {filename} -c copy -f flv rtmp://{ip}:1935/live/{channel}' - # upload flv - os.system(upload_cmd) - - -if __name__ == "__main__": - videoname = 'demo.flv' - if len(sys.argv) < 2: - print(f'usage python3 {sys.argv[0]} videoname, use default demo.flv') - else: - videoname = sys.argv[1] - main('localhost', videoname) diff --git a/flow-python/examples/requires.txt b/flow-python/examples/requires.txt deleted file mode 100644 index 43accc7..0000000 --- a/flow-python/examples/requires.txt +++ /dev/null @@ -1,5 +0,0 @@ -numpy -scipy -opencv-python -loguru -redis diff --git a/flow-python/examples/simple_classification/__init__.py b/flow-python/examples/simple_classification/__init__.py deleted file mode 100644 index f57558f..0000000 --- a/flow-python/examples/simple_classification/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 diff --git a/flow-python/examples/simple_classification/classify.py b/flow-python/examples/simple_classification/classify.py deleted file mode 100644 index b33c547..0000000 --- a/flow-python/examples/simple_classification/classify.py +++ /dev/null @@ -1,41 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import json -import numpy as np -from loguru import logger -from megflow import register - -from .lite import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class Classify: - def __init__(self, name, arg): - logger.info("loading Resnet18 Classification...") - self.name = name - - # load ReID model and warmup - self._model = PredictorLite(path=arg['path'], - device=arg['device'], - device_id=arg['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._model.inference(warmup_data) - logger.info("Resnet18 loaded.") - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - - data = envelope.msg['data'] - result = self._model.inference(data) - self.out.send(envelope.repack(json.dumps(str(result)))) diff --git a/flow-python/examples/simple_classification/image_cpu.toml b/flow-python/examples/simple_classification/image_cpu.toml deleted file mode 100644 index e2977f8..0000000 --- a/flow-python/examples/simple_classification/image_cpu.toml +++ /dev/null @@ -1,32 +0,0 @@ -main = "tutorial_01_image" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["classify:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -connections = [ -] - - [[graphs.nodes]] - name = "classify" - ty = "Classify" - path = "models/simple_classification_models/resnet18.mge" - device = "cpu" - device_id = 0 - -[[graphs]] -name = "tutorial_01_image" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "ImageServer" - port = 8084 - response = "json" - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/simple_classification/image_test.toml b/flow-python/examples/simple_classification/image_test.toml deleted file mode 100644 index 68b9d5b..0000000 --- a/flow-python/examples/simple_classification/image_test.toml +++ /dev/null @@ -1,31 +0,0 @@ -main = "tutorial_01_image" - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["classify:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -connections = [ -] - - [[graphs.nodes]] - name = "classify" - ty = "Classify" - path = "models/simple_classification_models/resnet18.mge" - device = "cpu" - device_id = 0 - -[[graphs]] -name = "tutorial_01_image" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "ImageInput" - urls = ["/path/to/your/images/"] - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/simple_classification/lite.py b/flow-python/examples/simple_classification/lite.py deleted file mode 100644 index cfc408b..0000000 --- a/flow-python/examples/simple_classification/lite.py +++ /dev/null @@ -1,107 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import argparse -import time -import cv2 -import numpy as np -import megenginelite as mgelite -from loguru import logger - - -class PredictorLite: - def __init__( - self, - path, - device="gpu", - device_id=0, - ): - - if "gpu" in device.lower(): - device_type = mgelite.LiteDeviceType.LITE_CUDA - else: - device_type = mgelite.LiteDeviceType.LITE_CPU - - net_config = mgelite.LiteConfig(device_type=device_type) - ios = mgelite.LiteNetworkIO() - ios.add_input(mgelite.LiteIO("data", is_host=True)) - - net = mgelite.LiteNetwork(config=net_config, io=ios) - net.device_id = device_id - net.load(path) - - self.net = net - - def preprocess(self, - image, - input_size, - scale_im, - mean, - std, - swap=(2, 0, 1)): - if image is None: - logger.error("image is None") - return image - image = cv2.resize(image, input_size) - image = image.astype(np.float32) - image = image[:, :, ::-1] - if scale_im: - image /= 255.0 - if mean is not None: - image -= mean - if std is not None: - image /= std - image = image.transpose(swap) - image = np.ascontiguousarray(image, dtype=np.float32) - return image - - def inference(self, mat): - t0 = time.time() - - img = self.preprocess(mat, - input_size=(224, 224), - scale_im=False, - mean=[103.530, 116.280, 123.675], - std=[57.375, 57.120, 58.395]) - - # build input tensor - inp_data = self.net.get_io_tensor("data") - inp_data.set_data_by_share(img) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - output = self.net.get_io_tensor(output_keys[0]).to_numpy() - logger.debug("resnet18 infer time: {:.4f}s".format(time.time() - t0)) - - return np.argmax(output[0]) - - -def make_parser(): - parser = argparse.ArgumentParser("Classification Demo!") - parser.add_argument("--path", - default="./test.png", - help="path to images or video") - parser.add_argument("--model", - default=None, - type=str, - help=".mge for eval") - return parser - - -if __name__ == "__main__": - args = make_parser().parse_args() - predictor = PredictorLite(args.model) - out = predictor.inference(cv2.imread(args.path)) - logger.info(f'{out}') diff --git a/flow-python/examples/simple_classification/synset_words.txt b/flow-python/examples/simple_classification/synset_words.txt deleted file mode 100644 index a9e8c7f..0000000 --- a/flow-python/examples/simple_classification/synset_words.txt +++ /dev/null @@ -1,1000 +0,0 @@ -n01440764 tench, Tinca tinca -n01443537 goldfish, Carassius auratus -n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias -n01491361 tiger shark, Galeocerdo cuvieri -n01494475 hammerhead, hammerhead shark -n01496331 electric ray, crampfish, numbfish, torpedo -n01498041 stingray -n01514668 cock -n01514859 hen -n01518878 ostrich, Struthio camelus -n01530575 brambling, Fringilla montifringilla -n01531178 goldfinch, Carduelis carduelis -n01532829 house finch, linnet, Carpodacus mexicanus -n01534433 junco, snowbird -n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea -n01558993 robin, American robin, Turdus migratorius -n01560419 bulbul -n01580077 jay -n01582220 magpie -n01592084 chickadee -n01601694 water ouzel, dipper -n01608432 kite -n01614925 bald eagle, American eagle, Haliaeetus leucocephalus -n01616318 vulture -n01622779 great grey owl, great gray owl, Strix nebulosa -n01629819 European fire salamander, Salamandra salamandra -n01630670 common newt, Triturus vulgaris -n01631663 eft -n01632458 spotted salamander, Ambystoma maculatum -n01632777 axolotl, mud puppy, Ambystoma mexicanum -n01641577 bullfrog, Rana catesbeiana -n01644373 tree frog, tree-frog -n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui -n01664065 loggerhead, loggerhead turtle, Caretta caretta -n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea -n01667114 mud turtle -n01667778 terrapin -n01669191 box turtle, box tortoise -n01675722 banded gecko -n01677366 common iguana, iguana, Iguana iguana -n01682714 American chameleon, anole, Anolis carolinensis -n01685808 whiptail, whiptail lizard -n01687978 agama -n01688243 frilled lizard, Chlamydosaurus kingi -n01689811 alligator lizard -n01692333 Gila monster, Heloderma suspectum -n01693334 green lizard, Lacerta viridis -n01694178 African chameleon, Chamaeleo chamaeleon -n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis -n01697457 African crocodile, Nile crocodile, Crocodylus niloticus -n01698640 American alligator, Alligator mississipiensis -n01704323 triceratops -n01728572 thunder snake, worm snake, Carphophis amoenus -n01728920 ringneck snake, ring-necked snake, ring snake -n01729322 hognose snake, puff adder, sand viper -n01729977 green snake, grass snake -n01734418 king snake, kingsnake -n01735189 garter snake, grass snake -n01737021 water snake -n01739381 vine snake -n01740131 night snake, Hypsiglena torquata -n01742172 boa constrictor, Constrictor constrictor -n01744401 rock python, rock snake, Python sebae -n01748264 Indian cobra, Naja naja -n01749939 green mamba -n01751748 sea snake -n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus -n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus -n01756291 sidewinder, horned rattlesnake, Crotalus cerastes -n01768244 trilobite -n01770081 harvestman, daddy longlegs, Phalangium opilio -n01770393 scorpion -n01773157 black and gold garden spider, Argiope aurantia -n01773549 barn spider, Araneus cavaticus -n01773797 garden spider, Aranea diademata -n01774384 black widow, Latrodectus mactans -n01774750 tarantula -n01775062 wolf spider, hunting spider -n01776313 tick -n01784675 centipede -n01795545 black grouse -n01796340 ptarmigan -n01797886 ruffed grouse, partridge, Bonasa umbellus -n01798484 prairie chicken, prairie grouse, prairie fowl -n01806143 peacock -n01806567 quail -n01807496 partridge -n01817953 African grey, African gray, Psittacus erithacus -n01818515 macaw -n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita -n01820546 lorikeet -n01824575 coucal -n01828970 bee eater -n01829413 hornbill -n01833805 hummingbird -n01843065 jacamar -n01843383 toucan -n01847000 drake -n01855032 red-breasted merganser, Mergus serrator -n01855672 goose -n01860187 black swan, Cygnus atratus -n01871265 tusker -n01872401 echidna, spiny anteater, anteater -n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus -n01877812 wallaby, brush kangaroo -n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus -n01883070 wombat -n01910747 jellyfish -n01914609 sea anemone, anemone -n01917289 brain coral -n01924916 flatworm, platyhelminth -n01930112 nematode, nematode worm, roundworm -n01943899 conch -n01944390 snail -n01945685 slug -n01950731 sea slug, nudibranch -n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore -n01968897 chambered nautilus, pearly nautilus, nautilus -n01978287 Dungeness crab, Cancer magister -n01978455 rock crab, Cancer irroratus -n01980166 fiddler crab -n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica -n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus -n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish -n01985128 crayfish, crawfish, crawdad, crawdaddy -n01986214 hermit crab -n01990800 isopod -n02002556 white stork, Ciconia ciconia -n02002724 black stork, Ciconia nigra -n02006656 spoonbill -n02007558 flamingo -n02009229 little blue heron, Egretta caerulea -n02009912 American egret, great white heron, Egretta albus -n02011460 bittern -n02012849 crane -n02013706 limpkin, Aramus pictus -n02017213 European gallinule, Porphyrio porphyrio -n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana -n02018795 bustard -n02025239 ruddy turnstone, Arenaria interpres -n02027492 red-backed sandpiper, dunlin, Erolia alpina -n02028035 redshank, Tringa totanus -n02033041 dowitcher -n02037110 oystercatcher, oyster catcher -n02051845 pelican -n02056570 king penguin, Aptenodytes patagonica -n02058221 albatross, mollymawk -n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus -n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca -n02074367 dugong, Dugong dugon -n02077923 sea lion -n02085620 Chihuahua -n02085782 Japanese spaniel -n02085936 Maltese dog, Maltese terrier, Maltese -n02086079 Pekinese, Pekingese, Peke -n02086240 Shih-Tzu -n02086646 Blenheim spaniel -n02086910 papillon -n02087046 toy terrier -n02087394 Rhodesian ridgeback -n02088094 Afghan hound, Afghan -n02088238 basset, basset hound -n02088364 beagle -n02088466 bloodhound, sleuthhound -n02088632 bluetick -n02089078 black-and-tan coonhound -n02089867 Walker hound, Walker foxhound -n02089973 English foxhound -n02090379 redbone -n02090622 borzoi, Russian wolfhound -n02090721 Irish wolfhound -n02091032 Italian greyhound -n02091134 whippet -n02091244 Ibizan hound, Ibizan Podenco -n02091467 Norwegian elkhound, elkhound -n02091635 otterhound, otter hound -n02091831 Saluki, gazelle hound -n02092002 Scottish deerhound, deerhound -n02092339 Weimaraner -n02093256 Staffordshire bullterrier, Staffordshire bull terrier -n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier -n02093647 Bedlington terrier -n02093754 Border terrier -n02093859 Kerry blue terrier -n02093991 Irish terrier -n02094114 Norfolk terrier -n02094258 Norwich terrier -n02094433 Yorkshire terrier -n02095314 wire-haired fox terrier -n02095570 Lakeland terrier -n02095889 Sealyham terrier, Sealyham -n02096051 Airedale, Airedale terrier -n02096177 cairn, cairn terrier -n02096294 Australian terrier -n02096437 Dandie Dinmont, Dandie Dinmont terrier -n02096585 Boston bull, Boston terrier -n02097047 miniature schnauzer -n02097130 giant schnauzer -n02097209 standard schnauzer -n02097298 Scotch terrier, Scottish terrier, Scottie -n02097474 Tibetan terrier, chrysanthemum dog -n02097658 silky terrier, Sydney silky -n02098105 soft-coated wheaten terrier -n02098286 West Highland white terrier -n02098413 Lhasa, Lhasa apso -n02099267 flat-coated retriever -n02099429 curly-coated retriever -n02099601 golden retriever -n02099712 Labrador retriever -n02099849 Chesapeake Bay retriever -n02100236 German short-haired pointer -n02100583 vizsla, Hungarian pointer -n02100735 English setter -n02100877 Irish setter, red setter -n02101006 Gordon setter -n02101388 Brittany spaniel -n02101556 clumber, clumber spaniel -n02102040 English springer, English springer spaniel -n02102177 Welsh springer spaniel -n02102318 cocker spaniel, English cocker spaniel, cocker -n02102480 Sussex spaniel -n02102973 Irish water spaniel -n02104029 kuvasz -n02104365 schipperke -n02105056 groenendael -n02105162 malinois -n02105251 briard -n02105412 kelpie -n02105505 komondor -n02105641 Old English sheepdog, bobtail -n02105855 Shetland sheepdog, Shetland sheep dog, Shetland -n02106030 collie -n02106166 Border collie -n02106382 Bouvier des Flandres, Bouviers des Flandres -n02106550 Rottweiler -n02106662 German shepherd, German shepherd dog, German police dog, alsatian -n02107142 Doberman, Doberman pinscher -n02107312 miniature pinscher -n02107574 Greater Swiss Mountain dog -n02107683 Bernese mountain dog -n02107908 Appenzeller -n02108000 EntleBucher -n02108089 boxer -n02108422 bull mastiff -n02108551 Tibetan mastiff -n02108915 French bulldog -n02109047 Great Dane -n02109525 Saint Bernard, St Bernard -n02109961 Eskimo dog, husky -n02110063 malamute, malemute, Alaskan malamute -n02110185 Siberian husky -n02110341 dalmatian, coach dog, carriage dog -n02110627 affenpinscher, monkey pinscher, monkey dog -n02110806 basenji -n02110958 pug, pug-dog -n02111129 Leonberg -n02111277 Newfoundland, Newfoundland dog -n02111500 Great Pyrenees -n02111889 Samoyed, Samoyede -n02112018 Pomeranian -n02112137 chow, chow chow -n02112350 keeshond -n02112706 Brabancon griffon -n02113023 Pembroke, Pembroke Welsh corgi -n02113186 Cardigan, Cardigan Welsh corgi -n02113624 toy poodle -n02113712 miniature poodle -n02113799 standard poodle -n02113978 Mexican hairless -n02114367 timber wolf, grey wolf, gray wolf, Canis lupus -n02114548 white wolf, Arctic wolf, Canis lupus tundrarum -n02114712 red wolf, maned wolf, Canis rufus, Canis niger -n02114855 coyote, prairie wolf, brush wolf, Canis latrans -n02115641 dingo, warrigal, warragal, Canis dingo -n02115913 dhole, Cuon alpinus -n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus -n02117135 hyena, hyaena -n02119022 red fox, Vulpes vulpes -n02119789 kit fox, Vulpes macrotis -n02120079 Arctic fox, white fox, Alopex lagopus -n02120505 grey fox, gray fox, Urocyon cinereoargenteus -n02123045 tabby, tabby cat -n02123159 tiger cat -n02123394 Persian cat -n02123597 Siamese cat, Siamese -n02124075 Egyptian cat -n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor -n02127052 lynx, catamount -n02128385 leopard, Panthera pardus -n02128757 snow leopard, ounce, Panthera uncia -n02128925 jaguar, panther, Panthera onca, Felis onca -n02129165 lion, king of beasts, Panthera leo -n02129604 tiger, Panthera tigris -n02130308 cheetah, chetah, Acinonyx jubatus -n02132136 brown bear, bruin, Ursus arctos -n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus -n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus -n02134418 sloth bear, Melursus ursinus, Ursus ursinus -n02137549 mongoose -n02138441 meerkat, mierkat -n02165105 tiger beetle -n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle -n02167151 ground beetle, carabid beetle -n02168699 long-horned beetle, longicorn, longicorn beetle -n02169497 leaf beetle, chrysomelid -n02172182 dung beetle -n02174001 rhinoceros beetle -n02177972 weevil -n02190166 fly -n02206856 bee -n02219486 ant, emmet, pismire -n02226429 grasshopper, hopper -n02229544 cricket -n02231487 walking stick, walkingstick, stick insect -n02233338 cockroach, roach -n02236044 mantis, mantid -n02256656 cicada, cicala -n02259212 leafhopper -n02264363 lacewing, lacewing fly -n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk -n02268853 damselfly -n02276258 admiral -n02277742 ringlet, ringlet butterfly -n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus -n02280649 cabbage butterfly -n02281406 sulphur butterfly, sulfur butterfly -n02281787 lycaenid, lycaenid butterfly -n02317335 starfish, sea star -n02319095 sea urchin -n02321529 sea cucumber, holothurian -n02325366 wood rabbit, cottontail, cottontail rabbit -n02326432 hare -n02328150 Angora, Angora rabbit -n02342885 hamster -n02346627 porcupine, hedgehog -n02356798 fox squirrel, eastern fox squirrel, Sciurus niger -n02361337 marmot -n02363005 beaver -n02364673 guinea pig, Cavia cobaya -n02389026 sorrel -n02391049 zebra -n02395406 hog, pig, grunter, squealer, Sus scrofa -n02396427 wild boar, boar, Sus scrofa -n02397096 warthog -n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius -n02403003 ox -n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis -n02410509 bison -n02412080 ram, tup -n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis -n02417914 ibex, Capra ibex -n02422106 hartebeest -n02422699 impala, Aepyceros melampus -n02423022 gazelle -n02437312 Arabian camel, dromedary, Camelus dromedarius -n02437616 llama -n02441942 weasel -n02442845 mink -n02443114 polecat, fitch, foulmart, foumart, Mustela putorius -n02443484 black-footed ferret, ferret, Mustela nigripes -n02444819 otter -n02445715 skunk, polecat, wood pussy -n02447366 badger -n02454379 armadillo -n02457408 three-toed sloth, ai, Bradypus tridactylus -n02480495 orangutan, orang, orangutang, Pongo pygmaeus -n02480855 gorilla, Gorilla gorilla -n02481823 chimpanzee, chimp, Pan troglodytes -n02483362 gibbon, Hylobates lar -n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus -n02484975 guenon, guenon monkey -n02486261 patas, hussar monkey, Erythrocebus patas -n02486410 baboon -n02487347 macaque -n02488291 langur -n02488702 colobus, colobus monkey -n02489166 proboscis monkey, Nasalis larvatus -n02490219 marmoset -n02492035 capuchin, ringtail, Cebus capucinus -n02492660 howler monkey, howler -n02493509 titi, titi monkey -n02493793 spider monkey, Ateles geoffroyi -n02494079 squirrel monkey, Saimiri sciureus -n02497673 Madagascar cat, ring-tailed lemur, Lemur catta -n02500267 indri, indris, Indri indri, Indri brevicaudatus -n02504013 Indian elephant, Elephas maximus -n02504458 African elephant, Loxodonta africana -n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens -n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca -n02514041 barracouta, snoek -n02526121 eel -n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch -n02606052 rock beauty, Holocanthus tricolor -n02607072 anemone fish -n02640242 sturgeon -n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus -n02643566 lionfish -n02655020 puffer, pufferfish, blowfish, globefish -n02666196 abacus -n02667093 abaya -n02669723 academic gown, academic robe, judge's robe -n02672831 accordion, piano accordion, squeeze box -n02676566 acoustic guitar -n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier -n02690373 airliner -n02692877 airship, dirigible -n02699494 altar -n02701002 ambulance -n02704792 amphibian, amphibious vehicle -n02708093 analog clock -n02727426 apiary, bee house -n02730930 apron -n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin -n02749479 assault rifle, assault gun -n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack -n02776631 bakery, bakeshop, bakehouse -n02777292 balance beam, beam -n02782093 balloon -n02783161 ballpoint, ballpoint pen, ballpen, Biro -n02786058 Band Aid -n02787622 banjo -n02788148 bannister, banister, balustrade, balusters, handrail -n02790996 barbell -n02791124 barber chair -n02791270 barbershop -n02793495 barn -n02794156 barometer -n02795169 barrel, cask -n02797295 barrow, garden cart, lawn cart, wheelbarrow -n02799071 baseball -n02802426 basketball -n02804414 bassinet -n02804610 bassoon -n02807133 bathing cap, swimming cap -n02808304 bath towel -n02808440 bathtub, bathing tub, bath, tub -n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon -n02814860 beacon, lighthouse, beacon light, pharos -n02815834 beaker -n02817516 bearskin, busby, shako -n02823428 beer bottle -n02823750 beer glass -n02825657 bell cote, bell cot -n02834397 bib -n02835271 bicycle-built-for-two, tandem bicycle, tandem -n02837789 bikini, two-piece -n02840245 binder, ring-binder -n02841315 binoculars, field glasses, opera glasses -n02843684 birdhouse -n02859443 boathouse -n02860847 bobsled, bobsleigh, bob -n02865351 bolo tie, bolo, bola tie, bola -n02869837 bonnet, poke bonnet -n02870880 bookcase -n02871525 bookshop, bookstore, bookstall -n02877765 bottlecap -n02879718 bow -n02883205 bow tie, bow-tie, bowtie -n02892201 brass, memorial tablet, plaque -n02892767 brassiere, bra, bandeau -n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty -n02895154 breastplate, aegis, egis -n02906734 broom -n02909870 bucket, pail -n02910353 buckle -n02916936 bulletproof vest -n02917067 bullet train, bullet -n02927161 butcher shop, meat market -n02930766 cab, hack, taxi, taxicab -n02939185 caldron, cauldron -n02948072 candle, taper, wax light -n02950826 cannon -n02951358 canoe -n02951585 can opener, tin opener -n02963159 cardigan -n02965783 car mirror -n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig -n02966687 carpenter's kit, tool kit -n02971356 carton -n02974003 car wheel -n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM -n02978881 cassette -n02979186 cassette player -n02980441 castle -n02981792 catamaran -n02988304 CD player -n02992211 cello, violoncello -n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone -n02999410 chain -n03000134 chainlink fence -n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour -n03000684 chain saw, chainsaw -n03014705 chest -n03016953 chiffonier, commode -n03017168 chime, bell, gong -n03018349 china cabinet, china closet -n03026506 Christmas stocking -n03028079 church, church building -n03032252 cinema, movie theater, movie theatre, movie house, picture palace -n03041632 cleaver, meat cleaver, chopper -n03042490 cliff dwelling -n03045698 cloak -n03047690 clog, geta, patten, sabot -n03062245 cocktail shaker -n03063599 coffee mug -n03063689 coffeepot -n03065424 coil, spiral, volute, whorl, helix -n03075370 combination lock -n03085013 computer keyboard, keypad -n03089624 confectionery, confectionary, candy store -n03095699 container ship, containership, container vessel -n03100240 convertible -n03109150 corkscrew, bottle screw -n03110669 cornet, horn, trumpet, trump -n03124043 cowboy boot -n03124170 cowboy hat, ten-gallon hat -n03125729 cradle -n03126707 crane -n03127747 crash helmet -n03127925 crate -n03131574 crib, cot -n03133878 Crock Pot -n03134739 croquet ball -n03141823 crutch -n03146219 cuirass -n03160309 dam, dike, dyke -n03179701 desk -n03180011 desktop computer -n03187595 dial telephone, dial phone -n03188531 diaper, nappy, napkin -n03196217 digital clock -n03197337 digital watch -n03201208 dining table, board -n03207743 dishrag, dishcloth -n03207941 dishwasher, dish washer, dishwashing machine -n03208938 disk brake, disc brake -n03216828 dock, dockage, docking facility -n03218198 dogsled, dog sled, dog sleigh -n03220513 dome -n03223299 doormat, welcome mat -n03240683 drilling platform, offshore rig -n03249569 drum, membranophone, tympan -n03250847 drumstick -n03255030 dumbbell -n03259280 Dutch oven -n03271574 electric fan, blower -n03272010 electric guitar -n03272562 electric locomotive -n03290653 entertainment center -n03291819 envelope -n03297495 espresso maker -n03314780 face powder -n03325584 feather boa, boa -n03337140 file, file cabinet, filing cabinet -n03344393 fireboat -n03345487 fire engine, fire truck -n03347037 fire screen, fireguard -n03355925 flagpole, flagstaff -n03372029 flute, transverse flute -n03376595 folding chair -n03379051 football helmet -n03384352 forklift -n03388043 fountain -n03388183 fountain pen -n03388549 four-poster -n03393912 freight car -n03394916 French horn, horn -n03400231 frying pan, frypan, skillet -n03404251 fur coat -n03417042 garbage truck, dustcart -n03424325 gasmask, respirator, gas helmet -n03425413 gas pump, gasoline pump, petrol pump, island dispenser -n03443371 goblet -n03444034 go-kart -n03445777 golf ball -n03445924 golfcart, golf cart -n03447447 gondola -n03447721 gong, tam-tam -n03450230 gown -n03452741 grand piano, grand -n03457902 greenhouse, nursery, glasshouse -n03459775 grille, radiator grille -n03461385 grocery store, grocery, food market, market -n03467068 guillotine -n03476684 hair slide -n03476991 hair spray -n03478589 half track -n03481172 hammer -n03482405 hamper -n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier -n03485407 hand-held computer, hand-held microcomputer -n03485794 handkerchief, hankie, hanky, hankey -n03492542 hard disc, hard disk, fixed disk -n03494278 harmonica, mouth organ, harp, mouth harp -n03495258 harp -n03496892 harvester, reaper -n03498962 hatchet -n03527444 holster -n03529860 home theater, home theatre -n03530642 honeycomb -n03532672 hook, claw -n03534580 hoopskirt, crinoline -n03535780 horizontal bar, high bar -n03538406 horse cart, horse-cart -n03544143 hourglass -n03584254 iPod -n03584829 iron, smoothing iron -n03590841 jack-o'-lantern -n03594734 jean, blue jean, denim -n03594945 jeep, landrover -n03595614 jersey, T-shirt, tee shirt -n03598930 jigsaw puzzle -n03599486 jinrikisha, ricksha, rickshaw -n03602883 joystick -n03617480 kimono -n03623198 knee pad -n03627232 knot -n03630383 lab coat, laboratory coat -n03633091 ladle -n03637318 lampshade, lamp shade -n03642806 laptop, laptop computer -n03649909 lawn mower, mower -n03657121 lens cap, lens cover -n03658185 letter opener, paper knife, paperknife -n03661043 library -n03662601 lifeboat -n03666591 lighter, light, igniter, ignitor -n03670208 limousine, limo -n03673027 liner, ocean liner -n03676483 lipstick, lip rouge -n03680355 Loafer -n03690938 lotion -n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system -n03692522 loupe, jeweler's loupe -n03697007 lumbermill, sawmill -n03706229 magnetic compass -n03709823 mailbag, postbag -n03710193 mailbox, letter box -n03710637 maillot -n03710721 maillot, tank suit -n03717622 manhole cover -n03720891 maraca -n03721384 marimba, xylophone -n03724870 mask -n03729826 matchstick -n03733131 maypole -n03733281 maze, labyrinth -n03733805 measuring cup -n03742115 medicine chest, medicine cabinet -n03743016 megalith, megalithic structure -n03759954 microphone, mike -n03761084 microwave, microwave oven -n03763968 military uniform -n03764736 milk can -n03769881 minibus -n03770439 miniskirt, mini -n03770679 minivan -n03773504 missile -n03775071 mitten -n03775546 mixing bowl -n03776460 mobile home, manufactured home -n03777568 Model T -n03777754 modem -n03781244 monastery -n03782006 monitor -n03785016 moped -n03786901 mortar -n03787032 mortarboard -n03788195 mosque -n03788365 mosquito net -n03791053 motor scooter, scooter -n03792782 mountain bike, all-terrain bike, off-roader -n03792972 mountain tent -n03793489 mouse, computer mouse -n03794056 mousetrap -n03796401 moving van -n03803284 muzzle -n03804744 nail -n03814639 neck brace -n03814906 necklace -n03825788 nipple -n03832673 notebook, notebook computer -n03837869 obelisk -n03838899 oboe, hautboy, hautbois -n03840681 ocarina, sweet potato -n03841143 odometer, hodometer, mileometer, milometer -n03843555 oil filter -n03854065 organ, pipe organ -n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO -n03866082 overskirt -n03868242 oxcart -n03868863 oxygen mask -n03871628 packet -n03873416 paddle, boat paddle -n03874293 paddlewheel, paddle wheel -n03874599 padlock -n03876231 paintbrush -n03877472 pajama, pyjama, pj's, jammies -n03877845 palace -n03884397 panpipe, pandean pipe, syrinx -n03887697 paper towel -n03888257 parachute, chute -n03888605 parallel bars, bars -n03891251 park bench -n03891332 parking meter -n03895866 passenger car, coach, carriage -n03899768 patio, terrace -n03902125 pay-phone, pay-station -n03903868 pedestal, plinth, footstall -n03908618 pencil box, pencil case -n03908714 pencil sharpener -n03916031 perfume, essence -n03920288 Petri dish -n03924679 photocopier -n03929660 pick, plectrum, plectron -n03929855 pickelhaube -n03930313 picket fence, paling -n03930630 pickup, pickup truck -n03933933 pier -n03935335 piggy bank, penny bank -n03937543 pill bottle -n03938244 pillow -n03942813 ping-pong ball -n03944341 pinwheel -n03947888 pirate, pirate ship -n03950228 pitcher, ewer -n03954731 plane, carpenter's plane, woodworking plane -n03956157 planetarium -n03958227 plastic bag -n03961711 plate rack -n03967562 plow, plough -n03970156 plunger, plumber's helper -n03976467 Polaroid camera, Polaroid Land camera -n03976657 pole -n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria -n03980874 poncho -n03982430 pool table, billiard table, snooker table -n03983396 pop bottle, soda bottle -n03991062 pot, flowerpot -n03992509 potter's wheel -n03995372 power drill -n03998194 prayer rug, prayer mat -n04004767 printer -n04005630 prison, prison house -n04008634 projectile, missile -n04009552 projector -n04019541 puck, hockey puck -n04023962 punching bag, punch bag, punching ball, punchball -n04026417 purse -n04033901 quill, quill pen -n04033995 quilt, comforter, comfort, puff -n04037443 racer, race car, racing car -n04039381 racket, racquet -n04040759 radiator -n04041544 radio, wireless -n04044716 radio telescope, radio reflector -n04049303 rain barrel -n04065272 recreational vehicle, RV, R.V. -n04067472 reel -n04069434 reflex camera -n04070727 refrigerator, icebox -n04074963 remote control, remote -n04081281 restaurant, eating house, eating place, eatery -n04086273 revolver, six-gun, six-shooter -n04090263 rifle -n04099969 rocking chair, rocker -n04111531 rotisserie -n04116512 rubber eraser, rubber, pencil eraser -n04118538 rugby ball -n04118776 rule, ruler -n04120489 running shoe -n04125021 safe -n04127249 safety pin -n04131690 saltshaker, salt shaker -n04133789 sandal -n04136333 sarong -n04141076 sax, saxophone -n04141327 scabbard -n04141975 scale, weighing machine -n04146614 school bus -n04147183 schooner -n04149813 scoreboard -n04152593 screen, CRT screen -n04153751 screw -n04154565 screwdriver -n04162706 seat belt, seatbelt -n04179913 sewing machine -n04192698 shield, buckler -n04200800 shoe shop, shoe-shop, shoe store -n04201297 shoji -n04204238 shopping basket -n04204347 shopping cart -n04208210 shovel -n04209133 shower cap -n04209239 shower curtain -n04228054 ski -n04229816 ski mask -n04235860 sleeping bag -n04238763 slide rule, slipstick -n04239074 sliding door -n04243546 slot, one-armed bandit -n04251144 snorkel -n04252077 snowmobile -n04252225 snowplow, snowplough -n04254120 soap dispenser -n04254680 soccer ball -n04254777 sock -n04258138 solar dish, solar collector, solar furnace -n04259630 sombrero -n04263257 soup bowl -n04264628 space bar -n04265275 space heater -n04266014 space shuttle -n04270147 spatula -n04273569 speedboat -n04275548 spider web, spider's web -n04277352 spindle -n04285008 sports car, sport car -n04286575 spotlight, spot -n04296562 stage -n04310018 steam locomotive -n04311004 steel arch bridge -n04311174 steel drum -n04317175 stethoscope -n04325704 stole -n04326547 stone wall -n04328186 stopwatch, stop watch -n04330267 stove -n04332243 strainer -n04335435 streetcar, tram, tramcar, trolley, trolley car -n04336792 stretcher -n04344873 studio couch, day bed -n04346328 stupa, tope -n04347754 submarine, pigboat, sub, U-boat -n04350905 suit, suit of clothes -n04355338 sundial -n04355933 sunglass -n04356056 sunglasses, dark glasses, shades -n04357314 sunscreen, sunblock, sun blocker -n04366367 suspension bridge -n04367480 swab, swob, mop -n04370456 sweatshirt -n04371430 swimming trunks, bathing trunks -n04371774 swing -n04372370 switch, electric switch, electrical switch -n04376876 syringe -n04380533 table lamp -n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle -n04392985 tape player -n04398044 teapot -n04399382 teddy, teddy bear -n04404412 television, television system -n04409515 tennis ball -n04417672 thatch, thatched roof -n04418357 theater curtain, theatre curtain -n04423845 thimble -n04428191 thresher, thrasher, threshing machine -n04429376 throne -n04435653 tile roof -n04442312 toaster -n04443257 tobacco shop, tobacconist shop, tobacconist -n04447861 toilet seat -n04456115 torch -n04458633 totem pole -n04461696 tow truck, tow car, wrecker -n04462240 toyshop -n04465501 tractor -n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi -n04476259 tray -n04479046 trench coat -n04482393 tricycle, trike, velocipede -n04483307 trimaran -n04485082 tripod -n04486054 triumphal arch -n04487081 trolleybus, trolley coach, trackless trolley -n04487394 trombone -n04493381 tub, vat -n04501370 turnstile -n04505470 typewriter keyboard -n04507155 umbrella -n04509417 unicycle, monocycle -n04515003 upright, upright piano -n04517823 vacuum, vacuum cleaner -n04522168 vase -n04523525 vault -n04525038 velvet -n04525305 vending machine -n04532106 vestment -n04532670 viaduct -n04536866 violin, fiddle -n04540053 volleyball -n04542943 waffle iron -n04548280 wall clock -n04548362 wallet, billfold, notecase, pocketbook -n04550184 wardrobe, closet, press -n04552348 warplane, military plane -n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin -n04554684 washer, automatic washer, washing machine -n04557648 water bottle -n04560804 water jug -n04562935 water tower -n04579145 whiskey jug -n04579432 whistle -n04584207 wig -n04589890 window screen -n04590129 window shade -n04591157 Windsor tie -n04591713 wine bottle -n04592741 wing -n04596742 wok -n04597913 wooden spoon -n04599235 wool, woolen, woollen -n04604644 worm fence, snake fence, snake-rail fence, Virginia fence -n04606251 wreck -n04612504 yawl -n04613696 yurt -n06359193 web site, website, internet site, site -n06596364 comic book -n06785654 crossword puzzle, crossword -n06794110 street sign -n06874185 traffic light, traffic signal, stoplight -n07248320 book jacket, dust cover, dust jacket, dust wrapper -n07565083 menu -n07579787 plate -n07583066 guacamole -n07584110 consomme -n07590611 hot pot, hotpot -n07613480 trifle -n07614500 ice cream, icecream -n07615774 ice lolly, lolly, lollipop, popsicle -n07684084 French loaf -n07693725 bagel, beigel -n07695742 pretzel -n07697313 cheeseburger -n07697537 hotdog, hot dog, red hot -n07711569 mashed potato -n07714571 head cabbage -n07714990 broccoli -n07715103 cauliflower -n07716358 zucchini, courgette -n07716906 spaghetti squash -n07717410 acorn squash -n07717556 butternut squash -n07718472 cucumber, cuke -n07718747 artichoke, globe artichoke -n07720875 bell pepper -n07730033 cardoon -n07734744 mushroom -n07742313 Granny Smith -n07745940 strawberry -n07747607 orange -n07749582 lemon -n07753113 fig -n07753275 pineapple, ananas -n07753592 banana -n07754684 jackfruit, jak, jack -n07760859 custard apple -n07768694 pomegranate -n07802026 hay -n07831146 carbonara -n07836838 chocolate sauce, chocolate syrup -n07860988 dough -n07871810 meat loaf, meatloaf -n07873807 pizza, pizza pie -n07875152 potpie -n07880968 burrito -n07892512 red wine -n07920052 espresso -n07930864 cup -n07932039 eggnog -n09193705 alp -n09229709 bubble -n09246464 cliff, drop, drop-off -n09256479 coral reef -n09288635 geyser -n09332890 lakeside, lakeshore -n09399592 promontory, headland, head, foreland -n09421951 sandbar, sand bar -n09428293 seashore, coast, seacoast, sea-coast -n09468604 valley, vale -n09472597 volcano -n09835506 ballplayer, baseball player -n10148035 groom, bridegroom -n10565667 scuba diver -n11879895 rapeseed -n11939491 daisy -n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum -n12144580 corn -n12267677 acorn -n12620546 hip, rose hip, rosehip -n12768682 buckeye, horse chestnut, conker -n12985857 coral fungus -n12998815 agaric -n13037406 gyromitra -n13040303 stinkhorn, carrion fungus -n13044778 earthstar -n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa -n13054560 bolete -n13133613 ear, spike, capitulum -n15075141 toilet tissue, toilet paper, bathroom tissue diff --git a/flow-python/examples/simple_det_classify/__init__.py b/flow-python/examples/simple_det_classify/__init__.py deleted file mode 100644 index f57558f..0000000 --- a/flow-python/examples/simple_det_classify/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 diff --git a/flow-python/examples/simple_det_classify/classify.py b/flow-python/examples/simple_det_classify/classify.py deleted file mode 100644 index 2c53661..0000000 --- a/flow-python/examples/simple_det_classify/classify.py +++ /dev/null @@ -1,100 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import json -import numpy as np -import cv2 -from loguru import logger -from megflow import register -from .lite import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class Classify: - def __init__(self, name, arg): - logger.info("loading Resnet18 Classification...") - self.name = name - self.batch_size = arg['max_batch'] - self.timeout = arg['wait_time'] - - # load ReID model and warmup - self._model = PredictorLite(path=arg['path'], - device=arg['device'], - device_id=arg['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._model.inference(warmup_data) - logger.info("Resnet18 loaded.") - - def expand(self, box, max_w, max_h, ratio): - l = box[0] - r = box[2] - t = box[1] - b = box[3] - center_x = (l + r) / 2 - center_y = (t + b) / 2 - w_side = (r - l) * ratio / 2 - h_side = (b - t) * ratio / 2 - - l = center_x - w_side - r = center_x + w_side - t = center_y - h_side - b = center_y + h_side - l = max(0, l) - t = max(0, t) - r = min(max_w, r) - b = min(max_h, b) - return int(l), int(t), int(r), int(b) - - def exec(self): - # batching - (envelopes, _) = self.inp.batch_recv(self.batch_size, self.timeout) - - if len(envelopes) == 0: - return - - crops = [] - for env in envelopes: - data = env.msg['data'] - items = env.msg['items'] - for item in items: - assert 'bbox' in item - bbox = item['bbox'] - l, t, r, b = self.expand(bbox, data.shape[1], data.shape[0], - 1.1) - crop = cv2.resize(data[t:b, l:r], (224, 224)) - crops.append(crop[np.newaxis, :]) - if len(crops) > 0: - data = np.concatenate(crops) - types = self._model.inference_batch(data) - for _type in types: - self.out.send(envelopes[0].repack(json.dumps(str(_type)))) - - # batch_size == 1 - # def exec(self): - # envelope = self.inp.recv() - # if envelope is None: - # return - - # data = envelope.msg['data'] - # items = [] - # results = [] - # if 'items' in envelope.msg: - # items = envelope.msg['items'] - # for _, item in enumerate(items): - # assert 'bbox' in item - # bbox = item['bbox'] - # l, t, r, b = self.expand(bbox, data.shape[1], data.shape[0], 1.1) - # _type = self._model.inference(data[t:b, l:r]) - # results.append({ - # "type": str(_type), - # "frame_id": str(envelope.partial_id) - # }) - # self.out.send(envelope.repack(json.dumps(results))) diff --git a/flow-python/examples/simple_det_classify/det.py b/flow-python/examples/simple_det_classify/det.py deleted file mode 100644 index 60a1d38..0000000 --- a/flow-python/examples/simple_det_classify/det.py +++ /dev/null @@ -1,78 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import numpy as np -from loguru import logger -from megflow import register -from warehouse.detection_yolox import PredictorLite - - -@register(inputs=['inp'], outputs=['out']) -class Detect: - def __init__(self, name, args): - logger.info("loading YOLOX detection...") - self._tsize = args['tsize'] - self._interval = args['interval'] - self._visualize = args['visualize'] - self.name = name - - # load detect model and warmup - self._predictor = PredictorLite(path=args['path'], - confthre=args['conf'], - nmsthre=args['nms'], - test_size=(self._tsize, self._tsize), - device=args['device'], - device_id=args['device_id']) - warmup_data = np.zeros((224, 224, 3), dtype=np.uint8) - self._predictor.inference(warmup_data) - logger.info(" YOLOX loaded.") - - @staticmethod - def restrict(val, min, max): - assert min < max - if val < min: - val = min - if val > max: - val = max - return val - - def exec(self): - envelope = self.inp.recv() - if envelope is None: - return - - msg = envelope.msg - msg['items'] = [] - - process = envelope.partial_id % self._interval == 0 - if process: - data = msg['data'] - outputs = self._predictor.inference(data) - # skip if detect nothing - if outputs is not None: - items = [] - - for i in range(outputs.shape[0]): - output = outputs[i] - item = dict() - item["bbox"] = output[0:4] - item["det_score"] = output[4] * output[5] - items.append(item) - msg['items'] = items - - # import cv2 - # x = self._predictor.visual(outputs, data) - # name = 'frame{0:07d}.jpg'.format(envelope.partial_id) - # cv2.imwrite(name, x) - - if self._visualize == 1: - msg['data'] = self._predictor.visual(outputs, data) - self.out.send(envelope) diff --git a/flow-python/examples/simple_det_classify/dump.py b/flow-python/examples/simple_det_classify/dump.py deleted file mode 100644 index acae30f..0000000 --- a/flow-python/examples/simple_det_classify/dump.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# pylint: skip-file -import argparse -import sys - -# pylint: disable=import-error -import resnet.model as resnet_model -# pylint: disable=import-error -import shufflenet.model as snet_model - -import numpy as np - -import megengine as mge -import megengine.functional as F -from megengine import jit - - -def dump_static_graph(model, graph_name, shape): - model.eval() - - data = mge.Tensor(np.ones(shape, dtype=np.uint8)) - - @jit.trace(capture_as_const=True) - def pred_func(data): - out = data.astype(np.float32) - - output_h, output_w = 224, 224 - # resize - M = mge.tensor(np.array([[1,0,0], [0,1,0], [0,0,1]], dtype=np.float32).reshape((1,3,3))) - out = F.vision.warp_perspective(out, M, (output_h, output_w), format='NHWC') - # mean - _mean = mge.Tensor(np.array([103.530, 116.280, 123.675], dtype=np.float32)) - out = F.sub(out, _mean) - # div - _div = mge.Tensor(np.array([57.375, 57.120, 58.395], dtype=np.float32)) - out = F.div(out, _div) - # dimshuffile - out = F.transpose(out, (0,3,1,2)) - - outputs = model(out) - return outputs - - pred_func(data) - pred_func.dump( - graph_name, - arg_names=["data"], - optimize_for_inference=True, - enable_fuse_conv_bias_nonlinearity=True, - ) - - -def main(): - parser = argparse.ArgumentParser(description="MegEngine Classification Dump .mge") - parser.add_argument( - "-a", - "--arch", - default="resnet18", - help="model architecture (default: resnet18)", - ) - parser.add_argument( - "-s", - "--shape", - type=int, - nargs='+', - default="1 3 224 224", - help="input shape (default: 1 3 224 224)" - ) - parser.add_argument( - "-o", - "--output", - type=str, - default="model.mge", - help="output filename" - ) - - args = parser.parse_args() - - if 'resnet' in args.arch: - model = getattr(resnet_model, args.arch)(pretrained=True) - elif 'shufflenet' in args.arch: - model = getattr(snet_model, args.arch)(pretrained=True) - else: - print('unavailable arch {}'.format(args.arch)) - sys.exit() - dump_static_graph(model, args.output, tuple(args.shape)) - - -if __name__ == "__main__": - main() diff --git a/flow-python/examples/simple_det_classify/lite.py b/flow-python/examples/simple_det_classify/lite.py deleted file mode 100644 index 603551e..0000000 --- a/flow-python/examples/simple_det_classify/lite.py +++ /dev/null @@ -1,106 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import argparse -import time -import cv2 -import numpy as np -import megenginelite as mgelite -from loguru import logger - - -class PredictorLite: - def __init__( - self, - path, - device="gpu", - device_id=0, - ): - - if "gpu" in device.lower(): - device_type = mgelite.LiteDeviceType.LITE_CUDA - else: - device_type = mgelite.LiteDeviceType.LITE_CPU - - net_config = mgelite.LiteConfig(device_type=device_type) - ios = mgelite.LiteNetworkIO() - ios.add_input(mgelite.LiteIO("data", is_host=True)) - - net = mgelite.LiteNetwork(config=net_config, io=ios) - net.device_id = device_id - net.load(path) - - self.net = net - - def inference_batch(self, img): - t0 = time.time() - - # build input tensor - inp_data = self.net.get_io_tensor("data") - inp_data.set_data_by_share(img) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - output = self.net.get_io_tensor(output_keys[0]).to_numpy() - logger.debug("resnet18 infer avg time: {:.4f}s".format( - (time.time() - t0) / img.shape[0])) - - return np.argmax(output, axis=1).tolist() - - def inference(self, img): - t0 = time.time() - - img = cv2.resize(img, (224, 224)) - # build input tensor - inp_data = self.net.get_io_tensor("data") - inp_data.set_data_by_share(img) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - output = self.net.get_io_tensor(output_keys[0]).to_numpy() - logger.debug("resnet18 infer time: {:.4f}s".format(time.time() - t0)) - - return np.argmax(output[0]) - - -def make_parser(): - parser = argparse.ArgumentParser("Classification Demo!") - parser.add_argument("--path", - default="./test.png", - help="path to images or video") - parser.add_argument("--model", - default=None, - type=str, - help=".mge for eval") - return parser - - -if __name__ == "__main__": - args = make_parser().parse_args() - predictor = PredictorLite(args.model) - image = cv2.imread(args.path) - if image is None: - logger.error(f"open {args.path} failed") - out = predictor.inference(image) - logger.info(f'{out}') - - for i in [1, 4, 8, 16, 32, 64, 128, 256]: - data = np.ones((i, 224, 224, 3), dtype=np.uint8) - out_batch = predictor.inference_batch(data) - logger.info(f'batch {i+1} {out_batch}') diff --git a/flow-python/examples/simple_det_classify/video_cpu.toml b/flow-python/examples/simple_det_classify/video_cpu.toml deleted file mode 100644 index 066326e..0000000 --- a/flow-python/examples/simple_det_classify/video_cpu.toml +++ /dev/null @@ -1,47 +0,0 @@ -main = "tutorial_02" - -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/simple_det_classify_models/yolox_s.mge" -interval = 5 -visualize = 1 -device = "cpu" -device_id = 0 - -[[nodes]] -name = "classify" -ty = "Classify" -path = "models/simple_det_classify_models/resnet18_preproc_inside.mge" -device = "cpu" -device_id = 0 -max_batch = 4 -wait_time = 100 - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "classify:inp"] }, -] - -[[graphs]] -name = "tutorial_02" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoServer" - port = 8085 - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/simple_det_classify/video_test.toml b/flow-python/examples/simple_det_classify/video_test.toml deleted file mode 100644 index 967ef01..0000000 --- a/flow-python/examples/simple_det_classify/video_test.toml +++ /dev/null @@ -1,48 +0,0 @@ -main = "tutorial_02" - -[[nodes]] -name = "det" -ty = "Detect" -model = "yolox-s" -conf = 0.25 -nms = 0.45 -tsize = 640 -path = "models/simple_det_classify_models/yolox_s.mge" -interval = 1 -visualize = 1 -device = "gpu" -device_id = 0 - -[[nodes]] -name = "classify" -ty = "Classify" -path = "models/simple_det_classify_models/resnet18_preproc_inside.mge" -device = "gpu" -device_id = 0 -max_batch = 4 -wait_time = 100 - -[[graphs]] -name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["classify:out"] }] -connections = [ - { cap = 16, ports = ["det:out", "classify:inp"] }, -] - -[[graphs]] -name = "tutorial_02" -connections = [ - { cap = 16, ports = ["source:out", "destination:inp"] }, - { cap = 16, ports = ["source:inp", "destination:out"] } -] - - [[graphs.nodes]] - name = "source" - ty = "VideoInput" - repeat = 1 - urls = ["/path/to/your/video.ts"] - - [[graphs.nodes]] - name = "destination" - ty = "subgraph" diff --git a/flow-python/examples/utils.py b/flow-python/examples/utils.py deleted file mode 100644 index 008d03e..0000000 --- a/flow-python/examples/utils.py +++ /dev/null @@ -1,214 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -import numpy as np - - -def sigmoid(x: float) -> float: - return 1.0 / 1.0 + np.exp(-x) - - -def iou(r0: np.array, r1: np.array) -> float: - xx1 = max(r0[1], r1[1]) - yy1 = max(r0[2], r1[2]) - xx2 = min(r0[3], r1[3]) - yy2 = min(r0[4], r1[4]) - dx = max(0., xx2 - xx1) - dy = max(0, yy2 - yy1) - i = dx * dy - u = (r0[3] - r0[1]) * (r0[4] - r0[2]) + (r1[3] - r1[1]) * (r1[4] - - r1[2]) - i - iou = i / u - return iou - - -def is_overlap(rect1: np.array, rect2: np.array, iou_thr: float) -> bool: - ov = iou(rect1, rect2) - return ov >= iou_thr - - -def shrink_rect(rect): - x1, y1, x2, y2 = rect - - # shrink person to center - ''' - x1_new = (x2 - x1) / 4 + x1 - x2_new = x2 - (x2 - x1) / 4 - y1_new = (y2 - y1) / 4 + y1 - y2_new = y2 - (y2 - y1) / 4 - ''' - - # shrink person to head by stat - w = x2 - x1 + 1 - h = y2 - y1 + 1 - - head_ratio_h2w = 1.3 - - min_head_width = 40 # set min_head if person is too small - min_head_height = min_head_width * head_ratio_h2w - - ratio_w = 0.3478 # 0.3478 is the width of head relative to person - ratio_h = 0.1709 # 0.1709 is the height of head relative to person - - w_head = max(w * ratio_w, min_head_width) - h_head = max(h * ratio_h, min_head_height) - - x1_new = x1 + ( - w - - w_head) * 0.5 # put the center of head on x at the center of person - y1_new = y1 + h * 0.0931 - h_head * 0.5 # 0.0931 if the y_center of head relative to person - x2_new = x1_new + w_head - 1 - y2_new = y1_new + h_head - 1 - - return x1_new, y1_new, x2_new, y2_new - - -def filter_rect_by_score_and_size(scores, rects, idx, size): - if scores[idx] == -1: - return np.array([]) - elif rects[idx][2] - rects[idx][0] + 1 <= size or rects[idx][3] - rects[ - idx][1] + 1 <= size: - return np.array([]) - else: - return np.concatenate((rects[idx], scores[idx:idx + 1])) - - -def is_overlap_v2(rect1, rect2, iou_threshold): - xx1 = max(rect1[0], rect2[0]) - yy1 = max(rect1[1], rect2[1]) - xx2 = min(rect1[2], rect2[2]) - yy2 = min(rect1[3], rect2[3]) - dx = max(0, xx2 - xx1 + 1) - dy = max(0, yy2 - yy1 + 1) - i = dx * dy - u = (rect1[2] - rect1[0] + 1) * (rect1[3] - rect1[1] + 1) + ( - rect2[2] - rect2[0] + 1) * (rect2[3] - rect2[1] + 1) - i - ov = i / u - return rect1[4] * rect2[4] < ov or ov >= iou_threshold - - -def is_overlap_v1(rect1, rect2, iou_threshold): - xx1 = max(rect1[0], rect2[0]) - yy1 = max(rect1[1], rect2[1]) - xx2 = min(rect1[2], rect2[2]) - yy2 = min(rect1[3], rect2[3]) - dx = max(0, xx2 - xx1 + 1) - dy = max(0, yy2 - yy1 + 1) - i = dx * dy - u = (rect1[2] - rect1[0] + 1) * (rect1[3] - rect1[1] + 1) + ( - rect2[2] - rect2[0] + 1) * (rect2[3] - rect2[1] + 1) - i - ov = i / u - return ov >= iou_threshold - - -def IoB(rect1, rect2, iob_threshold): - b = (rect2[:, 2] - rect2[:, 0] + 1) * (rect2[:, 3] - rect2[:, 1] + 1) - # from IPython import embed; embed() $TODO - xx1 = np.maximum(rect1[:, 0], rect2[:, 0]) - yy1 = np.maximum(rect1[:, 1], rect2[:, 1]) - xx2 = np.minimum(rect1[:, 2], rect2[:, 2]) - yy2 = np.minimum(rect1[:, 3], rect2[:, 3]) - dx = np.maximum(0, xx2 - xx1 + 1) - dy = np.maximum(0, yy2 - yy1 + 1) - i = dx * dy - ov = i / b - ov[b < 0] = 0 - return ov - - -def IoU(rect1, rect2, iob_threshold): - a1 = (rect1[:, 2] - rect1[:, 0] + 1) * (rect1[:, 3] - rect1[:, 1] + 1) - a2 = (rect2[:, 2] - rect2[:, 0] + 1) * (rect2[:, 3] - rect2[:, 1] + 1) - xx1 = np.maximum(rect1[:, 0], rect2[:, 0]) - yy1 = np.maximum(rect1[:, 1], rect2[:, 1]) - xx2 = np.minimum(rect1[:, 2], rect2[:, 2]) - yy2 = np.minimum(rect1[:, 3], rect2[:, 3]) - dx = np.maximum(0, xx2 - xx1 + 1) - dy = np.maximum(0, yy2 - yy1 + 1) - i = dx * dy - - ov = i / (a1 + a2 - i) - ov[a1 + a2 - i < 0] = 0 - return ov - - -def simple_merge(rect1, rect2): - if rect2[4] > rect1[4]: - return rect2 - else: - return rect1 - - -def raw_nms(boxes, scores, iou_threshold=0.3): - if 0 == len(boxes): - return [] - rects = list(boxes) - for i in range(len(rects)): - rects[i] = list(rects[i]) - rects[i].append(scores[i]) - rects[i].append(i) - - rects.sort(key=lambda x: x[4], reverse=True) - - rect_valid = [True for i in range(len(rects))] - for i in range(len(rects)): - if rect_valid[i]: - j = i + 1 - while j < len(rect_valid): - if is_overlap_v1(rects[i], rects[j], iou_threshold): - rect_valid[j] = False - j = j + 1 - - return [x[5] for i, x in enumerate(rects) if rect_valid[i]] - - -def nms(boxes, scores, iou_threshold=0.3): - if 0 == len(boxes): - return [] - rects = list(boxes) - for i in range(len(rects)): - rects[i] = list(rects[i]) - rects[i].append(scores[i]) - rects[i].append(i) - rects.sort(key=lambda x: x[1]) - idx = 0 - for i in range(len(rects)): - if is_overlap_v2(rects[i], rects[idx], iou_threshold): - rects[idx] = simple_merge(rects[idx], rects[i]) - else: - idx += 1 - if idx != i: - rects[idx] = rects[i] - rects = rects[:idx + 1] - rects.sort(key=lambda x: x[0]) - idx = 0 - for i in range(len(rects)): - if is_overlap_v2(rects[i], rects[idx], iou_threshold): - rects[idx] = simple_merge(rects[idx], rects[i]) - else: - idx += 1 - if idx != i: - rects[idx] = rects[i] - rects = rects[:idx + 1] - idx = 0 - while idx < len(rects): - left = idx + 1 - right = len(rects) - 1 - while left <= right: - if is_overlap_v2(rects[idx], rects[left], iou_threshold): - rects[idx] = simple_merge(rects[idx], rects[left]) - rects[left] = rects[right] - right -= 1 - else: - left += 1 - if len(rects) != right + 1: - rects = rects[:right + 1] - idx += 1 - return [x[5] for x in rects] diff --git a/flow-python/examples/warehouse/detection_memd/README.md b/flow-python/examples/warehouse/detection_memd/README.md deleted file mode 100644 index 1e90648..0000000 --- a/flow-python/examples/warehouse/detection_memd/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Megvii Electric Moped Detector -包含电动车检测 ONNX 模型及推理代码 - -gif1 gif2 gif3 - -完整视频: [demo_1](https://v.qq.com/x/page/k3257ewacxa.html), [demo_2](https://v.qq.com/x/page/e3257kxhhut.html), [demo_3](https://v.qq.com/x/page/y32572ztgnt.html) - -## 准备工作 -安装 cuda 10.1 以及 cudnn 7.6.3 - -## 安装 -``` -git clone https://github.com/megvii-research/MEMD.git -cd MEMD -pip3 install -r requirements.txt -``` - -## 推理 -``` -python3 scripts/inference.py --detector ./models/model.onnx --input-img ./demo/input.jpg --model-json ./models/config.json --output-path ./demo/output.jpg - ---detector :onnx模型 ---input-img :输入图片地址 ---model-json :模型的配置文件地址 ---output-path :检测结果文件地址 -``` diff --git a/flow-python/examples/warehouse/detection_memd/__init__.py b/flow-python/examples/warehouse/detection_memd/__init__.py deleted file mode 100644 index df29ec9..0000000 --- a/flow-python/examples/warehouse/detection_memd/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .onnx_model import load_onnx_model, run diff --git a/flow-python/examples/warehouse/detection_memd/main.py b/flow-python/examples/warehouse/detection_memd/main.py deleted file mode 100644 index c8e4bba..0000000 --- a/flow-python/examples/warehouse/detection_memd/main.py +++ /dev/null @@ -1,86 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import sys -import json -import argparse - -import cv2 -from loguru import logger - -sys.path.append('.') -from .onnx_model import load_onnx_model, run - - -def inference(detector_path, img, output_path): - class_names = ["elec_cycle"] - onnx_session = load_onnx_model(detector_path) - - score_thrs = 0.05 - nms_thrs = 0.6 - - score_thrs = max(score_thrs, 0.5) - - res = run(onnx_session, img, class_names, score_thrs, nms_thrs) - - for box in res["boxes"]: - cv2.rectangle( - img, - (int(box["x"]), int(box["y"])), - (int(box["x"] + box["w"]), int(box["y"] + box["h"])), - (0, 255, 0), - 2, - ) - cv2.putText( - img, - "{}:{:.2f}".format(box["class_name"], box["score"]), - (int(box["x"] - 10), int(box["y"] - 10)), - cv2.FONT_HERSHEY_SIMPLEX, - 1, - (0, 255, 0), - 2, - ) - - if not output_path.endswith((".jpg", ".png")): - output_path = f"{output_path}.jpg" - - cv2.imwrite(output_path, img) - logger.info(f"Inference on an image and write to {output_path}") - - box_num = len(res["boxes"]) - - return box_num - - -def parse_args(): - parser = argparse.ArgumentParser("Electric Moped Detector") - parser.add_argument("--detector", - default="./models/model.onnx", - help="The path to onnx detector. ") - parser.add_argument("--input-img", - default="./demo/input.jpg", - help="The path to demo image to inference. ") - parser.add_argument("--output-path", - default="./demo/output.jpg", - help="The path of output images. ") - args = parser.parse_args() - - return args - - -def main(): - args = parse_args() - img = cv2.imread(args.input_img) - inference(args.detector, img, args.output_path) - - -if __name__ == "__main__": - main() diff --git a/flow-python/examples/warehouse/detection_memd/onnx_model.py b/flow-python/examples/warehouse/detection_memd/onnx_model.py deleted file mode 100644 index 7117ef7..0000000 --- a/flow-python/examples/warehouse/detection_memd/onnx_model.py +++ /dev/null @@ -1,138 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from loguru import logger -import onnxruntime -import cv2 -import numpy as np - - -def load_onnx_model(onnx_path): - onnx_session = onnxruntime.InferenceSession(onnx_path) - return onnx_session - - -def get_output_name(onnx_session): - output_name = [] - for node in onnx_session.get_outputs(): - output_name.append(node.name) - return output_name - - -def transform(image, target_shape=(960, 960)): - image_height, image_width, _ = image.shape - ratio_h = target_shape[1] * 1.0 / image_height - ratio_w = target_shape[0] * 1.0 / image_width - image = cv2.resize(image, target_shape) - return image, ratio_h, ratio_w - - -def is_overlap_v1(rect1, rect2, iou_threshold): - xx1 = max(rect1[0], rect2[0]) - yy1 = max(rect1[1], rect2[1]) - xx2 = min(rect1[2], rect2[2]) - yy2 = min(rect1[3], rect2[3]) - dx = max(0, xx2 - xx1 + 1) - dy = max(0, yy2 - yy1 + 1) - i = dx * dy - u = (rect1[2] - rect1[0] + 1) * (rect1[3] - rect1[1] + 1) + ( - rect2[2] - rect2[0] + 1) * (rect2[3] - rect2[1] + 1) - i - ov = i / u - return ov >= iou_threshold - - -def raw_nms(boxes, iou_threshold=0.3): - if 0 == len(boxes): - return [] - rects = list(boxes) - for i in range(len(rects)): - rects[i] = list(rects[i]) - rects[i].append(i) - - rects.sort(key=lambda x: x[4], reverse=True) - - rect_valid = [True for i in range(len(rects))] - for i in range(len(rects)): - if rect_valid[i]: - j = i + 1 - while j < len(rect_valid): - if is_overlap_v1(rects[i], rects[j], iou_threshold): - rect_valid[j] = False - j = j + 1 - - return [x[5] for i, x in enumerate(rects) if rect_valid[i]] - - -def onnx_inference(onnx_session, num_classes, image, topk_candidates=1000): - - output_name = get_output_name(onnx_session) - - image, ratio_h, ratio_w = transform(image) - image = image.astype(np.float32) - image = np.expand_dims(image.transpose((2, 0, 1)), 0) - - scores, boxes = onnx_session.run(output_name, input_feed={"input": image}) - - keep = scores.max(axis=1) > 0.1 - scores = scores[keep] - boxes = boxes[keep] - - scores = scores.flatten() - # Keep top k top scoring indices only. - num_topk = min(topk_candidates, len(boxes)) - # torch.sort is actually faster than .topk (at least on GPUs) - topk_idxs = np.argsort(scores) - - scores = scores[topk_idxs][-num_topk:] - topk_idxs = topk_idxs[-num_topk:] - - # filter out the proposals with low confidence score - shift_idxs = topk_idxs // num_classes - classes = topk_idxs % num_classes - boxes = boxes[shift_idxs] - - boxes[:, 0] /= ratio_w - boxes[:, 1] /= ratio_h - boxes[:, 2] /= ratio_w - boxes[:, 3] /= ratio_h - - return boxes, scores, classes - - -def run(onnx_session, image, class_names, score_thrs, nms_thr=0.6): - num_classes = len(class_names) - import time - t0 = time.time() - boxes, scores, cls_idxs = onnx_inference(onnx_session, num_classes, image) - cost = time.time() - t0 - logger.info(f'memd inference: {cost}s') - - assert len(boxes) == len(scores) and len(boxes) == len(cls_idxs) - - if isinstance(score_thrs, float): - keep = scores > max(score_thrs, 0.2) - else: - score_thrs = np.asarray(score_thrs) - keep = scores > np.maximum(score_thrs[cls_idxs], 0.2) - - pred_boxes = np.concatenate( - [boxes, scores[:, np.newaxis], cls_idxs[:, np.newaxis]], axis=1) - pred_boxes = pred_boxes[keep] - - all_boxes = [] - for cls_idx in range(len(class_names)): - keep_per_cls = pred_boxes[:, -1] == cls_idx - if keep_per_cls.sum() > 0: - pred_boxes_per_cls = pred_boxes[keep_per_cls].astype(np.float32) - keep_idx = raw_nms(pred_boxes_per_cls[:, :5], nms_thr) - for idx in keep_idx: - all_boxes.append(pred_boxes_per_cls[idx]) - return all_boxes diff --git a/flow-python/examples/warehouse/detection_memd/requirements.txt b/flow-python/examples/warehouse/detection_memd/requirements.txt deleted file mode 100644 index 2f8c997..0000000 --- a/flow-python/examples/warehouse/detection_memd/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -onnxruntime-gpu==1.2.0 -opencv-python -numpy -loguru -Cython \ No newline at end of file diff --git a/flow-python/examples/warehouse/detection_yolox/README.md b/flow-python/examples/warehouse/detection_yolox/README.md deleted file mode 100644 index daf59ca..0000000 --- a/flow-python/examples/warehouse/detection_yolox/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# YOLOX-Python-MegEngine - -Python version of YOLOX object detection base on [MegEngine](https://github.com/MegEngine/MegEngine). - -## Tutorial - -### Step1: install requirements - -``` -python3 -m pip install megengine -f https://megengine.org.cn/whl/mge.html -``` - -### Step2: convert checkpoint weights from torch's path file - -``` -python3 convert_weights.py -w yolox_s.pth -o yolox_s_mge.pkl -``` - -### Step3: run demo - -This part is the same as torch's python demo, but no need to specify device. - -``` -python3 lite.py image -n yolox-s -c yolox_s_mge.pkl --path ../../../assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result -``` - -### [Optional]Step4: dump model for cpp inference - -> **Note**: result model is dumped with `optimize_for_inference` and `enable_fuse_conv_bias_nonlinearity`. - -``` -python3 tools/dump.py -n yolox-s -c yolox_s_mge.pkl --dump_path yolox_s.mge -``` diff --git a/flow-python/examples/warehouse/detection_yolox/__init__.py b/flow-python/examples/warehouse/detection_yolox/__init__.py deleted file mode 100644 index dce1601..0000000 --- a/flow-python/examples/warehouse/detection_yolox/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .lite import PredictorLite diff --git a/flow-python/examples/warehouse/detection_yolox/coco_classes.py b/flow-python/examples/warehouse/detection_yolox/coco_classes.py deleted file mode 100644 index 17f5cbe..0000000 --- a/flow-python/examples/warehouse/detection_yolox/coco_classes.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- -# Copyright (c) Megvii, Inc. and its affiliates. - -COCO_CLASSES = ( - "person", - "bicycle", - "car", - "motorcycle", - "airplane", - "bus", - "train", - "truck", - "boat", - "traffic light", - "fire hydrant", - "stop sign", - "parking meter", - "bench", - "bird", - "cat", - "dog", - "horse", - "sheep", - "cow", - "elephant", - "bear", - "zebra", - "giraffe", - "backpack", - "umbrella", - "handbag", - "tie", - "suitcase", - "frisbee", - "skis", - "snowboard", - "sports ball", - "kite", - "baseball bat", - "baseball glove", - "skateboard", - "surfboard", - "tennis racket", - "bottle", - "wine glass", - "cup", - "fork", - "knife", - "spoon", - "bowl", - "banana", - "apple", - "sandwich", - "orange", - "broccoli", - "carrot", - "hot dog", - "pizza", - "donut", - "cake", - "chair", - "couch", - "potted plant", - "bed", - "dining table", - "toilet", - "tv", - "laptop", - "mouse", - "remote", - "keyboard", - "cell phone", - "microwave", - "oven", - "toaster", - "sink", - "refrigerator", - "book", - "clock", - "vase", - "scissors", - "teddy bear", - "hair drier", - "toothbrush", -) diff --git a/flow-python/examples/warehouse/detection_yolox/lite.py b/flow-python/examples/warehouse/detection_yolox/lite.py deleted file mode 100644 index 4136d07..0000000 --- a/flow-python/examples/warehouse/detection_yolox/lite.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- -# Copyright (c) Megvii, Inc. and its affiliates. - -import argparse -import os -import time - -import cv2 -import megenginelite as mgelite -from loguru import logger - -from .coco_classes import COCO_CLASSES -from .process import postprocess, postprocess_ndarray, preprocess -from .visualize import vis -import numpy as np - -IMAGE_EXT = [".jpg", ".jpeg", ".webp", ".bmp", ".png"] - - -def make_parser(): - parser = argparse.ArgumentParser("YOLOX Demo!") - parser.add_argument("-n", - "--name", - type=str, - default="yolox-s", - help="model name") - parser.add_argument("--path", - default="./test.png", - help="path to images or video") - - parser.add_argument("-c", - "--ckpt", - default=None, - type=str, - help="ckpt for eval") - parser.add_argument("--conf", default=None, type=float, help="test conf") - parser.add_argument("--nms", - default=None, - type=float, - help="test nms threshold") - parser.add_argument("--tsize", - default=None, - type=int, - help="test img size") - return parser - - -def get_image_list(path): - image_names = [] - for maindir, _, file_name_list in os.walk(path): - for filename in file_name_list: - apath = os.path.join(maindir, filename) - ext = os.path.splitext(apath)[1] - if ext in IMAGE_EXT: - image_names.append(apath) - return image_names - - -class PredictorLite(object): - def __init__( - self, - path, - confthre=0.01, - nmsthre=0.65, - test_size=(640, 640), - cls_names=COCO_CLASSES, - trt_file=None, - decoder=None, - device="gpu", - device_id=0, - ): - - if "gpu" in device.lower(): - device_type = mgelite.LiteDeviceType.LITE_CUDA - else: - device_type = mgelite.LiteDeviceType.LITE_CPU - - net_config = mgelite.LiteConfig(device_type=device_type) - ios = mgelite.LiteNetworkIO() - ios.add_input(mgelite.LiteIO("data", is_host=True)) - # ios.add_input(LiteIO("idx", is_host=True)) - # ios.add_input(LiteIO("roi", is_host=True)) - - net = mgelite.LiteNetwork(config=net_config, io=ios) - net.device_id = device_id - net.load(path) - - self.net = net - self.device = device - self.cls_names = cls_names - self.decoder = decoder - self.num_classes = 80 - self.confthre = confthre - self.nmsthre = nmsthre - self.test_size = test_size - self.rgb_means = (0.485, 0.456, 0.406) - self.std = (0.229, 0.224, 0.225) - - def lite_postprocess(self, outputs, img_size, p6=False): - grids = [] - expanded_strides = [] - - if not p6: - strides = [8, 16, 32] - else: - strides = [8, 16, 32, 64] - - hsizes = [img_size[0] // stride for stride in strides] - wsizes = [img_size[1] // stride for stride in strides] - - for hsize, wsize, stride in zip(hsizes, wsizes, strides): - xv, yv = np.meshgrid(np.arange(wsize), np.arange(hsize)) - grid = np.stack((xv, yv), 2).reshape(1, -1, 2) - grids.append(grid) - shape = grid.shape[:2] - expanded_strides.append(np.full((*shape, 1), stride)) - - grids = np.concatenate(grids, 1) - expanded_strides = np.concatenate(expanded_strides, 1) - outputs[..., :2] = (outputs[..., :2] + grids) * expanded_strides - outputs[..., 2:4] = np.exp(outputs[..., 2:4]) * expanded_strides - - return outputs - - def restrict(self, val, min, max): - assert (min < max) - if val < min: - val = min - if val > max: - val = max - return val - - def inference(self, img): - t0 = time.time() - - (max_h, max_w, _) = img.shape - - # preprocess - img, ratio = preprocess(img, self.test_size, self.rgb_means, self.std) - - # build input tensor - data = img[np.newaxis, :] - inp_data = self.net.get_io_tensor("data") - inp_data.set_data_by_copy(data) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - outputs = self.net.get_io_tensor(output_keys[0]).to_numpy() - - outputs = self.lite_postprocess(outputs[0], list(self.test_size)) - outputs = outputs[np.newaxis, :] - - bboxes = postprocess_ndarray(outputs, self.num_classes, self.confthre, - self.nmsthre) - if bboxes is None: - return None - for i in range(len(bboxes)): - bbox = bboxes[i][0:4] / ratio - bbox[0] = self.restrict(bbox[0], 0, max_w) - bbox[1] = self.restrict(bbox[1], 0, max_h) - bbox[2] = self.restrict(bbox[2], bbox[0], max_w) - bbox[3] = self.restrict(bbox[3], bbox[1], max_h) - bboxes[i][0:4] = bbox - - logger.debug("YOLOX infer time: {:.4f}s".format(time.time() - t0)) - return np.array(bboxes) - - def visual(self, output, img, cls_conf=0.35): - if output is None: - return img - - # preprocessing: resize - bboxes = output[:, 0:4] - cls = output[:, 6] - scores = output[:, 4] * output[:, 5] - - vis_res = vis(img, bboxes, scores, cls, cls_conf, self.cls_names) - return vis_res - - -def main(args): - dirname = os.path.join("./yolox_outputs", args.name) - os.makedirs(dirname, exist_ok=True) - - confthre = 0.01 - nmsthre = 0.65 - test_size = (640, 640) - if args.conf is not None: - confthre = args.conf - if args.nms is not None: - nmsthre = args.nms - if args.tsize is not None: - test_size = (args.tsize, args.tsize) - - predictor = PredictorLite(args.ckpt, confthre, nmsthre, test_size, - COCO_CLASSES, None, None, "gpu", 0) - - frame = cv2.imread(args.path) - outputs = predictor.inference(frame) - result_frame = predictor.visual(outputs, frame) - - filename = os.path.join(dirname, "out.jpg") - cv2.imwrite(filename, result_frame) - - -if __name__ == "__main__": - args = make_parser().parse_args() - main(args) diff --git a/flow-python/examples/warehouse/detection_yolox/process.py b/flow-python/examples/warehouse/detection_yolox/process.py deleted file mode 100644 index a265657..0000000 --- a/flow-python/examples/warehouse/detection_yolox/process.py +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- -# Copyright (c) 2014-2021 Megvii Inc. All rights reserved. - -import cv2 -import megengine.functional as F -import numpy as np - -__all__ = [ - "preprocess", - "postprocess", -] - - -def is_overlap_v1(rect1, rect2, iou_threshold): - xx1 = max(rect1[0], rect2[0]) - yy1 = max(rect1[1], rect2[1]) - xx2 = min(rect1[2], rect2[2]) - yy2 = min(rect1[3], rect2[3]) - dx = max(0, xx2 - xx1 + 1) - dy = max(0, yy2 - yy1 + 1) - i = dx * dy - u = (rect1[2] - rect1[0] + 1) * (rect1[3] - rect1[1] + 1) + ( - rect2[2] - rect2[0] + 1) * (rect2[3] - rect2[1] + 1) - i - ov = i / u - return ov >= iou_threshold - - -def cpu_nms(boxes, iou_threshold=0.3): - if 0 == len(boxes): - return [] - rects = list(boxes) - rects.sort(key=lambda x: x[4] * x[5], reverse=True) - - rect_valid = [True for i in range(len(rects))] - for i in range(len(rects)): - if rect_valid[i]: - j = i + 1 - while j < len(rect_valid): - if is_overlap_v1(rects[i], rects[j], iou_threshold): - rect_valid[j] = False - j = j + 1 - - return [x for i, x in enumerate(rects) if rect_valid[i]] - - -def preprocess(image, input_size, mean, std, swap=(2, 0, 1)): - # print(f'{image.shape}') - if len(image.shape) == 3: - padded_img = np.ones((input_size[0], input_size[1], 3)) * 114.0 - else: - padded_img = np.ones(input_size) * 114.0 - img = np.array(image) - r = min(input_size[0] / img.shape[0], input_size[1] / img.shape[1]) - resized_img = cv2.resize( - img, - (int(img.shape[1] * r), int(img.shape[0] * r)), - interpolation=cv2.INTER_LINEAR, - ).astype(np.float32) - padded_img[:int(img.shape[0] * r), :int(img.shape[1] * r)] = resized_img - image = padded_img - - image = image.astype(np.float32) - image = image[:, :, ::-1] - image /= 255.0 - if mean is not None: - image -= mean - if std is not None: - image /= std - image = image.transpose(swap) - image = np.ascontiguousarray(image, dtype=np.float32) - return image, r - - -def argmax_keepdims(x, axis): - output_shape = list(x.shape) - output_shape[axis] = 1 - return np.argmax(x, axis=axis).reshape(output_shape) - - -def postprocess_ndarray(prediction, num_classes, conf_thre=0.7, nms_thre=0.45): - box_corner = np.zeros_like(prediction) - box_corner[:, :, 0] = prediction[:, :, 0] - prediction[:, :, 2] / 2 - box_corner[:, :, 1] = prediction[:, :, 1] - prediction[:, :, 3] / 2 - box_corner[:, :, 2] = prediction[:, :, 0] + prediction[:, :, 2] / 2 - box_corner[:, :, 3] = prediction[:, :, 1] + prediction[:, :, 3] / 2 - prediction[:, :, :4] = box_corner[:, :, :4] - - output = [None for _ in range(len(prediction))] - for i, image_pred in enumerate(prediction): - - # If none are remaining => process next image - if not image_pred.shape[0]: - continue - # Get score and class with highest confidence - class_conf = np.max(image_pred[:, 5:5 + num_classes], 1, keepdims=True) - - class_pred = argmax_keepdims(image_pred[:, 5:5 + num_classes], 1) - - class_conf_squeeze = np.squeeze(class_conf) - - conf_mask = image_pred[:, 4] * class_conf_squeeze >= conf_thre - detections = np.concatenate( - (image_pred[:, :5], class_conf, class_pred), 1) - detections = detections[conf_mask] - if not detections.shape[0]: - continue - - detections = cpu_nms(detections, nms_thre) - - if output[i] is None: - output[i] = detections - else: - output[i] = np.concatenate((output[i], detections)) - - if output[0] is not None: - return output[0] - return None - - -def postprocess(prediction, num_classes, conf_thre=0.7, nms_thre=0.45): - box_corner = F.zeros_like(prediction) - box_corner[:, :, 0] = prediction[:, :, 0] - prediction[:, :, 2] / 2 - box_corner[:, :, 1] = prediction[:, :, 1] - prediction[:, :, 3] / 2 - box_corner[:, :, 2] = prediction[:, :, 0] + prediction[:, :, 2] / 2 - box_corner[:, :, 3] = prediction[:, :, 1] + prediction[:, :, 3] / 2 - prediction[:, :, :4] = box_corner[:, :, :4] - - output = [None for _ in range(len(prediction))] - for i, image_pred in enumerate(prediction): - - # If none are remaining => process next image - if not image_pred.shape[0]: - continue - # Get score and class with highest confidence - class_conf = F.max(image_pred[:, 5:5 + num_classes], 1, keepdims=True) - class_pred = F.argmax(image_pred[:, 5:5 + num_classes], - 1, - keepdims=True) - - class_conf_squeeze = F.squeeze(class_conf) - conf_mask = image_pred[:, 4] * class_conf_squeeze >= conf_thre - detections = F.concat((image_pred[:, :5], class_conf, class_pred), 1) - detections = detections[conf_mask] - if not detections.shape[0]: - continue - - nms_out_index = F.vision.nms( - detections[:, :4], - detections[:, 4] * detections[:, 5], - nms_thre, - ) - detections = detections[nms_out_index] - if output[i] is None: - output[i] = detections - else: - output[i] = F.concat((output[i], detections)) - - if output[0] is not None: - return output[0].numpy() - return None diff --git a/flow-python/examples/warehouse/detection_yolox/visualize.py b/flow-python/examples/warehouse/detection_yolox/visualize.py deleted file mode 100644 index 257cc07..0000000 --- a/flow-python/examples/warehouse/detection_yolox/visualize.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- -# Copyright (c) 2014-2021 Megvii Inc. All rights reserved. - -import cv2 -import numpy as np - -__all__ = ["vis"] - - -def vis(img, boxes, scores, cls_ids, conf=0.5, class_names=None): - - for i in range(len(boxes)): - box = boxes[i] - cls_id = int(cls_ids[i]) - score = scores[i] - if score < conf: - continue - x0 = int(box[0]) - y0 = int(box[1]) - x1 = int(box[2]) - y1 = int(box[3]) - - color = (_COLORS[cls_id] * 255).astype(np.uint8).tolist() - text = '{}:{:.1f}%'.format(class_names[cls_id], score * 100) - txt_color = (0, 0, 0) if np.mean(_COLORS[cls_id]) > 0.5 else (255, 255, - 255) - font = cv2.FONT_HERSHEY_SIMPLEX - - txt_size = cv2.getTextSize(text, font, 0.4, 1)[0] - cv2.rectangle(img, (x0, y0), (x1, y1), color, 2) - - txt_bk_color = (_COLORS[cls_id] * 255 * 0.7).astype(np.uint8).tolist() - cv2.rectangle(img, (x0, y0 + 1), - (x0 + txt_size[0] + 1, y0 + int(1.5 * txt_size[1])), - txt_bk_color, -1) - cv2.putText(img, - text, (x0, y0 + txt_size[1]), - font, - 0.4, - txt_color, - thickness=1) - - return img - - -_COLORS = np.array([ - 0.000, 0.447, 0.741, 0.850, 0.325, 0.098, 0.929, 0.694, 0.125, 0.494, - 0.184, 0.556, 0.466, 0.674, 0.188, 0.301, 0.745, 0.933, 0.635, 0.078, - 0.184, 0.300, 0.300, 0.300, 0.600, 0.600, 0.600, 1.000, 0.000, 0.000, - 1.000, 0.500, 0.000, 0.749, 0.749, 0.000, 0.000, 1.000, 0.000, 0.000, - 0.000, 1.000, 0.667, 0.000, 1.000, 0.333, 0.333, 0.000, 0.333, 0.667, - 0.000, 0.333, 1.000, 0.000, 0.667, 0.333, 0.000, 0.667, 0.667, 0.000, - 0.667, 1.000, 0.000, 1.000, 0.333, 0.000, 1.000, 0.667, 0.000, 1.000, - 1.000, 0.000, 0.000, 0.333, 0.500, 0.000, 0.667, 0.500, 0.000, 1.000, - 0.500, 0.333, 0.000, 0.500, 0.333, 0.333, 0.500, 0.333, 0.667, 0.500, - 0.333, 1.000, 0.500, 0.667, 0.000, 0.500, 0.667, 0.333, 0.500, 0.667, - 0.667, 0.500, 0.667, 1.000, 0.500, 1.000, 0.000, 0.500, 1.000, 0.333, - 0.500, 1.000, 0.667, 0.500, 1.000, 1.000, 0.500, 0.000, 0.333, 1.000, - 0.000, 0.667, 1.000, 0.000, 1.000, 1.000, 0.333, 0.000, 1.000, 0.333, - 0.333, 1.000, 0.333, 0.667, 1.000, 0.333, 1.000, 1.000, 0.667, 0.000, - 1.000, 0.667, 0.333, 1.000, 0.667, 0.667, 1.000, 0.667, 1.000, 1.000, - 1.000, 0.000, 1.000, 1.000, 0.333, 1.000, 1.000, 0.667, 1.000, 0.333, - 0.000, 0.000, 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, - 0.000, 1.000, 0.000, 0.000, 0.000, 0.167, 0.000, 0.000, 0.333, 0.000, - 0.000, 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, 0.000, - 1.000, 0.000, 0.000, 0.000, 0.167, 0.000, 0.000, 0.333, 0.000, 0.000, - 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, 0.000, 1.000, - 0.000, 0.000, 0.000, 0.143, 0.143, 0.143, 0.286, 0.286, 0.286, 0.429, - 0.429, 0.429, 0.571, 0.571, 0.571, 0.714, 0.714, 0.714, 0.857, 0.857, - 0.857, 0.000, 0.447, 0.741, 0.314, 0.717, 0.741, 0.50, 0.5, 0 -]).astype(np.float32).reshape(-1, 3) diff --git a/flow-python/examples/warehouse/quality_naive/__init__.py b/flow-python/examples/warehouse/quality_naive/__init__.py deleted file mode 100644 index c90acbc..0000000 --- a/flow-python/examples/warehouse/quality_naive/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .quality import Quality diff --git a/flow-python/examples/warehouse/quality_naive/quality.py b/flow-python/examples/warehouse/quality_naive/quality.py deleted file mode 100644 index 4c2a090..0000000 --- a/flow-python/examples/warehouse/quality_naive/quality.py +++ /dev/null @@ -1,31 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import cv2 - - -class Quality: - @staticmethod - def clearness(mat): - return cv2.Laplacian(mat, cv2.CV_64F).var() - - @staticmethod - def area(mat): - return mat.shape[0] * mat.shape[1] - - -if __name__ == "__main__": - import sys - mat = cv2.imread(sys.argv[1]) - if mat is None: - print(f'load {sys.argv[1]} failed') - sys.exit(-1) - print(f'brightness: {Quality.clearness(mat)}') diff --git a/flow-python/examples/warehouse/reid_alignedreid/README.md b/flow-python/examples/warehouse/reid_alignedreid/README.md deleted file mode 100644 index e465214..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# How to test AlignedReid Model - -Download models and soft link -```bash -$ ln -s ${DOWNLOAD_DIR} flow-python/examples/models -``` - -Run - -```bash -$ cd flow-python/examples/warehouse -$ python3 -m reid_alignedreid.main ../models/aligned_reid.pkl reid_alignedreid/image/positive1.jpg reid_alignedreid/image/positive2.jpg reid_alignedreid/image/negative.jpg - -10 19:07:09 WRN Unused params in `strict=False` mode, unused={'local_bn.bias', 'fc.weight', 'local_bn.running_mean', 'local_bn.running_var', 'local_conv.weight', 'local_conv.bias', 'fc.bias', 'local_bn.weight'} -distance_positive: 0.0987139493227005 -distance_negtive: 0.2990190088748932 -``` diff --git a/flow-python/examples/warehouse/reid_alignedreid/__init__.py b/flow-python/examples/warehouse/reid_alignedreid/__init__.py deleted file mode 100644 index 184c72c..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -# from .model import Model -from .lite import PredictorLite diff --git a/flow-python/examples/warehouse/reid_alignedreid/dump.py b/flow-python/examples/warehouse/reid_alignedreid/dump.py deleted file mode 100644 index fe80c21..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/dump.py +++ /dev/null @@ -1,62 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import argparse -import megengine as mge -import numpy as np -from megengine import jit -from .model import Model - - -def make_parser(): - parser = argparse.ArgumentParser("Resnet50 Dump") - parser.add_argument("-c", - "--ckpt", - default=None, - type=str, - help="ckpt for eval") - parser.add_argument("--dump_path", - default="model.mge", - help="path to save the dumped model") - return parser - - -def dump_static_graph(model, graph_name="model.mge"): - model.eval() - - data = mge.Tensor(np.random.random((1, 3, 224, 224))) - - @jit.trace(capture_as_const=True) - def pred_func(data): - outputs = model(data) - return outputs - - pred_func(data) - pred_func.dump( - graph_name, - arg_names=["data"], - optimize_for_inference=True, - enable_fuse_conv_bias_nonlinearity=True, - ) - - -def main(args): - model = Model() - sd = mge.load(args.ckpt) - model.load_state_dict(sd, strict=False) - model.eval() - - dump_static_graph(model, args.dump_path) - - -if __name__ == "__main__": - args = make_parser().parse_args() - main(args) diff --git a/flow-python/examples/warehouse/reid_alignedreid/image/badcase_tiger.jpg b/flow-python/examples/warehouse/reid_alignedreid/image/badcase_tiger.jpg deleted file mode 100644 index a9d4d420a71fa16759f26cc92c050e02efa7c73b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71406 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 AzyJUM diff --git a/flow-python/examples/warehouse/reid_alignedreid/image/pinggai_1.jpg b/flow-python/examples/warehouse/reid_alignedreid/image/pinggai_1.jpg deleted file mode 100644 index fcb80d456e522ae54eec317f8267c650558052b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12426 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 diff --git a/flow-python/examples/warehouse/reid_alignedreid/image/positive2.jpg b/flow-python/examples/warehouse/reid_alignedreid/image/positive2.jpg deleted file mode 100644 index e366aa43cfc0f4acc504638344ba5fe6097aacd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184795 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î~edAWXt8!toJX7q0yf{=cVI=4gg5^pVG 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 diff --git a/flow-python/examples/warehouse/reid_alignedreid/lite.py b/flow-python/examples/warehouse/reid_alignedreid/lite.py deleted file mode 100644 index 9ff523c..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/lite.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- -# Copyright (c) Megvii, Inc. and its affiliates. - -# import argparse -# import os -import time - -import cv2 -import megenginelite as mgelite -from .process import preprocess -from loguru import logger -import numpy as np - - -class PredictorLite(object): - def __init__( - self, - path, - device="gpu", - device_id=0, - ): - - if "gpu" in device.lower(): - device_type = mgelite.LiteDeviceType.LITE_CUDA - else: - device_type = mgelite.LiteDeviceType.LITE_CPU - - net_config = mgelite.LiteConfig(device_type=device_type) - ios = mgelite.LiteNetworkIO() - ios.add_input(mgelite.LiteIO("data", is_host=True)) - - net = mgelite.LiteNetwork(config=net_config, io=ios) - net.device_id = device_id - net.load(path) - - self.net = net - - def inference(self, mat): - t0 = time.time() - - img = preprocess(mat, - input_size=(224, 224), - scale_im=True, - mean=[0.486, 0.459, 0.408], - std=[0.229, 0.224, 0.225]) - - # build input tensor - data = img[np.newaxis, :] - inp_data = self.net.get_io_tensor("data") - inp_data.set_data_by_copy(data) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - output = self.net.get_io_tensor(output_keys[0]).to_numpy() - logger.debug("ReID infer time: {:.4f}s".format(time.time() - t0)) - return output - - -if __name__ == "__main__": - import sys - predictor = PredictorLite(sys.argv[1]) - img2 = cv2.imread(sys.argv[2]) - output2 = predictor.inference(img2) - - img3 = cv2.imread(sys.argv[3]) - output3 = predictor.inference(img3) - - img4 = cv2.imread(sys.argv[4]) - output4 = predictor.inference(img4) - - positive = np.linalg.norm(output2 - output3) - print(f'distance_positive: {positive}') - - negative = np.linalg.norm(output3 - output4) - print(f'distance_positive: {negative}') diff --git a/flow-python/examples/warehouse/reid_alignedreid/main.py b/flow-python/examples/warehouse/reid_alignedreid/main.py deleted file mode 100644 index 29ef721..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/main.py +++ /dev/null @@ -1,44 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from math import log -from loguru import logger -import megengine as mge -import cv2 -import megengine.functional as F -import numpy as np - -from .model import Model - -if __name__ == "__main__": - import sys - if len(sys.argv) < 5: - print( - "usage: python3 -m reid_alignedreid/demo reid.pkl positive1.png positive2.png negtive.jpg" - ) - sys.exit(0) - model = Model() - sd = mge.load(sys.argv[1]) - model.load_state_dict(sd, strict=False) - model.eval() - feat1 = model.inference(cv2.imread(sys.argv[2])) - logger.info(f'{feat1}') - feat2 = model.inference(cv2.imread(sys.argv[3])) - logger.info(f'{feat2}') - - feat3 = model.inference(cv2.imread(sys.argv[4])) - logger.info(f'{feat3}') - - positive = np.linalg.norm(feat1 - feat2) - print(f'distance_positive: {positive}') - - negtive = np.linalg.norm(feat3 - feat2) - print(f'distance_negtive: {negtive}') diff --git a/flow-python/examples/warehouse/reid_alignedreid/model.py b/flow-python/examples/warehouse/reid_alignedreid/model.py deleted file mode 100644 index 4bfe74c..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/model.py +++ /dev/null @@ -1,54 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import megengine as mge -import megengine.module as nn -import megengine.module.init as init -import megengine.functional as F -import time -from loguru import logger - -from .resnet import resnet50, resnet18 -from .process import preprocess - - -class Model(nn.Module): - def __init__(self): - super(Model, self).__init__() - self.base = resnet50() - # planes = 2048 - - def forward(self, x): - """ - Returns: - global_feat: shape [N, C] - local_feat: shape [N, H, c] - """ - # shape [N, C, H, W] - feat = self.base(x) - feat = F.avg_pool2d(feat, (feat.shape[2], feat.shape[3])) - # shape [N, C] - feat = F.flatten(feat, 1) - feat = F.normalize(feat, axis=1) - return feat - - def inference(self, mat): - t0 = time.time() - img = preprocess(mat, - input_size=(224, 224), - scale_im=True, - mean=[0.486, 0.459, 0.408], - std=[0.229, 0.224, 0.225]) - img = F.expand_dims(mge.tensor(img), 0) - feat = self.forward(img) - logger.info("AlignedReID infer time: {:.4f}s".format(time.time() - t0)) - - return feat[0].numpy() diff --git a/flow-python/examples/warehouse/reid_alignedreid/process.py b/flow-python/examples/warehouse/reid_alignedreid/process.py deleted file mode 100644 index 835ce24..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/process.py +++ /dev/null @@ -1,35 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python3 -# -*- coding:utf-8 -*- - -import cv2 -import megengine.functional as F -import numpy as np -from loguru import logger - -__all__ = ["preprocess"] - - -def preprocess(image, input_size, scale_im, mean, std, swap=(2, 0, 1)): - if image is None: - logger.error("image is None") - return image - image = cv2.resize(image, input_size) - image = image.astype(np.float32) - image = image[:, :, ::-1] - if scale_im: - image /= 255.0 - if mean is not None: - image -= mean - if std is not None: - image /= std - image = image.transpose(swap) - image = np.ascontiguousarray(image, dtype=np.float32) - return image diff --git a/flow-python/examples/warehouse/reid_alignedreid/resnet.py b/flow-python/examples/warehouse/reid_alignedreid/resnet.py deleted file mode 100644 index 90cc355..0000000 --- a/flow-python/examples/warehouse/reid_alignedreid/resnet.py +++ /dev/null @@ -1,220 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import megengine.module as nn -import math - -__all__ = [ - 'ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' -] - - -def conv3x3(in_planes, out_planes, stride=1): - """3x3 convolution with padding""" - return nn.Conv2d(in_planes, - out_planes, - kernel_size=3, - stride=stride, - padding=1, - bias=False) - - -class BasicBlock(nn.Module): - expansion = 1 - - def __init__(self, inplanes, planes, stride=1, downsample=None): - super(BasicBlock, self).__init__() - self.conv1 = conv3x3(inplanes, planes, stride) - self.bn1 = nn.BatchNorm2d(planes) - self.relu = nn.ReLU() - self.conv2 = conv3x3(planes, planes) - self.bn2 = nn.BatchNorm2d(planes) - self.downsample = downsample - self.stride = stride - - def forward(self, x): - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - - if self.downsample is not None: - residual = self.downsample(x) - - out += residual - out = self.relu(out) - - return out - - -class Bottleneck(nn.Module): - expansion = 4 - - def __init__(self, inplanes, planes, stride=1, downsample=None): - super(Bottleneck, self).__init__() - self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) - self.bn1 = nn.BatchNorm2d(planes) - self.conv2 = nn.Conv2d(planes, - planes, - kernel_size=3, - stride=stride, - padding=1, - bias=False) - self.bn2 = nn.BatchNorm2d(planes) - self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) - self.bn3 = nn.BatchNorm2d(planes * 4) - self.relu = nn.ReLU() - self.downsample = downsample - self.stride = stride - - def forward(self, x): - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - out = self.relu(out) - - out = self.conv3(out) - out = self.bn3(out) - - if self.downsample is not None: - residual = self.downsample(x) - - out += residual - out = self.relu(out) - - return out - - -class ResNet(nn.Module): - def __init__(self, block, layers): - self.inplanes = 64 - super(ResNet, self).__init__() - self.conv1 = nn.Conv2d(3, - 64, - kernel_size=7, - stride=2, - padding=3, - bias=False) - self.bn1 = nn.BatchNorm2d(64) - self.relu = nn.ReLU() - self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) - self.layer1 = self._make_layer(block, 64, layers[0]) - self.layer2 = self._make_layer(block, 128, layers[1], stride=2) - self.layer3 = self._make_layer(block, 256, layers[2], stride=2) - self.layer4 = self._make_layer(block, 512, layers[3], stride=2) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels - nn.init.uniform_(m.weight, 0, math.sqrt(2. / n)) - elif isinstance(m, nn.BatchNorm2d): - nn.init.ones_(m.weight) - nn.init.zeros_(m.bias) - - def _make_layer(self, block, planes, blocks, stride=1): - downsample = None - if stride != 1 or self.inplanes != planes * block.expansion: - downsample = nn.Sequential( - nn.Conv2d(self.inplanes, - planes * block.expansion, - kernel_size=1, - stride=stride, - bias=False), - nn.BatchNorm2d(planes * block.expansion), - ) - - layers = [] - layers.append(block(self.inplanes, planes, stride, downsample)) - self.inplanes = planes * block.expansion - for i in range(1, blocks): - layers.append(block(self.inplanes, planes)) - - return nn.Sequential(*layers) - - def forward(self, x): - x = self.conv1(x) - x = self.bn1(x) - x = self.relu(x) - x = self.maxpool(x) - - x = self.layer1(x) - x = self.layer2(x) - x = self.layer3(x) - x = self.layer4(x) - - return x - - -def remove_fc(state_dict): - """Remove the fc layer parameters from state_dict.""" - for key in list(state_dict.keys()): - if key.startswith('fc.'): - del state_dict[key] - return state_dict - - -def resnet18(): - """Constructs a ResNet-18 model. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - """ - model = ResNet(BasicBlock, [2, 2, 2, 2]) - return model - - -def resnet34(): - """Constructs a ResNet-34 model. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - """ - model = ResNet(BasicBlock, [3, 4, 6, 3]) - return model - - -def resnet50(): - """Constructs a ResNet-50 model. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - """ - model = ResNet(Bottleneck, [3, 4, 6, 3]) - return model - - -def resnet101(): - """Constructs a ResNet-101 model. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - """ - model = ResNet(Bottleneck, [3, 4, 23, 3]) - return model - - -def resnet152(): - """Constructs a ResNet-152 model. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - """ - model = ResNet(Bottleneck, [3, 8, 36, 3]) - return model diff --git a/flow-python/examples/warehouse/track_iou/__init__.py b/flow-python/examples/warehouse/track_iou/__init__.py deleted file mode 100644 index 73676d0..0000000 --- a/flow-python/examples/warehouse/track_iou/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .track_iou import Tracker diff --git a/flow-python/examples/warehouse/track_iou/track_iou.py b/flow-python/examples/warehouse/track_iou/track_iou.py deleted file mode 100644 index 10d70f7..0000000 --- a/flow-python/examples/warehouse/track_iou/track_iou.py +++ /dev/null @@ -1,332 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from loguru import logger -import numpy as np -from scipy.optimize import linear_sum_assignment, leastsq - - -class CostGenerator: - def __init__(self): - self.linear_pred_funcs = [] - for _ in range(4): - self.linear_pred_funcs.append(LinearFunc()) - - def update(self, x, boxes): - y = np.array([bb['bbox'] for bb in boxes]) - for i in range(4): - self.linear_pred_funcs[i].update(x, y[:, i]) - - def predict(self, x): - linear_pred = np.zeros(4) - for i in range(4): - linear_pred[i] = self.linear_pred_funcs[i].predict(x) - return linear_pred - - def get_cost(self, x, det_box): - pred_box = self.predict(x) - return 1 - get_iou(pred_box, det_box['bbox']) - - -class Tracker: - ''' - Args: - detections (list): list of detections per frame - sigma_h (float): high detection threshold. - sigma_iou (float): IOU threshold. - t_min (float): minimum track length in frames. - m_tolerance (float): - * If the confidence of a track is below a threshold, the tracker will not be - * deleted at once, but hidden temporarily in the internal state of the - * tracker. Only after N consecutive frames in which the confidence scores are - * all below the threshold, will the track be deleted. Otherwise, the track - * will be resumed. - ''' - def __init__(self): - self.sigma_h = 0.05 - self.threshold = 0.8 - self.t_min_item = 1 - self.miss_tolerance = 4 - self.max_history_len = 6 - self.smooth_factor = 0.3 - self.frame_count = 0 - self.tracker_count = 0 - ''' - tracker: - keys = [boxes, frame_ids, cost_generator, - max_score, num_miss, num_valid] - boxes: list of boxes, in shape of [x1, y1, x2, y2, score] - ''' - self.trackers = dict() - - def set_args(self, **kwargs): - if "sigma_h" in kwargs: - self.sigma_h = kwargs["sigma_h"] - if "sigma_iou" in kwargs: - self.threshold = 1 - kwargs["sigma_iou"] - if "t_min_item" in kwargs: - self.t_min_item = kwargs["t_min_item"] - if "miss_tolerance" in kwargs: - self.miss_tolerance = kwargs["miss_tolerance"] - if "max_history_len" in kwargs: - self.max_history_len = kwargs["max_history_len"] - if "smooth_factor" in kwargs: - self.smooth_factor = kwargs["smooth_factor"] - - self.frame_count = 0 - self.tracker_count = 0 - self.trackers = dict() - - def _get_next_track_id(self): - self.tracker_count += 1 - return self.tracker_count - - def _get_results(self, use_smooth=True): - ret = [] - # logger.debug(f'track.internal: {self.trackers}') - for tracker_id, tracker in self.trackers.items(): - if tracker['num_valid'] < self.t_min_item or \ - tracker['max_score'] < self.sigma_h or \ - tracker['num_miss'] > 0: - continue - - if use_smooth and \ - len(tracker['frame_ids']) > 1 and \ - (tracker['frame_ids'][-1] - tracker['frame_ids'][-2] == 1): - boxes = np.array([bb['bbox'] for bb in tracker['boxes']]) - bbox = smooth_boxes(boxes, self.smooth_factor) - else: - bbox = tracker['boxes'][-1]['bbox'] - - ret.append(dict(tid=tracker_id, bbox=bbox)) - - return ret - - def _update_trackers(self, det_boxes): - failed_ids = [] - self.frame_count += 1 - - updated_tracker_ids = set() - matched_det_ids = set() - # Step 1: match tracker and det_boxes - if len(self.trackers) > 0: - # Step 1.1: generate cost matrix - list_tracker_id = list(self.trackers.keys()) - mat_cost = np.zeros([len(list_tracker_id), len(det_boxes)]) - for i, tracker_id in enumerate(list_tracker_id): - tracker = self.trackers[tracker_id] - min_frame_id = tracker['frame_ids'][0] - for j, det_box in enumerate(det_boxes): - mat_cost[i, j] = tracker['cost_generator'].get_cost( - self.frame_count - min_frame_id, det_box) - # Step 1.2: match cost with linear_sum_assignment - matched_row_idxes, matched_col_idxes = linear_sum_assignment( - mat_cost) - - for r, c in zip(matched_row_idxes, matched_col_idxes): - tracker_id = list_tracker_id[r] - matched_det_box = det_boxes[c] - - # Step 2: update matched trackers - if mat_cost[r, c] < self.threshold: - self.trackers[tracker_id]['boxes'].append(matched_det_box) - if len(self.trackers[tracker_id] - ['boxes']) > self.max_history_len: - self.trackers[tracker_id]['boxes'] = \ - self.trackers[tracker_id]['boxes'][-self.max_history_len:] - self.trackers[tracker_id]['frame_ids'].append( - self.frame_count) - if len(self.trackers[tracker_id] - ['frame_ids']) > self.max_history_len: - self.trackers[tracker_id]['frame_ids'] = \ - self.trackers[tracker_id]['frame_ids'][-self.max_history_len:] - - min_frame_id = self.trackers[tracker_id]['frame_ids'][0] - self.trackers[tracker_id]['cost_generator'].update( - np.array(self.trackers[tracker_id]['frame_ids']) - - min_frame_id, - np.array(self.trackers[tracker_id]['boxes'])) - - self.trackers[tracker_id]['num_miss'] = 0 - self.trackers[tracker_id]['max_score'] = \ - max(self.trackers[tracker_id]['max_score'], - matched_det_box['score']) - self.trackers[tracker_id]['num_valid'] += 1 - self.trackers[tracker_id]['num_item'] += 1 - - updated_tracker_ids.add(tracker_id) - matched_det_ids.add(c) - - # Step 2: update failed trackers - for tracker_id in list_tracker_id: - if tracker_id in updated_tracker_ids: - continue - self.trackers[tracker_id]['num_miss'] += 1 - - if self.trackers[tracker_id]['num_miss'] > self.miss_tolerance: - self.trackers.pop(tracker_id) - failed_ids.append(tracker_id) - - # Step 3: start new tracker - for i, det_box in enumerate(det_boxes): - if i in matched_det_ids: - continue - tracker_id = self._get_next_track_id() - self.trackers[tracker_id] = dict() - self.trackers[tracker_id]['boxes'] = [] - self.trackers[tracker_id]['boxes'].append(det_box) - self.trackers[tracker_id]['frame_ids'] = [] - self.trackers[tracker_id]['frame_ids'].append(self.frame_count) - self.trackers[tracker_id]['max_score'] = det_box['score'] - self.trackers[tracker_id]['num_miss'] = 0 - self.trackers[tracker_id]['num_valid'] = 1 - self.trackers[tracker_id]['num_item'] = 1 - self.trackers[tracker_id]['cost_generator'] = CostGenerator() - self.trackers[tracker_id]['cost_generator'].update( - np.array([0]), [ - det_box, - ]) - - # return finished track id - return failed_ids - - def track(self, det_boxes, use_smooth=True): - failed_ids = self._update_trackers(det_boxes) - return self._get_results(use_smooth), failed_ids - - -def get_iou(bbox1, bbox2): - """ - Calculates the intersection-over-union of two bounding boxes. - Args: - bbox1 (numpy.array, list of floats): bounding box in format x1, y1, x2, y2. - bbox2 (numpy.array, list of floats): bounding box in format x1, y1, x2, y2. - Returns: - int: intersection-over-onion of bbox1, bbox2 - """ - - x1_1, y1_1, x1_2, y1_2 = bbox1[:4] - x2_1, y2_1, x2_2, y2_2 = bbox2[:4] - - # get the overlap rectangle - overlap_x1 = max(x1_1, x2_1) - overlap_y1 = max(y1_1, y2_1) - overlap_x2 = min(x1_2, x2_2) - overlap_y2 = min(y1_2, y2_2) - - # check if there is an overlap - if overlap_x2 - overlap_x1 <= 0 or overlap_y2 - overlap_y1 <= 0: - return 0 - - # if yes, calculate the ratio of the overlap to each ROI size and the unified size - size_1 = (x1_2 - x1_1 + 1) * (y1_2 - y1_1 + 1) - size_2 = (x2_2 - x2_1 + 1) * (y2_2 - y2_1 + 1) - size_intersection = (overlap_x2 - overlap_x1 + 1) * (overlap_y2 - - overlap_y1 + 1) - size_union = size_1 + size_2 - size_intersection - - return size_intersection / size_union - - -def smooth_boxes(boxes, smooth_fatcor=0.3): - if len(boxes) > 1: - smoothed_box = [ - boxes[-2][0] * smooth_fatcor + boxes[-1][0] * (1 - smooth_fatcor), - boxes[-2][1] * smooth_fatcor + boxes[-1][1] * (1 - smooth_fatcor), - boxes[-2][2] * smooth_fatcor + boxes[-1][2] * (1 - smooth_fatcor), - boxes[-2][3] * smooth_fatcor + boxes[-1][3] * (1 - smooth_fatcor), - boxes[-1][-1], - ] - else: - smoothed_box = boxes[-1] - return smoothed_box - - -def linear_func(p, x): - k, b = p - return k * x + b - - -def linear_error(p, x, y): - return linear_func(p, x) - y - - -class LinearFunc: - def __init__(self): - self.param = (np.array([0, 0]), 0) - - def update(self, x, y): - if len(x) == 1: - self.param = (np.array([0, y[0]]), 0) - else: - self.param = leastsq(linear_error, self.param[0], args=(x, y)) - - def predict(self, x): - return linear_func(self.param[0], x) - - -if __name__ == "__main__": - - def build_test_input1(): - item1 = dict() - item1["bbox"] = np.array([10, 20, 300, 300]) - item1["score"] = 0.7 - item1["cls"] = int(15) - - item2 = dict() - item2["bbox"] = np.array([300, 300, 600, 600]) - item2["score"] = 0.8 - item2["cls"] = int(15) - - return [item1, item2] - - def build_test_input2(): - item1 = dict() - item1["bbox"] = np.array([60, 60, 360, 360]) - item1["score"] = 0.77 - item1["cls"] = int(15) - - item2 = dict() - item2["bbox"] = np.array([310, 310, 660, 660]) - item2["score"] = 0.88 - item2["cls"] = int(15) - - return [item1, item2] - - def build_test_input3(): - item1 = dict() - item1["bbox"] = np.array([60, 60, 360, 360]) - item1["score"] = 0.77 - item1["cls"] = int(15) - - return [item1] - - t = Tracker() - - set1 = build_test_input1() - for i in range(6): - t.track(set1) - - set6 = build_test_input2() - print(f'set6 result {t.track(set6)}') - - set7 = build_test_input2() - print(f'set7 result {t.track(set7)}') - - set8 = build_test_input3() - - # give failed_ids - for i in range(9): - print(f'set8 result {t.track(set8)}') - - # clean all - for i in range(10): - print(f'{t.track([])}') diff --git a/flow-python/gen_whl.sh b/flow-python/gen_whl.sh deleted file mode 100755 index fb109ee..0000000 --- a/flow-python/gen_whl.sh +++ /dev/null @@ -1,28 +0,0 @@ -# build py36~38 version -CONDA_BASE=$(conda info --base) -source $CONDA_BASE/etc/profile.d/conda.sh -conda activate py36 -cargo build --example run_with_plugins --release -cp ../target/release/examples/run_with_plugins ./megflow/run_with_plugins_inner -rm -rf ./build -py='py36' python3 setup.py bdist_wheel -p linux-x86_64 -d py36_dist - -conda activate py37 -cargo build --example run_with_plugins --release -cp ../target/release/examples/run_with_plugins ./megflow/run_with_plugins_inner -rm -rf ./build -py='py37' python3 setup.py bdist_wheel -p linux-x86_64 -d py37_dist - -conda activate py38 -cargo build --example run_with_plugins --release -cp ../target/release/examples/run_with_plugins ./megflow/run_with_plugins_inner -rm -rf ./build -py='py38' python3 setup.py bdist_wheel -p linux-x86_64 -d py38_dist - - -rm -rf dist -mkdir dist -cp py36_dist/megflow-0.1.0-py36-none-linux_x86_64.whl dist/ -cp py37_dist/megflow-0.1.0-py37-none-linux_x86_64.whl dist/ -cp py38_dist/megflow-0.1.0-py38-none-linux_x86_64.whl dist/ -rm -rf py36_dist py37_dist py38_dist diff --git a/flow-python/megflow/__init__.py b/flow-python/megflow/__init__.py deleted file mode 100644 index 315e39b..0000000 --- a/flow-python/megflow/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -from .registry import register, collect, res_register diff --git a/flow-python/megflow/command_line.py b/flow-python/megflow/command_line.py deleted file mode 100644 index 499ed18..0000000 --- a/flow-python/megflow/command_line.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -import sys -import subprocess -import pkg_resources -from find_libpython import find_libpython - - -def main(): - bin_exist = pkg_resources.resource_exists('megflow', 'run_with_plugins_inner') - if not bin_exist: - print('cannot find run_with_plugins, exit!') - sys.exit(-1) - bin_path = pkg_resources.resource_filename('megflow', 'run_with_plugins_inner') - - pylib_dir = os.path.dirname(find_libpython()) - - sys.argv[0] = bin_path - ret = subprocess.Popen(sys.argv, env={**os.environ, 'LD_LIBRARY_PATH': pylib_dir + ':' + os.environ['LD_LIBRARY_PATH']}) - ret.wait() - - -if __name__ == '__main__': - main() diff --git a/flow-python/megflow/registry.py b/flow-python/megflow/registry.py deleted file mode 100644 index 5007527..0000000 --- a/flow-python/megflow/registry.py +++ /dev/null @@ -1,69 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -from collections import Iterable - -def __register(name, inputs, outputs, exclusive, func): - params = {} - - params['name'] = name - params['code'] = func - params['inputs'] = inputs - params['outputs'] = outputs - params['exclusive'] = exclusive - - return params - - -def __res_register(name, func): - params = {} - params['name'] = name - params['code'] = func - - return params - - -__NODES_PLUGINS = 'nodes' -__RESOURCE_PLUGINS = 'resources' -__PLUGINS_DEFAULT = { - __NODES_PLUGINS: [], - __RESOURCE_PLUGINS: [], -} -_PLUGINS_REGISTRY = __PLUGINS_DEFAULT.copy() - -def register(name=None, inputs=[], outputs=[], exclusive=False): - def decorator(func): - nonlocal name - global _PLUGINS_REGISTRY - if name is None: - name = func.__name__ - _PLUGINS_REGISTRY[__NODES_PLUGINS].append(__register(name, inputs, outputs, exclusive, func)) - return func - - return decorator - - -def res_register(name=None): - def decorator(func): - nonlocal name - global _PLUGINS_REGISTRY - if name is None: - name = func.__name__ - _PLUGINS_REGISTRY[__RESOURCE_PLUGINS].append(__res_register(name, func)) - return func - - return decorator - - -def collect(): - global _PLUGINS_REGISTRY - plugins = _PLUGINS_REGISTRY.copy() - _PLUGINS_REGISTRY = __PLUGINS_DEFAULT.copy() - return plugins diff --git a/flow-python/requirements.txt b/flow-python/requirements.txt deleted file mode 100644 index 620c3af..0000000 --- a/flow-python/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -find-libpython diff --git a/flow-python/setup.py b/flow-python/setup.py deleted file mode 100644 index 2c70863..0000000 --- a/flow-python/setup.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 -import sys -import os - -from setuptools import setup - -devel_version = os.environ.get("DEVEL_VERSION") -if not devel_version: - devel_version = "0.1.0" # fall back - -py_version = sys.version_info - -if __name__ == '__main__': - setup( - options={ - 'bdist_wheel': { - 'python_tag': "py{}{}".format(py_version.major, - py_version.minor), - } - }, - name="megflow", - version=devel_version, - packages=["megflow"], - author="Megvii IPU-SDK Team", - author_email="megengine@megvii.com", - url="https://github.com/MegEngine/MegFlow", - include_package_data=True, - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Natural Language :: English', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Rust', - 'Programming Language :: Python :: {}.{}'.format( - py_version.major, py_version.minor), - 'Topic :: Software Development :: Libraries :: Application Frameworks', - 'Topic :: Scientific/Engineering', - 'Topic :: Scientific/Engineering :: Mathematics', - 'Topic :: Scientific/Engineering :: Artificial Intelligence', - 'Topic :: Software Development', - 'Topic :: Software Development :: Libraries', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - install_requires=open('requirements.txt').read().splitlines(), - package_data={"": ['run_with_plugins_inner']}, - entry_points={ - 'console_scripts':['run_with_plugins=megflow.command_line:main'], - }, - ) diff --git a/flow-rs/Cargo.toml b/flow-rs/Cargo.toml deleted file mode 100644 index 782af6d..0000000 --- a/flow-rs/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "flow-rs" -version = "0.1.0" -authors = ["megvii"] -edition = "2018" - -[dependencies] -flow-derive = { path="../flow-derive" } -anyhow = "1.0.38" -serde = { version = "1.0", features = ["derive"] } -toml = "0.5.8" -lazy_static = "1.4.0" -ctor = "0.1" -pyo3 = "0.14" -dyn-clone = "1.0.4" -async-std = { version = "1.9.0", features = ["unstable", "attributes", "tokio1"] } -stackful = { git = "https://github.com/nbdd0121/stackful.git", rev = "4789e26" } -futures-util = "0.3" -futures-core = "0.3.15" -concurrent-queue = "1.2.2" -event-listener = "2.4.0" -numpy = "0.14" -ctrlc = "3.1.9" -log = "0.4.14" -oneshot = "0.1.2" -warp = "0.3" -serde_json = "1.0" - -[dev-dependencies] -clap = "3.0.0-beta.2" -flow-plugins = {path="../flow-plugins"} -rand = "0.8.4" -libc = "0.2" diff --git a/flow-rs/examples/graph.rs b/flow-rs/examples/graph.rs deleted file mode 100644 index 34b9703..0000000 --- a/flow-rs/examples/graph.rs +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file flow-rs/examples/graph.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use clap::clap_app; -use flow_rs::prelude::*; -use std::time::Instant; - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor)] -struct Transport { - _name: String, -} - -impl Transport { - fn new(name: String, _: &toml::value::Table) -> Transport { - Transport { - _name: name, - inp: Default::default(), - out: Default::default(), - } - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(envelope) = self.inp.recv::().await { - self.out.send(envelope).await.ok(); - } - Ok(()) - } -} - -node_register!("Transport", Transport); - -#[flow_rs::rt::main] -async fn main() { - let matches = clap_app!(graph => - (version: "1.0") - (author: "megvii") - (@arg NODE_NUM: -n --node [N] "node num") - (@arg CONCURRENCY: -c --concurrency [N] "concurrency") - (@arg DATA_NUM: -d --data [N] "data num")) - .get_matches(); - let node_num = matches - .value_of("NODE_NUM") - .unwrap_or("1") - .parse::() - .unwrap(); - let concurrency = matches - .value_of("CONCURRENCY") - .unwrap_or("1") - .parse::() - .unwrap(); - let data_num = matches - .value_of("DATA_NUM") - .unwrap_or("1") - .parse::() - .unwrap(); - - let mut connects = vec![]; - let mut nodes = vec![]; - for i in 1..=node_num { - nodes.push(format!( - r#" -[[graphs.nodes]] -name = "trans{}" -ty = "Transport" -cloned = {} - "#, - i, concurrency - )) - } - for i in 1..node_num { - connects.push(format!( - r#" -[[graphs.connections]] -cap = 64 -ports = ["trans{}:out", "trans{}:inp"] - "#, - i, - i + 1 - )); - } - let config = vec![ - format!( - r#" - main = "Example" - [[graphs]] - name = "Example" - inputs=[{{name="in", cap=64, ports=["trans1:inp"]}}] - outputs=[{{name="out", cap=64, ports=["trans{}:out"]}}]"#, - node_num - ), - connects.join("\n"), - nodes.join("\n"), - ] - .join("\n"); - - let mut graph = load(None, config.as_str()).unwrap(); - let input = graph.input("in").unwrap(); - let output = graph.output("out").unwrap(); - let handle = graph.start(); - let sf = async_std::task::spawn(async move { - for _ in 0..data_num { - input - .send(flow_rs::envelope::Envelope::new(16u32)) - .await - .ok(); - } - input - }); - let rf = async_std::task::spawn(async move { - for _ in 0..data_num { - output.recv::().await.ok(); - } - }); - let start = Instant::now(); - let (input, _) = futures_util::future::join(sf, rf).await; - let duration = start.elapsed(); - println!( - "Time elapsed in `example/graph.rs` [length:{}, width:{}, datas:{}] is: {:?}", - node_num, concurrency, data_num, duration - ); - input.close(); - handle.await; -} diff --git a/flow-rs/examples/run_with_plugins.rs b/flow-rs/examples/run_with_plugins.rs deleted file mode 100644 index d68c12d..0000000 --- a/flow-rs/examples/run_with_plugins.rs +++ /dev/null @@ -1,82 +0,0 @@ -/** - * \file flow-rs/examples/run_with_plugins.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use clap::clap_app; -use flow_rs::loader; -use flow_rs::prelude::*; -use std::env::current_dir; -use std::path::PathBuf; - -#[flow_rs::rt::main] -async fn main() { - let matches = clap_app!(run_with_plugins => - (version: "1.0") - (author: "megvii") - (@arg DEBUG: --debug [PORT] "debug mode") - (@arg DUMP: --dump "the path to dump graph") - (@arg MODULE_PATH: -m --module [MODULE] "module path") - (@arg PLUGIN_PATH: -p --plugin "plugin path") - (@arg CONFIG_PATH: -c --config [CONFIG] "config path")) - .get_matches(); - - let dump = matches.is_present("DUMP"); - let module = matches - .value_of("MODULE_PATH") - .unwrap_or(current_dir().unwrap().to_str().unwrap()) - .parse::() - .unwrap(); - let plugin = matches - .value_of("PLUGIN_PATH") - .map(|s| s.parse::().unwrap()) - .unwrap(); - let config = matches - .value_of("CONFIG_PATH") - .map(|s| s.parse::().unwrap()) - .unwrap_or_else(|| { - let mut config = std::fs::canonicalize(&plugin).unwrap(); - let dirname = config.file_name().unwrap(); - let config_name = format!("{}.toml", dirname.to_str().unwrap()); - config.push(config_name); - config - }); - - flow_plugins::export(); - ctrlc::set_handler(|| unsafe { libc::_exit(0) }).expect("Error setting Ctrl-C handler"); - - if dump { - let mut dump_path = config.clone(); - dump_path.pop(); - let file_stem = config.file_stem().unwrap().to_str().unwrap(); - dump_path.push(format!("{}.png", file_stem)); - log::info!("dump path: {:?}", dump_path); - std::env::set_var("MEGFLOW_DUMP", dump_path.to_str().unwrap()); - } - - let plugin_cfg = loader::LoaderConfig { - module_path: module, - plugin_path: plugin, - ty: loader::PluginType::Python, - }; - - let cfg = std::fs::read_to_string(config).unwrap(); - - if let Some(dbg_port) = matches.value_of("DEBUG") { - let dbg_port: u16 = dbg_port.parse().unwrap(); - let server = flow_rs::DebugServer::new(cfg.clone(), dbg_port); - flow_rs::rt::task::spawn(async move { - server.listen().await; - }); - } - - let mut graph = load(Some(plugin_cfg), cfg.as_str()).unwrap(); - let graph_handle = graph.start(); - graph.stop(); - graph_handle.await -} diff --git a/flow-rs/src/broker.rs b/flow-rs/src/broker.rs deleted file mode 100644 index a5252a1..0000000 --- a/flow-rs/src/broker.rs +++ /dev/null @@ -1,156 +0,0 @@ -/** - * \file flow-rs/src/broker.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::envelope::*; -use crate::rt::channel::*; -use crate::rt::task::JoinHandle; -use std::collections::HashMap; -use std::sync::atomic::AtomicBool; -use std::sync::atomic::AtomicUsize; -use std::sync::atomic::Ordering; -use std::sync::Arc; - -type NotifyReceiver = Receiver; -type NotifySender = Sender; -type SubReceiver = Receiver; -type SubSender = Sender; - -#[derive(Default)] -pub struct Broker { - subs: HashMap)>, - running: Arc, - count: Arc, -} - -pub struct BrokerClient { - id: usize, - notify: NotifySender, - self_notify: SubSender, - sub: SubReceiver, - topic: String, - running: Arc, - count: Arc, -} - -impl Broker { - pub fn new() -> Broker { - Broker { - subs: HashMap::new(), - running: Arc::new(AtomicBool::new(false)), - count: Arc::new(AtomicUsize::new(0)), - } - } - - pub fn subscribe(&mut self, topic: String) -> BrokerClient { - let (notify, _, subs) = self.subs.entry(topic.clone()).or_insert_with(|| { - let (s, r) = unbounded(); - (s, r, vec![]) - }); - let (s, r) = unbounded(); - subs.push(s.clone()); - self.count.fetch_add(1, Ordering::Relaxed); - BrokerClient { - id: subs.len() - 1, - notify: notify.clone(), - self_notify: s, - sub: r, - topic, - running: self.running.clone(), - count: self.count.clone(), - } - } - - pub fn run(&mut self) -> JoinHandle<()> { - self.running.store(true, Ordering::Relaxed); - let running = self.running.clone(); - let subs = std::mem::take(&mut self.subs); - crate::rt::task::spawn(async move { - let mut handles = vec![]; - for (_, (_, notifier, subs)) in subs.into_iter() { - let running = running.clone(); - handles.push(crate::rt::task::spawn(async move { - while running.load(Ordering::Acquire) { - if let Ok(msg) = notifier.recv().await { - for (i, sub) in subs.iter().enumerate() { - if i == msg.info().from_addr.unwrap() as usize { - continue; - } - let msg = msg.clone(); - sub.send(msg).await.unwrap(); - } - } - } - })); - } - for handle in handles { - handle.await; - } - }) - } -} - -impl Drop for BrokerClient { - fn drop(&mut self) { - if self.count.fetch_sub(1, Ordering::AcqRel) == 1 { - self.close(); - } - } -} - -impl BrokerClient { - pub async fn publish(&self, msg: T) - where - T: 'static + Clone + std::marker::Send, - { - let mut envelope = Envelope::new(msg.clone()).seal(); - envelope.info_mut().from_addr = Some(self.id as u64); - let envelope_cloned = envelope.clone(); - self.notify.send(envelope_cloned).await.unwrap(); - self.self_notify.send(envelope).await.unwrap(); - } - - pub async fn fetch(&self) -> Result - where - T: 'static + Clone + std::marker::Send, - { - self.sub.recv().await.map(|mut envelope| { - let envelope = envelope - .downcast_mut::>() - .expect("type error when downcast"); - envelope.unpack() - }) - } - - pub fn try_fetch(&self) -> Option - where - T: 'static + Clone + std::marker::Send, - { - self.sub.try_recv().ok().map(|mut envelope| { - let envelope = envelope - .downcast_mut::>() - .expect("type error when downcast"); - envelope.unpack() - }) - } - - pub fn topic(&self) -> &str { - self.topic.as_str() - } - - pub fn is_closed(&self) -> bool { - self.running.load(Ordering::Relaxed) - } - - pub fn close(&self) { - self.running.store(false, Ordering::Release); - self.notify.close(); - self.sub.close(); - } -} diff --git a/flow-rs/src/channel/error.rs b/flow-rs/src/channel/error.rs deleted file mode 100644 index e77424d..0000000 --- a/flow-rs/src/channel/error.rs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * \file flow-rs/src/channel/error.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -pub enum BatchRecvError { - Closed(Vec), -} - -pub type SendError = super::inner::SendError; -pub type RecvError = super::inner::RecvError; - -impl std::fmt::Debug for BatchRecvError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match *self { - BatchRecvError::Closed(_) => f.write_str("BatchRecvError::Closed"), - } - } -} diff --git a/flow-rs/src/channel/inner.rs b/flow-rs/src/channel/inner.rs deleted file mode 100644 index 6fbf195..0000000 --- a/flow-rs/src/channel/inner.rs +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * License); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/* - * Copyright (c) https://github.com/smol-rs/async-channel - */ - -/* - * Copyright (c) 2021, megvii. inc - * Author: MegEngine@megvii.com - */ - -use std::error; -use std::fmt; -use std::future::Future; -use std::pin::Pin; -use std::process; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::task::{Context, Poll}; -use std::usize; - -use concurrent_queue::{ConcurrentQueue, PopError, PushError}; -use event_listener::{Event, EventListener}; -use futures_core::stream::Stream; - -pub struct Channel { - /// Inner message queue. - pub(super) queue: ConcurrentQueue, - - /// Send operations waiting while the channel is full. - send_ops: Event, - - /// Receive operations waiting while the channel is empty and not closed. - recv_ops: Event, - - /// Stream operations while the channel is empty and not closed. - stream_ops: Event, - - /// The number of currently active `Sender`s. - pub(super) sender_count: AtomicUsize, - - /// The number of currently active `Receivers`s. - pub(super) receiver_count: AtomicUsize, -} - -impl Channel { - /// Closes the channel and notifies all blocked operations. - /// - /// Returns `true` if this call has closed the channel and it was not closed already. - pub(super) fn close(&self) -> bool { - if self.queue.close() { - // Notify all send operations. - self.send_ops.notify(usize::MAX); - - // Notify all receive and stream operations. - self.recv_ops.notify(usize::MAX); - self.stream_ops.notify(usize::MAX); - - true - } else { - false - } - } -} - -pub fn bounded(cap: usize) -> Arc> { - assert!(cap > 0, "capacity cannot be zero"); - - Arc::new(Channel { - queue: ConcurrentQueue::bounded(cap), - send_ops: Event::new(), - recv_ops: Event::new(), - stream_ops: Event::new(), - sender_count: AtomicUsize::new(0), - receiver_count: AtomicUsize::new(0), - }) -} - -pub fn unbounded() -> Arc> { - Arc::new(Channel { - queue: ConcurrentQueue::unbounded(), - send_ops: Event::new(), - recv_ops: Event::new(), - stream_ops: Event::new(), - sender_count: AtomicUsize::new(0), - receiver_count: AtomicUsize::new(0), - }) -} - -/// The sending side of a channel. -/// -/// Senders can be cloned and shared among threads. When all senders associated with a channel are -/// dropped, the channel becomes closed. -/// -/// The channel can also be closed manually by calling [`Sender::close()`]. -pub struct Sender { - /// Inner channel state. - pub(super) channel: Arc>, - pub(super) close_ops: Arc, -} - -impl Sender { - pub fn try_send(&self, msg: T) -> Result<(), TrySendError> { - match self.channel.queue.push(msg) { - Ok(()) => { - // Notify a single blocked receive operation. If the notified operation then - // receives a message or gets canceled, it will notify another blocked receive - // operation. - self.channel.recv_ops.notify(1); - - // Notify all blocked streams. - self.channel.stream_ops.notify(usize::MAX); - - Ok(()) - } - Err(PushError::Full(msg)) => Err(TrySendError::Full(msg)), - Err(PushError::Closed(msg)) => Err(TrySendError::Closed(msg)), - } - } - - pub async fn send(&self, msg: T) -> Result<(), SendError> { - let mut listener = None; - let mut msg = msg; - - loop { - // Attempt to send a message. - match self.try_send(msg) { - Ok(()) => { - // If the capacity is larger than 1, notify another blocked send operation. - match self.channel.queue.capacity() { - Some(1) => {} - Some(_) | None => self.channel.send_ops.notify(1), - } - return Ok(()); - } - Err(TrySendError::Closed(msg)) => return Err(SendError(msg)), - Err(TrySendError::Full(m)) => msg = m, - } - - // Sending failed - now start listening for notifications or wait for one. - match listener.take() { - None => { - // Start listening and then try receiving again. - listener = Some(self.channel.send_ops.listen()); - } - Some(l) => { - // Wait for a notification. - l.await; - } - } - } - } - - pub fn close(&self) -> bool { - self.channel.close() - } - - pub fn is_closed(&self) -> bool { - self.channel.queue.is_closed() - } - - pub fn is_empty(&self) -> bool { - self.channel.queue.is_empty() - } - - pub fn is_full(&self) -> bool { - self.channel.queue.is_full() - } - - pub fn len(&self) -> usize { - self.channel.queue.len() - } - - pub fn capacity(&self) -> Option { - self.channel.queue.capacity() - } - - pub fn receiver_count(&self) -> usize { - self.channel.receiver_count.load(Ordering::SeqCst) - } - - pub fn sender_count(&self) -> usize { - self.channel.sender_count.load(Ordering::SeqCst) - } -} - -impl Drop for Sender { - fn drop(&mut self) { - // Decrement the sender count and close the channel if it drops down to zero. - if self.channel.sender_count.fetch_sub(1, Ordering::AcqRel) == 1 { - self.channel.close(); - self.close_ops.notify(usize::MAX); - } - } -} - -impl fmt::Debug for Sender { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Sender {{ .. }}") - } -} - -impl Clone for Sender { - fn clone(&self) -> Sender { - let count = self.channel.sender_count.fetch_add(1, Ordering::Relaxed); - - // Make sure the count never overflows, even if lots of sender clones are leaked. - if count > usize::MAX / 2 { - process::abort(); - } - - Sender { - channel: self.channel.clone(), - close_ops: self.close_ops.clone(), - } - } -} - -/// The receiving side of a channel. -/// -/// Receivers can be cloned and shared among threads. When all receivers associated with a channel -/// are dropped, the channel becomes closed. -/// -/// The channel can also be closed manually by calling [`Receiver::close()`]. -/// -/// Receivers implement the [`Stream`] trait. -pub struct Receiver { - /// Inner channel state. - pub(super) channel: Arc>, - - /// Listens for a send or close event to unblock this stream. - pub(super) listener: Option, - pub(super) close_ops: Arc, -} - -impl Receiver { - pub fn try_recv(&self) -> Result { - match self.channel.queue.pop() { - Ok(msg) => { - // Notify a single blocked send operation. If the notified operation then sends a - // message or gets canceled, it will notify another blocked send operation. - self.channel.send_ops.notify(1); - - Ok(msg) - } - Err(PopError::Empty) => Err(TryRecvError::Empty), - Err(PopError::Closed) => Err(TryRecvError::Closed), - } - } - - pub async fn recv(&self) -> Result { - let mut listener = None; - - loop { - // Attempt to receive a message. - match self.try_recv() { - Ok(msg) => { - // If the capacity is larger than 1, notify another blocked receive operation. - // There is no need to notify stream operations because all of them get - // notified every time a message is sent into the channel. - match self.channel.queue.capacity() { - Some(1) => {} - Some(_) | None => self.channel.recv_ops.notify(1), - } - return Ok(msg); - } - Err(TryRecvError::Closed) => return Err(RecvError), - Err(TryRecvError::Empty) => {} - } - - // Receiving failed - now start listening for notifications or wait for one. - match listener.take() { - None => { - // Start listening and then try receiving again. - listener = Some(self.channel.recv_ops.listen()); - } - Some(l) => { - // Wait for a notification. - l.await; - } - } - } - } - - pub fn close(&self) -> bool { - self.channel.close() - } - - pub fn is_closed(&self) -> bool { - self.channel.queue.is_closed() - } - - pub fn is_empty(&self) -> bool { - self.channel.queue.is_empty() - } - - pub fn is_full(&self) -> bool { - self.channel.queue.is_full() - } - - pub fn len(&self) -> usize { - self.channel.queue.len() - } - - pub fn capacity(&self) -> Option { - self.channel.queue.capacity() - } - - pub fn receiver_count(&self) -> usize { - self.channel.receiver_count.load(Ordering::SeqCst) - } - - pub fn sender_count(&self) -> usize { - self.channel.sender_count.load(Ordering::SeqCst) - } -} - -impl Drop for Receiver { - fn drop(&mut self) { - // Decrement the receiver count and close the channel if it drops down to zero. - if self.channel.receiver_count.fetch_sub(1, Ordering::AcqRel) == 1 { - self.channel.close(); - self.close_ops.notify(usize::MAX); - } - } -} - -impl fmt::Debug for Receiver { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Receiver {{ .. }}") - } -} - -impl Clone for Receiver { - fn clone(&self) -> Receiver { - let count = self.channel.receiver_count.fetch_add(1, Ordering::Relaxed); - - // Make sure the count never overflows, even if lots of receiver clones are leaked. - if count > usize::MAX / 2 { - process::abort(); - } - - Receiver { - channel: self.channel.clone(), - listener: None, - close_ops: self.close_ops.clone(), - } - } -} - -impl Stream for Receiver { - type Item = T; - - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - loop { - // If this stream is listening for events, first wait for a notification. - if let Some(listener) = self.listener.as_mut() { - futures_core::ready!(Pin::new(listener).poll(cx)); - self.listener = None; - } - - loop { - // Attempt to receive a message. - match self.try_recv() { - Ok(msg) => { - // The stream is not blocked on an event - drop the listener. - self.listener = None; - return Poll::Ready(Some(msg)); - } - Err(TryRecvError::Closed) => { - // The stream is not blocked on an event - drop the listener. - self.listener = None; - return Poll::Ready(None); - } - Err(TryRecvError::Empty) => {} - } - - // Receiving failed - now start listening for notifications or wait for one. - match self.listener.as_mut() { - None => { - // Create a listener and try sending the message again. - self.listener = Some(self.channel.stream_ops.listen()); - } - Some(_) => { - // Go back to the outer loop to poll the listener. - break; - } - } - } - } - } -} - -/// An error returned from [`Sender::send()`]. -/// -/// Received because the channel is closed. -#[derive(PartialEq, Eq, Clone, Copy)] -pub struct SendError(pub T); - -impl SendError { - /// Unwraps the message that couldn't be sent. - pub fn into_inner(self) -> T { - self.0 - } -} - -impl error::Error for SendError {} - -impl fmt::Debug for SendError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "SendError(..)") - } -} - -impl fmt::Display for SendError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "sending into a closed channel") - } -} - -/// An error returned from [`Sender::try_send()`]. -#[derive(PartialEq, Eq, Clone, Copy)] -pub enum TrySendError { - /// The channel is full but not closed. - Full(T), - - /// The channel is closed. - Closed(T), -} - -impl TrySendError { - /// Unwraps the message that couldn't be sent. - pub fn into_inner(self) -> T { - match self { - TrySendError::Full(t) => t, - TrySendError::Closed(t) => t, - } - } - - /// Returns `true` if the channel is full but not closed. - pub fn is_full(&self) -> bool { - match self { - TrySendError::Full(_) => true, - TrySendError::Closed(_) => false, - } - } - - /// Returns `true` if the channel is closed. - pub fn is_closed(&self) -> bool { - match self { - TrySendError::Full(_) => false, - TrySendError::Closed(_) => true, - } - } -} - -impl error::Error for TrySendError {} - -impl fmt::Debug for TrySendError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - TrySendError::Full(..) => write!(f, "Full(..)"), - TrySendError::Closed(..) => write!(f, "Closed(..)"), - } - } -} - -impl fmt::Display for TrySendError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - TrySendError::Full(..) => write!(f, "sending into a full channel"), - TrySendError::Closed(..) => write!(f, "sending into a closed channel"), - } - } -} - -/// An error returned from [`Receiver::recv()`]. -/// -/// Received because the channel is empty and closed. -#[derive(PartialEq, Eq, Clone, Copy, Debug)] -pub struct RecvError; - -impl error::Error for RecvError {} - -impl fmt::Display for RecvError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "receiving from an empty and closed channel") - } -} - -/// An error returned from [`Receiver::try_recv()`]. -#[derive(PartialEq, Eq, Clone, Copy, Debug)] -pub enum TryRecvError { - /// The channel is empty but not closed. - Empty, - - /// The channel is empty and closed. - Closed, -} - -impl TryRecvError { - /// Returns `true` if the channel is empty but not closed. - pub fn is_empty(&self) -> bool { - match self { - TryRecvError::Empty => true, - TryRecvError::Closed => false, - } - } - - /// Returns `true` if the channel is empty and closed. - pub fn is_closed(&self) -> bool { - match self { - TryRecvError::Empty => false, - TryRecvError::Closed => true, - } - } -} - -impl error::Error for TryRecvError {} - -impl fmt::Display for TryRecvError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - TryRecvError::Empty => write!(f, "receiving from an empty channel"), - TryRecvError::Closed => write!(f, "receiving from an empty and closed channel"), - } - } -} diff --git a/flow-rs/src/channel/mod.rs b/flow-rs/src/channel/mod.rs deleted file mode 100644 index aebb673..0000000 --- a/flow-rs/src/channel/mod.rs +++ /dev/null @@ -1,83 +0,0 @@ -/** - * \file flow-rs/src/channel/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod error; -mod inner; -mod receiver; -mod sender; -mod storage; - -pub trait ChannelBase { - fn is_closed(&self) -> bool; - fn is_none(&self) -> bool; -} - -pub use error::*; -pub use receiver::*; -pub use sender::*; -pub use storage::*; - -#[cfg(test)] -mod test { - use super::*; - use crate::prelude::DummyEnvelope; - use crate::rt; - - #[rt::test] - async fn test_dummy_msg() { - let chan = ChannelStorage::unbound(); - assert_eq!(chan.sender_count(), 0); - assert_eq!(chan.receiver_count(), 0); - let s1 = chan.sender(); - let s2 = chan.sender(); - let r1 = chan.receiver(); - let r2 = chan.receiver(); - assert_eq!(chan.sender_count(), 2); - assert_eq!(chan.receiver_count(), 2); - let _ = chan.clone(); - assert_eq!(chan.sender_count(), 2); - assert_eq!(chan.receiver_count(), 2); - - s1.send_any(DummyEnvelope {}.seal()).await.ok(); - s2.send_any(DummyEnvelope {}.seal()).await.ok(); - assert_eq!(chan.len(), 1); - - assert!(r1.recv_any().await.is_err()); - assert!(!r1.is_closed()); - assert!(r2.recv_any().await.is_err()); - assert!(!r2.is_closed()); - - s2.send_any(DummyEnvelope {}.seal()).await.ok(); - s2.send_any(DummyEnvelope {}.seal()).await.ok(); - assert!(chan.is_empty()); - } - - #[rt::test] - async fn test_closed() { - let chan = ChannelStorage::unbound(); - let r = chan.receiver(); - let s = chan.sender(); - s.close(); - assert!(!r.is_closed()); - assert!(r.recv_any().await.is_err()); - assert!(r.is_closed()); - chan.wait_rx_closed().await; - - let chan = ChannelStorage::unbound(); - let s = chan.sender(); - let r = chan.receiver(); - chan.close(); - assert!(!r.is_closed()); - assert!(r.recv_any().await.is_err()); - assert!(r.is_closed()); - drop(s); - chan.wait_tx_closed().await; - } -} diff --git a/flow-rs/src/channel/receiver.rs b/flow-rs/src/channel/receiver.rs deleted file mode 100644 index 194f555..0000000 --- a/flow-rs/src/channel/receiver.rs +++ /dev/null @@ -1,195 +0,0 @@ -/** - * \file flow-rs/src/channel/receiver.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use futures_util::stream::FuturesUnordered; -use futures_util::{pin_mut, select, FutureExt, StreamExt}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::Arc; -use std::time::Duration; - -use super::inner::Receiver as RecvImpl; -use super::{BatchRecvError, RecvError}; -use crate::envelope::{DummyEnvelope, Envelope, SealedEnvelope}; - -use super::ChannelBase; - -#[derive(Default)] -pub struct Receiver { - imp: Option>, - m_epoch: AtomicUsize, - g_epoch: Arc, - is_closed: AtomicBool, - counter: Arc, -} - -impl Clone for Receiver { - fn clone(&self) -> Self { - let m_epoch = self.g_epoch.load(Ordering::Relaxed); - Receiver { - imp: self.imp.clone(), - m_epoch: AtomicUsize::new(m_epoch), - g_epoch: self.g_epoch.clone(), - is_closed: AtomicBool::new(self.is_closed.load(Ordering::Relaxed)), - counter: self.counter.clone(), - } - } -} - -impl ChannelBase for Receiver { - fn is_closed(&self) -> bool { - if self.imp.is_some() { - self.is_closed.load(Ordering::Relaxed) - } else { - true - } - } - fn is_none(&self) -> bool { - self.imp.is_none() - } -} - -impl Receiver { - pub fn new( - imp: RecvImpl, - epoch: Arc, - counter: Arc, - ) -> Self { - let m_epoch = epoch.load(Ordering::Relaxed); - Receiver { - imp: Some(imp), - m_epoch: AtomicUsize::new(m_epoch), - g_epoch: epoch, - is_closed: AtomicBool::new(false), - counter, - } - } - pub fn len(&self) -> usize { - let imp = self.imp.as_ref().expect("not init"); - imp.len() - } - pub fn is_empty(&self) -> bool { - let imp = self.imp.as_ref().expect("not init"); - imp.is_empty() - } - #[doc(hidden)] - pub fn empty_n(&self) -> usize { - self.m_epoch.load(Ordering::Relaxed) - } - /// Receives a envelope from the channel. - /// - /// If the channel is empty, this method waits until there is a envelope. - /// - /// If the channel is closed, this method receives a envelope or returns an error if there are - /// no more envelopes. - /// - /// If the channel encounters a flush event, this method returns an error. - pub async fn recv(&self) -> Result, RecvError> - where - T: 'static + Send + Clone, - { - self.recv_any().await.map(|mut envelope| { - let envelope = envelope - .downcast_mut::>() - .expect("type error when downcast"); - envelope.take() - }) - } - /// Receives a any envelope from the channel, see document of `recv` for more detail - pub async fn recv_any(&self) -> Result { - let m_epoch = self.m_epoch.load(Ordering::Relaxed); - let g_epoch = self.g_epoch.load(Ordering::Relaxed); - if m_epoch < g_epoch { - self.m_epoch.fetch_add(1, Ordering::Relaxed); - return Err(RecvError {}); - } - let imp = self.imp.as_ref().expect("not init"); - let envelope = imp.recv().await.map_err(|e| { - self.is_closed.store(true, Ordering::Relaxed); - e - })?; - if envelope.is::() { - self.m_epoch.fetch_add(1, Ordering::Relaxed); - self.g_epoch.fetch_add(1, Ordering::Relaxed); - Err(RecvError {}) - } else { - self.counter.fetch_add(1, Ordering::Relaxed); - Ok(envelope) - } - } - - /// Receives some envelopes from the channel. - /// - /// If there are less than n envelopes in the channel, this method waits until there is n envelopes or timeout. - /// - /// If the channel is closed, this method receives n envelopes or returns an error with rest - /// envelopes if there are no enough envelopes. - /// - /// If the channel encounters a flush event, this method returns an error with rest envelopes. - pub async fn batch_recv( - &self, - n: usize, - dur: Duration, - ) -> Result>, BatchRecvError>> - where - T: 'static + Send + Clone, - { - let convert = |envelopes: Vec| { - envelopes - .into_iter() - .map(|mut envelope| { - envelope - .downcast_mut::>() - .expect("type error when downcast") - .take() - }) - .collect() - }; - let batch_any = self.batch_recv_any(n, dur).await; - batch_any.map(convert).map_err(|err| match err { - BatchRecvError::Closed(envelopes) => BatchRecvError::Closed(convert(envelopes)), - }) - } - - /// Receives some any envelopes from the channel, see document of `batch_recv` for more detail - pub async fn batch_recv_any( - &self, - n: usize, - dur: Duration, - ) -> Result, BatchRecvError> { - let mut wait_recv = FuturesUnordered::new(); - wait_recv.push(self.recv_any()); - let timeout = crate::rt::task::sleep(dur).fuse(); - let mut batch = vec![]; - pin_mut!(timeout); - loop { - select! { - _ = timeout => { - return Ok(batch); - } - msg = wait_recv.select_next_some() => { - match msg { - Ok(msg) => { - batch.push(msg); - if batch.len() == n { - return Ok(batch); - } else { - wait_recv.push(self.recv_any()); - } - }, - Err(_) => { - return Err(BatchRecvError::Closed(batch)); - } - } - - } - } - } - } -} diff --git a/flow-rs/src/channel/sender.rs b/flow-rs/src/channel/sender.rs deleted file mode 100644 index 08ec2a6..0000000 --- a/flow-rs/src/channel/sender.rs +++ /dev/null @@ -1,140 +0,0 @@ -/** - * \file flow-rs/src/channel/sender.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::rt::sync::Mutex; -use std::collections::HashMap; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; - -use super::inner::Sender as SendImpl; -use super::SendError; -use crate::envelope::{DummyEnvelope, Envelope, SealedEnvelope}; - -use super::ChannelBase; - -pub type SenderRecord = Arc>>; - -#[derive(Default)] -pub struct Sender { - imp: Option>, - epoch: AtomicUsize, - max_epoch: Arc, - record: SenderRecord, - counter: Arc, -} - -impl Clone for Sender { - fn clone(&self) -> Self { - let epoch = self.max_epoch.load(Ordering::Relaxed); - - Sender { - imp: self.imp.clone(), - epoch: AtomicUsize::new(epoch), - max_epoch: self.max_epoch.clone(), - record: self.record.clone(), - counter: self.counter.clone(), - } - } -} - -impl ChannelBase for Sender { - fn is_closed(&self) -> bool { - let imp = self.imp.as_ref().expect("not init or had abort"); - imp.is_closed() - } - fn is_none(&self) -> bool { - self.imp.is_none() - } -} - -impl Sender { - pub fn new( - imp: SendImpl, - max_epoch: Arc, - record: SenderRecord, - counter: Arc, - ) -> Self { - let epoch = max_epoch.load(Ordering::Relaxed); - Sender { - imp: Some(imp), - epoch: AtomicUsize::new(epoch), - max_epoch, - record, - counter, - } - } - - #[doc(hidden)] - pub fn empty_n(&self) -> usize { - self.epoch.load(Ordering::Relaxed) - } - pub fn len(&self) -> usize { - let imp = self.imp.as_ref().expect("not init or had abort"); - imp.len() - } - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - /// Closes the channel. - /// The remaining envelopes can still be received. - pub fn close(&self) { - let imp = self.imp.as_ref().expect("not init or had abort"); - imp.close(); - } - /// Drop self, and closes the channel if there are no senders left. - pub fn abort(&mut self) { - self.imp.take(); - } - /// Sends a envelope into the channel. - /// - /// If the envelope is empty, sends flush event to channel if the number of the empty envelopes received is - /// equal to the number of senders - /// - /// If the channel is full, this method waits until there is space for a envelope. - /// - /// If the channel is closed, this method returns an error. - pub async fn send(&self, msg: Envelope) -> Result<(), SendError>> - where - T: 'static + Send + Clone, - { - self.send_any(msg.seal()).await.map_err(|err| { - let mut envelope = err.0; - let envelope = envelope - .downcast_mut::>() - .expect("type error when downcast"); - super::inner::SendError(envelope.take()) - }) - } - /// Sends a any envelope into the channel. see document of `send` for more detail - pub async fn send_any(&self, msg: SealedEnvelope) -> Result<(), SendError> { - let imp = self.imp.as_ref().expect("not init or had abort"); - if msg.is::() { - let mut record = self.record.lock().await; - let epoch = self.epoch.load(Ordering::Relaxed); - let count = record.entry(epoch).or_insert_with(|| imp.sender_count()); - *count -= 1; - - self.max_epoch.fetch_max( - self.epoch.fetch_add(1, Ordering::Relaxed) + 1, - Ordering::Relaxed, - ); - - if *count == 0 { - record.remove(&epoch); - imp.send(msg).await - } else { - Ok(()) - } - } else { - self.counter.fetch_add(1, Ordering::Relaxed); - imp.send(msg).await - } - } -} diff --git a/flow-rs/src/channel/storage.rs b/flow-rs/src/channel/storage.rs deleted file mode 100644 index b230bb0..0000000 --- a/flow-rs/src/channel/storage.rs +++ /dev/null @@ -1,169 +0,0 @@ -/** - * \file flow-rs/src/channel/storage.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::{inner, ChannelBase, Receiver, Sender, SenderRecord}; -use crate::envelope::SealedEnvelope; -use crate::rt::sync::Mutex; -use event_listener::Event; -use std::collections::HashMap; -use std::process; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; - -#[derive(Clone)] -pub struct ChannelStorage { - storage: Arc>, - receiver_epoch: Arc, - sender_epoch: Arc, - sender_record: SenderRecord, - rx_counter: Arc, - tx_counter: Arc, - rx_close_ops: Arc, - tx_close_ops: Arc, -} - -impl ChannelBase for ChannelStorage { - fn is_closed(&self) -> bool { - self.storage.queue.is_closed() - } - fn is_none(&self) -> bool { - false - } -} - -impl ChannelStorage { - pub fn bound(cap: usize) -> ChannelStorage { - ChannelStorage { - storage: inner::bounded(cap), - receiver_epoch: Arc::new(AtomicUsize::new(0)), - sender_epoch: Arc::new(AtomicUsize::new(0)), - sender_record: Arc::new(Mutex::new(HashMap::new())), - rx_counter: Arc::new(AtomicUsize::new(0)), - tx_counter: Arc::new(AtomicUsize::new(0)), - rx_close_ops: Arc::new(Event::new()), - tx_close_ops: Arc::new(Event::new()), - } - } - pub fn unbound() -> ChannelStorage { - ChannelStorage { - storage: inner::unbounded(), - receiver_epoch: Arc::new(AtomicUsize::new(0)), - sender_epoch: Arc::new(AtomicUsize::new(0)), - sender_record: Arc::new(Mutex::new(HashMap::new())), - tx_close_ops: Arc::new(Event::new()), - rx_close_ops: Arc::new(Event::new()), - rx_counter: Arc::new(AtomicUsize::new(0)), - tx_counter: Arc::new(AtomicUsize::new(0)), - } - } - pub fn sender(&self) -> Sender { - let count = self.storage.sender_count.fetch_add(1, Ordering::Relaxed); - - if count > usize::MAX / 2 { - process::abort(); - } - Sender::new( - inner::Sender { - channel: self.storage.clone(), - close_ops: self.tx_close_ops.clone(), - }, - self.sender_epoch.clone(), - self.sender_record.clone(), - self.tx_counter.clone(), - ) - } - - pub fn receiver(&self) -> Receiver { - let count = self.storage.receiver_count.fetch_add(1, Ordering::Relaxed); - - if count > usize::MAX / 2 { - process::abort(); - } - - Receiver::new( - inner::Receiver { - channel: self.storage.clone(), - listener: None, - close_ops: self.rx_close_ops.clone(), - }, - self.receiver_epoch.clone(), - self.rx_counter.clone(), - ) - } - - pub fn len(&self) -> usize { - self.storage.queue.len() - } - - pub fn is_almost_full(&self) -> bool { - match self.storage.queue.capacity() { - Some(capacity) => (0.9 * capacity as f64) <= self.len() as f64, - None => false, - } - } - - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - pub fn close(&self) { - self.storage.close(); - } - - pub fn sender_count(&self) -> usize { - self.storage.sender_count.load(Ordering::Relaxed) - } - - pub fn receiver_count(&self) -> usize { - self.storage.receiver_count.load(Ordering::Relaxed) - } - - pub fn swap_tx_counter(&self) -> usize { - self.tx_counter.swap(0, Ordering::Relaxed) - } - - pub fn swap_rx_counter(&self) -> usize { - self.rx_counter.swap(0, Ordering::Relaxed) - } - - pub async fn wait_rx_closed(&self) { - let mut listener = None; - loop { - if self.is_closed() { - return; - } - match listener.take() { - None => { - listener = Some(self.rx_close_ops.listen()); - } - Some(l) => { - l.await; - } - } - } - } - - pub async fn wait_tx_closed(&self) { - let mut listener = None; - loop { - if self.is_closed() { - return; - } - match listener.take() { - None => { - listener = Some(self.tx_close_ops.listen()); - } - Some(l) => { - l.await; - } - } - } - } -} diff --git a/flow-rs/src/config/graphviz.rs b/flow-rs/src/config/graphviz.rs deleted file mode 100644 index 69c0990..0000000 --- a/flow-rs/src/config/graphviz.rs +++ /dev/null @@ -1,157 +0,0 @@ -/** - * \file flow-rs/src/config/graphviz.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::interlayer::*; -use anyhow::Result; -use std::collections::{BTreeSet, HashMap}; -use std::fs::File; -use std::io::Write; -use std::path::PathBuf; -use std::process::Command; - -pub fn dump(config: &Config) -> Result<()> { - if let Ok(path) = std::env::var("MEGFLOW_DUMP") { - let dot = dump_dot(config); - let path = PathBuf::from(path); - let mut f = File::create(&path)?; - write!(f, "{}", dot)?; - let output = Command::new("dot").arg("-Tpng").arg(&path).output()?; - std::fs::write(&path, output.stdout)?; - } - Ok(()) -} - -fn dump_dot(config: &Config) -> String { - let mut buf = vec![]; - let mut rename = HashMap::new(); - let mut flatten_ports = HashMap::new(); - let mut dc = 0; - let mut nc = 0; - let mut mapping = |name| { - let id = rename.entry(name).or_insert(nc); - if id == &nc { - nc += 1; - } - *id - }; - let is_graph = |name: &str| config.graphs.iter().any(|x| x.name == name); - // flatten subgraph i/o ports - for graph in &config.graphs { - for pname in graph.inputs.iter().chain(graph.outputs.iter()) { - let conn = graph.connections.get(pname).unwrap(); - flatten_ports.insert( - format!("{}:{}", graph.name, pname), - conn.tx - .iter() - .chain(conn.rx.iter()) - .map(|x| { - if config.nodes.contains_key(&x.node_name) { - ("global".to_owned(), x.node_name.clone()) - } else { - (graph.name.clone(), x.node_name.clone()) - } - }) - .collect::>(), - ); - } - } - buf.push(format!("digraph {} {{", config.main)); - - // write subgraph into buf - for (i, graph) in config.graphs.iter().enumerate() { - let is_subgraph = graph.name != config.main; - if is_subgraph { - buf.push(format!("subgraph cluster_{} {{", i)); - buf.push("style=filled;color=lightgrey;node [style=filled,color=white];".to_string()); - } - // write nodes into buf - for (name, _) in graph - .nodes - .iter() - .filter(|(_, config)| !config.entity.ty.iter().any(|x| is_graph(x))) - { - let id = mapping((graph.name.clone(), name)); - buf.push(format!("n{} [label=\"{}\"]", id, name)); - } - // write connections into buf - for (name, conn) in &graph.connections { - macro_rules! extract { - ($x: ident, $x_len: ident) => { - let mut $x = vec![]; - for p in &conn.$x { - for ty in &p.node_type { - let pname = format!("{}:{}", ty, p.port_name); - if flatten_ports.contains_key(&pname) { - let flatten_ports = flatten_ports.get(&pname).unwrap(); - let mut flatten_ports = - flatten_ports.iter().map(|p| mapping((p.0.clone(), &p.1))).collect(); - $x.append(&mut flatten_ports); - } else if config.nodes.contains_key(&p.node_name) { - $x.push(mapping(("global".to_owned(), &p.node_name))); - } else { - $x.push(mapping((graph.name.clone(), &p.node_name))); - } - } - - } - if $x.is_empty() { - if is_subgraph { - continue; - } else { - let id = mapping((graph.name.clone(), name)); - buf.push(format!( - "n{} [label=\"{}\", shape=circle,fillcolor=black, style=filled, fontcolor=white]", - id, name - )); - $x.push(id); - } - } - let ($x_len, $x) = ( - $x.len(), - $x.iter() - .map(|x| format!("n{}", x)) - .collect::>() - .into_iter() - .collect::>() - .join(","), - ); - }; - } - - extract!(tx, tx_len); - extract!(rx, rx_len); - - if tx_len == 1 && rx_len == 1 { - buf.push(format!("{} -> {}", tx, rx)); - } else { - buf.push(format!("dc{} [shape=point,width=0.01,height=0.01]", dc)); - buf.push(format!("{} -> dc{} [dir=none]", tx, dc)); - buf.push(format!("dc{} -> {}", dc, rx)); - dc += 1; - } - } - - if is_subgraph { - buf.push(format!("label = \"{}\"", graph.name)); - buf.push("}".to_string()); - } - } - // write nodes in global into buf - for (name, _) in config - .nodes - .iter() - .filter(|(_, config)| !config.entity.ty.iter().any(|x| is_graph(x))) - { - let id = mapping(("global".to_owned(), name)); - buf.push(format!("n{} [label=\"{}\"]", id, name)); - } - buf.push("}".to_string()); - buf.join("\n") -} diff --git a/flow-rs/src/config/insert.rs b/flow-rs/src/config/insert.rs deleted file mode 100644 index 3f0ad97..0000000 --- a/flow-rs/src/config/insert.rs +++ /dev/null @@ -1,221 +0,0 @@ -/** - * \file flow-rs/src/config/insert.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::*; -use std::collections::{BTreeSet, HashMap}; - -fn global_res_impl<'a>( - name: String, - cfg: &'a mut interlayer::Config, - global: &[String], - visit: &mut HashMap, -) -> Vec { - let graph = cfg.graphs.iter().find(|graph| graph.name == name).unwrap(); - if visit[&graph.name] { - return graph.global_res.clone(); - } - *visit.get_mut(&graph.name).unwrap() = true; - - let mut capture = BTreeSet::new(); - let mut tmp_mapping = HashMap::new(); - - for node in graph.nodes.values() { - for ty in &node.entity.ty { - if !visit.contains_key(ty) { - node.res - .iter() - .filter(|x| global.contains(x)) - .for_each(|x| { - capture.insert(x.clone()); - }); - } - } - } - for name in graph - .nodes - .values() - .flat_map(|x| x.entity.ty.iter()) - .filter(|x| visit.contains_key(*x)) - .map(|x| x.to_owned()) - .collect::>() - { - global_res_impl(name.to_owned(), cfg, global, visit) - .into_iter() - .for_each(|x| { - capture.insert(x.clone()); - tmp_mapping - .entry(name.to_owned()) - .or_insert_with(BTreeSet::new) - .insert(x); - }); - } - - let graph = cfg - .graphs - .iter_mut() - .find(|graph| graph.name == name) - .unwrap(); - - for node in graph.nodes.values_mut() { - for name in &node.entity.ty { - if visit.contains_key(name) { - if let Some(graph) = tmp_mapping.get(name) { - node.res.append(&mut graph.iter().cloned().collect()); - } - } - } - } - - graph.global_res = capture.into_iter().collect(); - graph.global_res.clone() -} - -pub fn global_res(cfg: &mut interlayer::Config) { - let global_res_names: Vec<_> = cfg.resources.keys().cloned().collect(); - let mut visit: HashMap<_, _> = cfg - .graphs - .iter() - .map(|graph| (graph.name.clone(), false)) - .collect(); - - for name in visit.keys().cloned().collect::>() { - global_res_impl(name, cfg, global_res_names.as_slice(), &mut visit); - } -} - -pub fn bcast( - id: &str, - src: &mut interlayer::Connection, - connections: &mut HashMap, - nodes: &mut HashMap, -) { - if src.rx.len() > 1 { - let node_name = format!("__{}xBcast__", id); - let bcast_p = |port_name: &str| interlayer::Port { - node_type: vec!["Bcast".to_owned()], - node_name: node_name.clone(), - port_type: interlayer::PortTy::Unit, - port_name: port_name.to_owned(), - port_tag: None, - }; - - let rx = std::mem::replace(&mut src.rx, vec![bcast_p("inp")]); - - for (i, p) in rx.into_iter().enumerate() { - let name = format!("__{}xBcastxOut{}__", id, i); - connections.insert( - name, - interlayer::Connection { - cap: src.cap, - rx: vec![p], - tx: vec![bcast_p("[out]")], - }, - ); - } - - nodes.insert( - node_name.clone(), - interlayer::Node { - entity: interlayer::Entity { - name: node_name, - ty: vec!["Bcast".to_owned()], - args: Default::default(), - }, - cloned: Some(1), - res: vec![], - is_dyn: false, - inputs: vec!["inp".to_owned()], - outputs: vec!["[out]".to_owned()], - is_shared: false, - }, - ); - } -} - -pub fn dyn_inp_trans( - src: &mut presentation::NamedConn, - connections: &mut HashMap, - nodes: &mut HashMap, - shared_nodes: &mut HashMap, -) -> Result<()> { - for p in &mut src.conn.ports { - let ((n, _), _) = interlayer::Port::parse(p.as_str())?; - if let Some(node) = nodes.get_mut(n) { - if node.is_dyn { - let conn_name = format!("__{}xDynOutTransform__", src.name); - let node_name = conn_name.clone(); - *p = format!("{}:inp", node_name); - let mut tmp_conn = presentation::Connection { - cap: src.conn.cap, - ports: vec![], - }; - let tmp_node = interlayer::Node { - entity: interlayer::Entity { - name: node_name, - ty: vec!["DynOutTransform".to_owned()], - args: toml::value::Table::new(), - }, - res: Default::default(), - cloned: Some(1), - inputs: vec!["inp".to_owned()], - outputs: vec!["dyn@out".to_owned()], - is_dyn: false, - is_shared: false, - }; - tmp_conn.ports.push(p.to_owned()); - nodes.insert(tmp_node.entity.name.clone(), tmp_node); - let conn = translate_conn(tmp_conn, nodes, shared_nodes)?; - connections.insert(conn_name, conn); - } - } - } - Ok(()) -} - -pub fn dyn_out_trans( - src: &mut presentation::NamedConn, - connections: &mut HashMap, - nodes: &mut HashMap, - shared_nodes: &mut HashMap, -) -> Result<()> { - for p in &mut src.conn.ports { - let ((n, _), _) = interlayer::Port::parse(p.as_str())?; - if let Some(node) = nodes.get_mut(n) { - if node.is_dyn { - let conn_name = format!("__{}xDynInTransform__", src.name); - let node_name = conn_name.clone(); - *p = format!("{}:inp", node_name); - let mut tmp_conn = presentation::Connection { - cap: src.conn.cap, - ports: vec![], - }; - let tmp_node = interlayer::Node { - entity: interlayer::Entity { - name: node_name, - ty: vec!["DynInTransform".to_owned()], - args: toml::value::Table::new(), - }, - res: Default::default(), - cloned: Some(1), - inputs: vec!["dyn@inp".to_owned()], - outputs: vec!["out".to_owned()], - is_dyn: false, - is_shared: false, - }; - tmp_conn.ports.push(p.to_owned()); - nodes.insert(tmp_node.entity.name.clone(), tmp_node); - let conn = translate_conn(tmp_conn, nodes, shared_nodes)?; - connections.insert(conn_name, conn); - } - } - } - - Ok(()) -} diff --git a/flow-rs/src/config/interlayer.rs b/flow-rs/src/config/interlayer.rs deleted file mode 100644 index 77b9e28..0000000 --- a/flow-rs/src/config/interlayer.rs +++ /dev/null @@ -1,92 +0,0 @@ -/** - * \file flow-rs/src/config/interlayer.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::{anyhow, Result}; -use std::collections::HashMap; -use toml::value::Table; - -#[derive(Clone, Copy, Debug)] -pub enum PortTy { - Unit, - List, - Dyn, -} - -#[derive(Clone, Debug)] -pub struct Port { - pub node_type: Vec, - pub node_name: String, - pub port_name: String, - pub port_type: PortTy, - pub port_tag: Option, -} - -#[derive(Clone, Debug)] -pub struct Connection { - pub cap: usize, - pub tx: Vec, - pub rx: Vec, -} - -#[derive(Clone, Debug)] -pub struct Entity { - pub name: String, - pub ty: Vec, - pub args: Table, -} - -#[derive(Clone, Debug)] -pub struct Node { - pub entity: Entity, - pub res: Vec, - pub cloned: Option, - pub inputs: Vec, - pub outputs: Vec, - pub is_dyn: bool, - pub is_shared: bool, -} - -#[derive(Clone, Debug)] -pub struct Graph { - pub name: String, - pub resources: HashMap, - pub nodes: HashMap, - pub inputs: Vec, - pub outputs: Vec, - pub connections: HashMap, - pub is_shared: bool, - pub global_res: Vec, -} - -#[derive(Debug)] -pub struct Config { - pub resources: HashMap, - pub nodes: HashMap, - pub graphs: Vec, - pub main: String, -} - -impl Port { - pub fn parse(name: &str) -> Result<((&str, &str), Option)> { - let mut iter = name.splitn(3, ':'); - Ok(( - iter.next() - .zip(iter.next()) - .ok_or_else(|| anyhow!("unexpected port format {}", name))?, - iter.next() - .map(|s| s.parse()) - .map_or(Ok(None), |r| r.map(Some))?, - )) - } - - pub fn is_dyn(&self) -> bool { - matches!(self.port_type, PortTy::Dyn) - } -} diff --git a/flow-rs/src/config/mod.rs b/flow-rs/src/config/mod.rs deleted file mode 100644 index 81a0d8b..0000000 --- a/flow-rs/src/config/mod.rs +++ /dev/null @@ -1,234 +0,0 @@ -/** - * \file flow-rs/src/config/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -pub mod graphviz; -mod insert; -pub mod interlayer; -pub mod presentation; - -use crate::node::{inputs, outputs}; -use anyhow::{anyhow, Result}; -use std::collections::HashMap; - -pub(crate) struct PortUtility { - pub(crate) ty: interlayer::PortTy, - pub(crate) mapping: fn(&str) -> String, -} -pub(crate) static MAPPING: &[PortUtility] = &[ - PortUtility { - ty: interlayer::PortTy::Unit, - mapping: |p| p.to_owned(), - }, - PortUtility { - ty: interlayer::PortTy::List, - mapping: |p| format!("[{}]", p), - }, - PortUtility { - ty: interlayer::PortTy::Dyn, - mapping: |p| format!("dyn@{}", p), - }, -]; - -fn translate_node( - local_key: u64, - is_shared: bool, - p: presentation::Node, -) -> Result { - let ty = p.entity.ty.split('|').next().unwrap().trim(); - let inputs = inputs(local_key, ty)?.into_iter().collect(); - let outputs = outputs(local_key, ty)?.into_iter().collect(); - Ok(interlayer::Node { - entity: interlayer::Entity { - name: p.entity.name, - ty: p - .entity - .ty - .split('|') - .map(|x| x.trim().to_owned()) - .collect(), - args: p.entity.args, - }, - res: p.res, - cloned: p.cloned, - inputs, - outputs, - is_dyn: false, - is_shared, - }) -} - -fn translate_conn( - p: presentation::Connection, - nodes: &mut HashMap, - shared_nodes: &mut HashMap, -) -> Result { - let mut rx = vec![]; - let mut tx = vec![]; - - if p.ports.is_empty() { - return Err(anyhow!("encountered an unused connections")); - } - - for port_s in p.ports { - let ((n, p), tag) = interlayer::Port::parse(port_s.as_str())?; - let mut parse = |node: &mut interlayer::Node| { - let mut find = false; - for utility in MAPPING { - let p = (utility.mapping)(p); - let port = interlayer::Port { - node_type: node.entity.ty.clone(), - node_name: node.entity.name.clone(), - port_name: p.clone(), - port_type: utility.ty, - port_tag: tag, - }; - if node.inputs.contains(&p) { - rx.push(port); - find = true; - break; - } else if node.outputs.contains(&p) { - tx.push(port); - find = true; - break; - } - } - if !find { - Err(anyhow!("unexpected port {}", port_s)) - } else { - Ok(()) - } - }; - if let Some(node) = nodes.get_mut(n) { - parse(node)?; - } else if let Some(node) = shared_nodes.get_mut(n) { - parse(node)?; - } - } - - let dyn_rxn = rx.iter().filter(|rx| rx.is_dyn()).count(); - let dyn_txn = tx.iter().filter(|tx| tx.is_dyn()).count(); - - if dyn_rxn > 0 { - if tx.len() > 1 { - return Err(anyhow!("dyn port shared with multiple subgraphs")); - } - if dyn_rxn > 1 { - return Err(anyhow!( - "the number of nodes sharing dyn rx port only could be equal to 1" - )); - } - for p in &tx { - let node = nodes - .get_mut(&p.node_name) - .expect("dyn share subgraph is not supported "); - node.is_dyn = true; - } - } - - if dyn_txn > 0 { - if rx.len() > 1 { - return Err(anyhow!("dyn port shared with multiple subgraphs")); - } - for p in &rx { - let node = nodes - .get_mut(&p.node_name) - .expect("dyn share subgraph is not supported "); - node.is_dyn = true; - } - } - - Ok(interlayer::Connection { cap: p.cap, rx, tx }) -} - -pub fn translate_graph( - local_key: u64, - mut p: presentation::Graph, - shared_nodes: &mut HashMap, -) -> Result { - let mut nodes = HashMap::new(); - let mut resources = HashMap::new(); - let mut inputs = vec![]; - let mut outputs = vec![]; - let mut connections = HashMap::new(); - - for node in std::mem::take(&mut p.nodes) { - nodes.insert( - node.entity.name.clone(), - translate_node(local_key, false, node)?, - ); - } - for res in std::mem::take(&mut p.resources) { - resources.insert(res.name.clone(), res); - } - - for (i, conn) in std::mem::take(&mut p.connections).into_iter().enumerate() { - let name = format!("__{}__", i); - let mut conn = translate_conn(conn, &mut nodes, shared_nodes)?; - insert::bcast(&name, &mut conn, &mut connections, &mut nodes); - connections.insert(name, conn); - } - - for mut input in std::mem::take(&mut p.inputs) { - inputs.push(input.name.clone()); - insert::dyn_inp_trans(&mut input, &mut connections, &mut nodes, shared_nodes)?; - let mut conn = translate_conn(input.conn, &mut nodes, shared_nodes)?; - insert::bcast(&input.name, &mut conn, &mut connections, &mut nodes); - connections.insert(input.name, conn); - } - - for mut output in std::mem::take(&mut p.outputs) { - outputs.push(output.name.clone()); - insert::dyn_out_trans(&mut output, &mut connections, &mut nodes, shared_nodes)?; - let conn = translate_conn(output.conn, &mut nodes, shared_nodes)?; - connections.insert(output.name, conn); - } - - Ok(interlayer::Graph { - is_shared: shared_nodes.values().any(|n| n.entity.ty.contains(&p.name)), - name: p.name, - resources, - nodes, - inputs, - outputs, - connections, - global_res: vec![], - }) -} - -pub fn translate_config(local_key: u64, p: presentation::Config) -> Result { - let mut graphs = vec![]; - let mut nodes = HashMap::new(); - let mut resources = HashMap::new(); - - for node in p.nodes { - nodes.insert( - node.entity.name.clone(), - translate_node(local_key, true, node)?, - ); - } - - for graph in p.graphs { - graphs.push(translate_graph(local_key, graph, &mut nodes)?); - } - - for res in p.resources { - resources.insert(res.name.clone(), res); - } - - let mut cfg = interlayer::Config { - graphs, - resources, - nodes, - main: p.main, - }; - insert::global_res(&mut cfg); - - Ok(cfg) -} diff --git a/flow-rs/src/config/presentation.rs b/flow-rs/src/config/presentation.rs deleted file mode 100644 index 1bc77b1..0000000 --- a/flow-rs/src/config/presentation.rs +++ /dev/null @@ -1,70 +0,0 @@ -/** - * \file flow-rs/src/config/presentation.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use serde::Deserialize; -use toml::value::Table; - -#[derive(Deserialize, Clone, Debug)] -#[serde(deny_unknown_fields)] -pub struct Connection { - pub cap: usize, - pub ports: Vec, -} - -#[derive(Deserialize, Clone, Debug)] -pub struct NamedConn { - pub name: String, - #[serde(flatten)] - pub conn: Connection, -} - -#[derive(Deserialize, Clone, Debug)] -pub struct Entity { - pub name: String, - pub ty: String, - #[serde(default, flatten)] - pub args: Table, -} - -#[derive(Deserialize, Clone, Debug)] -pub struct Node { - #[serde(flatten)] - pub entity: Entity, - #[serde(default)] - pub res: Vec, - pub cloned: Option, -} - -#[derive(Deserialize, Clone, Debug)] -#[serde(deny_unknown_fields)] -pub struct Graph { - pub name: String, - #[serde(default)] - pub resources: Vec, - #[serde(default)] - pub nodes: Vec, - #[serde(default)] - pub inputs: Vec, - #[serde(default)] - pub outputs: Vec, - #[serde(default)] - pub connections: Vec, -} - -#[derive(Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Config { - #[serde(default)] - pub resources: Vec, - #[serde(default)] - pub nodes: Vec, - pub graphs: Vec, - pub main: String, -} diff --git a/flow-rs/src/debug/feature.rs b/flow-rs/src/debug/feature.rs deleted file mode 100644 index 6881b79..0000000 --- a/flow-rs/src/debug/feature.rs +++ /dev/null @@ -1,70 +0,0 @@ -/** - * \file flow-rs/src/debug/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use event_listener::Event; -use std::sync::atomic::{AtomicBool, Ordering}; - -pub struct Feature { - enable: AtomicBool, - lock_ops: Event, -} - -impl Feature { - pub const fn new() -> Feature { - Feature { - enable: AtomicBool::new(false), - lock_ops: Event::new(), - } - } - - pub fn enable(&self) -> bool { - self.enable.load(Ordering::Relaxed) - } - - pub fn disable(&self) { - self.enable.store(false, Ordering::Relaxed); - } - - pub fn notify(&self) { - if self - .enable - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) - .is_ok() - { - self.lock_ops.notify(usize::MAX); - } - } - #[allow(dead_code)] - pub async fn wait(&self) { - let mut listener = None; - - loop { - if self.enable.load(Ordering::Relaxed) { - return; - } - - match listener.take() { - None => { - listener = Some(self.lock_ops.listen()); - } - Some(l) => { - l.await; - } - } - } - } -} - -pub struct FeatureCommand { - pub start: Box, - pub stop: Box, - pub disable: Box, -} -crate::collect!(String, FeatureCommand); diff --git a/flow-rs/src/debug/mod.rs b/flow-rs/src/debug/mod.rs deleted file mode 100644 index 37c3cad..0000000 --- a/flow-rs/src/debug/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -/** - * \file flow-rs/src/debug/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod feature; -mod protocol; -mod server; - -use crate::prelude::feature; -pub use protocol::*; -pub use server::{Server, PORT}; - -feature!(QPS, { ratio: f32 }); diff --git a/flow-rs/src/debug/protocol.rs b/flow-rs/src/debug/protocol.rs deleted file mode 100644 index 685250e..0000000 --- a/flow-rs/src/debug/protocol.rs +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file flow-rs/src/debug/protocol.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use serde::{Deserialize, Serialize}; -use serde_json::{Map, Value}; - -#[derive(Serialize, Deserialize)] -pub struct ProtocolMessage { - pub ty: String, - #[serde(flatten, default)] - pub others: Map, -} - -#[derive(Serialize, Deserialize)] -pub struct RequestMessage { - pub feature: String, - pub seq_id: usize, - pub command: String, - #[serde(flatten, default)] - pub args: Map, -} - -#[derive(Serialize, Deserialize)] -pub struct EventMessage { - pub event: String, - #[serde(flatten, default)] - pub args: Map, -} - -#[derive(Serialize, Deserialize)] -pub struct ResponseMessage { - pub success: bool, - pub feature: String, - pub seq_id: usize, - pub command: String, - #[serde(flatten, default)] - pub args: Map, -} -// message -pub const TYPE_REQUEST: &str = "request"; -pub const TYPE_EVENT: &str = "event"; -pub const TYPE_RESPONSE: &str = "response"; -// event -pub const EVENT_INITIALIZED: &str = "initialized"; -pub const EVENT_TERMINATED: &str = "terminated"; -pub const EVENT_STOP: &str = "stop"; -// command -pub const CMD_START: &str = "start"; -pub const CMD_STOP: &str = "stop"; -pub const CMD_NOOP: &str = "noop"; diff --git a/flow-rs/src/debug/server.rs b/flow-rs/src/debug/server.rs deleted file mode 100644 index 68522fe..0000000 --- a/flow-rs/src/debug/server.rs +++ /dev/null @@ -1,148 +0,0 @@ -/** - * \file flow-rs/src/debug/server.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::feature::FeatureCommand; -use super::protocol::*; -use crate::{registry::Collect, rt::channel::*}; -use anyhow::{anyhow, Result}; -use futures_util::{SinkExt, StreamExt}; -use std::sync::atomic::{AtomicBool, Ordering}; -use warp::ws::{Message, WebSocket}; -use warp::Filter; - -lazy_static::lazy_static! { - pub static ref PORT: (Sender, Receiver) = unbounded(); -} - -static CONNECTED: AtomicBool = AtomicBool::new(false); - -async fn connected(ws: WebSocket, graph: String) -> Result<()> { - let (mut tx, mut rx) = ws.split(); - - while PORT.1.try_recv().is_ok() {} - let init_event = serde_json::to_string(&serde_json::json!({ - "ty": TYPE_EVENT, - "event": EVENT_INITIALIZED, - "features": FeatureCommand::registry_global().keys(), - "graph": graph - }))?; - tx.send(Message::text(init_event)).await?; - - flow_rs::rt::task::spawn(async move { - while let Ok(msg) = PORT.1.recv().await { - if msg.ty == "__CLOSED__" { - tx.send(Message::text( - serde_json::to_string( - &serde_json::json!({ "ty": TYPE_EVENT, "event": EVENT_TERMINATED }), - ) - .unwrap(), - )) - .await - .ok(); - break; - } - if tx - .send(Message::text(serde_json::to_string(&msg).unwrap())) - .await - .is_err() - { - break; - } - } - }); - - while let Some(Ok(msg)) = rx.next().await { - if let Ok(s) = msg.to_str() { - let protocol: ProtocolMessage = serde_json::from_str(s)?; - match protocol.ty.as_str() { - TYPE_REQUEST => { - let req: RequestMessage = - serde_json::from_value(serde_json::Value::Object(protocol.others))?; - dowith_request(req).await?; - } - TYPE_EVENT => { - let event: EventMessage = - serde_json::from_value(serde_json::Value::Object(protocol.others))?; - dowith_event(event).await?; - } - _ => unreachable!(), - } - } - } - - Ok(()) -} - -async fn reset() { - FeatureCommand::registry_global().for_each(|cmd| { - (cmd.disable)(); - }); - PORT.0 - .send(ProtocolMessage { - ty: "__CLOSED__".to_owned(), - others: Default::default(), - }) - .await - .unwrap(); - CONNECTED.store(false, Ordering::SeqCst); -} - -async fn dowith_event(_: EventMessage) -> Result<()> { - unimplemented!() -} -async fn dowith_request(req: RequestMessage) -> Result<()> { - match req.command.as_str() { - CMD_START => { - let command = FeatureCommand::registry_global() - .get(&req.feature) - .ok_or_else(|| anyhow!("feature[{}] not found", req.feature))?; - (command.start)(req.seq_id, serde_json::Value::Object(req.args)); - } - CMD_STOP => { - let command = FeatureCommand::registry_global() - .get(&req.feature) - .ok_or_else(|| anyhow!("feature[{}] not found", req.feature))?; - (command.stop)(req.seq_id); - } - _ => unreachable!(), - } - Ok(()) -} - -/// A server for debug -pub struct Server { - port: u16, - graph: String, -} - -impl Server { - pub fn new(graph: String, port: u16) -> Server { - Server { graph, port } - } - /// listen on 0.0.0.0:`self.port` - pub async fn listen(self) { - let graph = self.graph.clone(); - let graph = warp::any().map(move || graph.clone()); - let routes = warp::path("debugger").and(warp::ws()).and(graph).map( - |ws: warp::ws::Ws, graph: String| { - ws.on_upgrade(move |websocket| async move { - if CONNECTED - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) - .is_ok() - { - connected(websocket, graph.clone()).await.ok(); - reset().await; - } - }) - }, - ); - warp::serve(routes).run(([0, 0, 0, 0], self.port)).await; - } -} diff --git a/flow-rs/src/envelope/any_envelope.rs b/flow-rs/src/envelope/any_envelope.rs deleted file mode 100644 index 19ee9fa..0000000 --- a/flow-rs/src/envelope/any_envelope.rs +++ /dev/null @@ -1,74 +0,0 @@ -/** - * \file flow-rs/src/envelope/any_envelope.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::EnvelopeInfo; -use dyn_clone::{clone_trait_object, DynClone}; -use std::any::{Any, TypeId}; - -pub trait AnyEnvelope: Any + DynClone + 'static { - fn is_some(&self) -> bool; - fn is_none(&self) -> bool; - fn info(&self) -> &EnvelopeInfo; - fn info_mut(&mut self) -> &mut EnvelopeInfo; -} -clone_trait_object!(AnyEnvelope); - -impl dyn AnyEnvelope { - pub fn is(&self) -> bool { - let t = TypeId::of::(); - let boxed = self.type_id(); - - t == boxed - } - - pub fn downcast_ref(&self) -> Option<&T> { - if self.is::() { - unsafe { Some(&*(self as *const dyn AnyEnvelope as *const T)) } - } else { - None - } - } - - pub fn downcast_mut(&mut self) -> Option<&mut T> { - if self.is::() { - unsafe { Some(&mut *(self as *mut dyn AnyEnvelope as *mut T)) } - } else { - None - } - } -} - -impl dyn AnyEnvelope + Send + Sync { - pub fn is(&self) -> bool { - ::is::(self) - } - - pub fn downcast_ref(&self) -> Option<&T> { - ::downcast_ref::(self) - } - - pub fn downcast_mut(&mut self) -> Option<&mut T> { - ::downcast_mut::(self) - } -} - -impl dyn AnyEnvelope + Send { - pub fn is(&self) -> bool { - ::is::(self) - } - - pub fn downcast_ref(&self) -> Option<&T> { - ::downcast_ref::(self) - } - - pub fn downcast_mut(&mut self) -> Option<&mut T> { - ::downcast_mut::(self) - } -} diff --git a/flow-rs/src/envelope/envelope.rs b/flow-rs/src/envelope/envelope.rs deleted file mode 100644 index 8571ac5..0000000 --- a/flow-rs/src/envelope/envelope.rs +++ /dev/null @@ -1,173 +0,0 @@ -/** - * \file flow-rs/src/envelope/envelope.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::{AnyEnvelope, SealedEnvelope}; -use std::sync::Arc; - -/// `EnvelopeInfo` is a type that represents common information for a message -#[derive(Default, Clone)] -pub struct EnvelopeInfo { - /// Sequence id, and could be repeat - pub partial_id: Option, - /// Address where the envelope comes from - pub from_addr: Option, - /// Address where the envelope send to - pub to_addr: Option, - /// Address where the envelope transfer to - pub transfer_addr: Option, - /// Extra info about the envelope - pub tag: Option, -} -/// `Envelope` is a type that contains a info:`EnvelopeInfo` and a message:`M` -/// -/// # Examples -/// -/// ```rust -/// # use std::error::Error; -/// # use flow_rs::envelope::*; -/// # fn main() -> Result<(), Box>{ -/// let envelope = Envelope::new(1usize); -/// let mut sealed_envelope = envelope.seal(); -/// assert!(sealed_envelope.downcast_mut::>().is_some()); -/// let mut envelope = sealed_envelope.downcast_mut::>().unwrap().take(); -/// let msg = envelope.unpack(); -/// assert_eq!(msg, 1); -/// # -/// # Ok(()) -/// # } -/// ``` -pub struct Envelope { - info: Arc, // cow - msg: Option, -} - -impl Envelope -where - M: 'static + Send + Clone, -{ - /// Create a envelope with message - pub fn new(msg: M) -> Envelope { - Self::with_info(msg, Default::default()) - } - pub fn with_info(msg: M, info: EnvelopeInfo) -> Envelope { - Envelope { - msg: Some(msg), - info: Arc::new(info), - } - } - /// Create a envelope without message - pub fn empty() -> Envelope { - Envelope { - msg: None, - info: Default::default(), - } - } - /// Convert the `Envelope` to `SealedEnvelope` - pub fn seal(self) -> SealedEnvelope { - Box::new(self) - } - /// Take the message from the envelope - /// - /// # Panics - /// - /// If the envelope has no message - pub fn unpack(&mut self) -> M { - self.msg.take().expect("message not found") - } - /// Repack a message, and return a new envelope with the message - pub fn repack(&self, msg: T) -> Envelope { - Envelope { - msg: Some(msg), - info: self.info.clone(), - } - } - /// Repack a message in place - pub fn repack_inplace(&mut self, msg: M) { - self.msg = Some(msg); - } - /// Takes the message out of the envelope, leaving a `None` in its place - pub fn take(&mut self) -> Envelope { - Envelope { - msg: self.msg.take(), - info: self.info.clone(), - } - } - /// Return a reference to the message - /// - /// # Panics - /// - /// If the envelope has no message - pub fn get_ref(&self) -> &M { - self.msg.as_ref().expect("message not found") - } - /// Return a mutable reference to the message - /// - /// # Panics - /// - /// If the envelope has no message - pub fn get_mut(&mut self) -> &mut M { - self.msg.as_mut().expect("message not found") - } -} - -impl Clone for Envelope -where - M: Clone, -{ - fn clone(&self) -> Self { - Envelope { - msg: self.msg.clone(), - info: self.info.clone(), - } - } -} - -impl AnyEnvelope for Envelope -where - M: 'static + Clone + Send, -{ - fn is_none(&self) -> bool { - self.msg.is_none() - } - fn is_some(&self) -> bool { - self.msg.is_some() - } - fn info(&self) -> &EnvelopeInfo { - &self.info - } - fn info_mut(&mut self) -> &mut EnvelopeInfo { - Arc::make_mut(&mut self.info) - } -} - -#[doc(hidden)] -#[derive(Clone)] -pub struct DummyEnvelope; - -impl DummyEnvelope { - pub fn seal(self) -> SealedEnvelope { - Box::new(self) - } -} - -impl AnyEnvelope for DummyEnvelope { - fn is_none(&self) -> bool { - true - } - fn is_some(&self) -> bool { - false - } - fn info(&self) -> &EnvelopeInfo { - unimplemented!() - } - fn info_mut(&mut self) -> &mut EnvelopeInfo { - unimplemented!() - } -} diff --git a/flow-rs/src/envelope/mod.rs b/flow-rs/src/envelope/mod.rs deleted file mode 100644 index ab01448..0000000 --- a/flow-rs/src/envelope/mod.rs +++ /dev/null @@ -1,33 +0,0 @@ -/** - * \file flow-rs/src/envelope/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod any_envelope; -#[allow(clippy::module_inception)] -mod envelope; - -#[doc(hidden)] -pub use any_envelope::*; -pub use envelope::*; - -pub type SealedEnvelope = Box; - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_basis() { - let envelope = DummyEnvelope {}.seal(); - assert!(envelope.is::()); - let envelope = Envelope::new(0f32).seal(); - assert!(!envelope.is::()); - assert!(envelope.is::>()); - } -} diff --git a/flow-rs/src/future.rs b/flow-rs/src/future.rs deleted file mode 100644 index cbfce12..0000000 --- a/flow-rs/src/future.rs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * \file flow-rs/src/future.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use futures_util::stream::{FuturesUnordered, StreamExt}; -use std::future::Future; - -// https://users.rust-lang.org/t/usage-of-futures-select-ok/46068/10 -pub(crate) async fn select_ok(futs: impl IntoIterator) -> Result -where - F: Future>, -{ - let mut futs: FuturesUnordered = futs.into_iter().collect(); - - let mut last_error: Option = None; - while let Some(next) = futs.next().await { - match next { - Ok(ok) => return Ok(ok), - Err(err) => { - last_error = Some(err); - } - } - } - Err(last_error.expect("Empty iterator.")) -} - -#[cfg(test)] -mod test { - use super::*; - use flow_rs::rt::channel::unbounded; - - #[flow_rs::rt::test] - async fn test_basis() { - let (s1, r1) = unbounded(); - let (s2, r2) = unbounded(); - - s1.send(1).await.ok(); - s2.send(2).await.ok(); - - let fut = vec![r1.recv(), r2.recv()]; - assert_eq!(select_ok(fut).await, Ok(1)); - let fut = vec![r1.recv(), r2.recv()]; - assert_eq!(select_ok(fut).await, Ok(2)); - - s1.send(1).await.ok(); - let fut = vec![r1.recv(), r2.recv()]; - assert_eq!(select_ok(fut).await, Ok(1)); - - drop(s1); - drop(s2); - - let fut = vec![r1.recv(), r2.recv()]; - assert!(select_ok(fut).await.is_err()); - } -} diff --git a/flow-rs/src/graph/channel.rs b/flow-rs/src/graph/channel.rs deleted file mode 100644 index f3e459c..0000000 --- a/flow-rs/src/graph/channel.rs +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file flow-rs/src/graph/channel.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::channel::ChannelStorage; -use crate::config::interlayer as config; -use anyhow::Result; - -#[derive(Clone)] -pub struct AnyChannel { - storage: Option, - info: config::Connection, -} - -impl AnyChannel { - pub fn new(cfg: &config::Connection) -> Result { - Ok(AnyChannel { - storage: None, - info: cfg.clone(), - }) - } - - pub fn set(&mut self, storage: ChannelStorage) { - self.storage = Some(storage) - } - - pub fn make(&self) -> ChannelStorage { - ChannelStorage::bound(self.info.cap) - } - - pub fn get(&self) -> &ChannelStorage { - self.storage.as_ref().unwrap() - } - - #[allow(dead_code)] - pub fn get_mut(&mut self) -> &mut ChannelStorage { - self.storage.as_mut().unwrap() - } - - pub fn info(&self) -> &config::Connection { - &self.info - } -} diff --git a/flow-rs/src/graph/context.rs b/flow-rs/src/graph/context.rs deleted file mode 100644 index cd65017..0000000 --- a/flow-rs/src/graph/context.rs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * \file flow-rs/src/graph/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use event_listener::Event; -use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; -use std::sync::Arc; - -pub struct ContextInner { - pub name: String, - pub ty: String, - pub local_key: u64, - pub id: u64, - lock_ops: Event, - is_closed: AtomicBool, -} - -pub type Context = Arc; - -impl ContextInner { - pub fn close(&self) { - if self - .is_closed - .compare_exchange(false, true, Ordering::Release, Ordering::Relaxed) - .is_ok() - { - self.lock_ops.notify(usize::MAX); - } - } - pub fn is_closed(&self) -> bool { - self.is_closed.load(Ordering::Relaxed) - } - pub async fn wait(&self) { - let mut listener = None; - - loop { - if self.is_closed.load(Ordering::Relaxed) { - return; - } - - match listener.take() { - None => { - listener = Some(self.lock_ops.listen()); - } - Some(l) => { - l.await; - } - } - } - } -} - -lazy_static::lazy_static! { - static ref GRAPH_ID: AtomicU64 = AtomicU64::new(0); -} - -pub(crate) fn context(name: String, ty: String, local_key: u64) -> Context { - Arc::new(ContextInner { - name, - ty, - local_key, - id: GRAPH_ID.fetch_add(1, Ordering::Relaxed), - lock_ops: Event::new(), - is_closed: AtomicBool::new(false), - }) -} diff --git a/flow-rs/src/graph/debug.rs b/flow-rs/src/graph/debug.rs deleted file mode 100644 index 259cd9e..0000000 --- a/flow-rs/src/graph/debug.rs +++ /dev/null @@ -1,132 +0,0 @@ -/** - * \file flow-rs/src/graph/debug.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::Graph; -use crate::debug::*; -use crate::rt::task::JoinHandle; -use futures_util::{pin_mut, select, FutureExt}; -use serde::Serialize; -use std::collections::HashMap; - -#[derive(Serialize)] -struct NodeQps { - name: String, - qps: HashMap, // size, qps - is_block: bool, -} - -impl Graph { - pub(super) fn dmon(&self) -> JoinHandle<()> { - let conns: Vec<_> = self.conns.values().cloned().collect(); - let ctx = self.ctx.clone(); - let mut first = true; // drop qps result fetched first - crate::rt::task::spawn(async move { - let wait_graph = ctx.wait().fuse(); - pin_mut!(wait_graph); - 'start: while !ctx.is_closed() { - if !QPS.enable() { - first = true; - } - let wait_qps = QPS.wait().fuse(); - pin_mut!(wait_qps); - select! { - _ = wait_qps => {}, - _ = wait_graph => break 'start, - } - - let args = QPS_args - .read() - .unwrap() - .iter() - .map(|(k, v)| (*k, v.ratio)) - .next(); - if let Some((seq_id, ratio)) = args { - let div_ratio = 1f32 / ratio; - let mut nodes = HashMap::new(); - - loop { - for conn in &conns { - let is_block = conn.get().is_almost_full(); - let size = conn.get().len(); - let tx_qps = conn.get().swap_tx_counter() as f32 * ratio; - let rx_qps = conn.get().swap_rx_counter() as f32 * ratio; - if first { - continue; - } - for tx in &conn.info().tx { - let qps = nodes.entry(tx.node_name.clone()).or_insert(NodeQps { - name: tx.node_name.clone(), - qps: Default::default(), - is_block: false, - }); - qps.qps - .insert(tx.port_name.clone(), (size, tx_qps as usize)); - } - for rx in &conn.info().rx { - let qps = nodes.entry(rx.node_name.clone()).or_insert(NodeQps { - name: rx.node_name.clone(), - qps: Default::default(), - is_block: false, - }); - qps.qps - .insert(rx.port_name.clone(), (size, rx_qps as usize)); - qps.is_block = qps.is_block || is_block; - } - } - if first { - crate::rt::task::sleep(std::time::Duration::from_secs( - (1f32 * div_ratio) as u64, - )) - .await; - first = false; - } else { - break; - } - } - - let into_object = |json| match json { - serde_json::Value::Object(json) => json, - _ => unreachable!(), - }; - - let args = into_object(serde_json::json!({ - "graph": ctx.ty, - "nodes": nodes.into_iter().map(|(_, v)| v).collect::>(), - })); - - let others = into_object( - serde_json::to_value(ResponseMessage { - success: true, - feature: "QPS".to_owned(), - seq_id, - command: CMD_NOOP.to_owned(), - args, - }) - .unwrap(), - ); - crate::debug::PORT - .0 - .send(ProtocolMessage { - ty: TYPE_RESPONSE.to_owned(), - others, - }) - .await - .ok(); - flow_rs::rt::task::sleep(std::time::Duration::from_secs( - (1f32 * div_ratio) as u64, - )) - .await; - } else { - flow_rs::rt::task::sleep(std::time::Duration::from_secs(1)).await; - } - } - }) - } -} diff --git a/flow-rs/src/graph/mod.rs b/flow-rs/src/graph/mod.rs deleted file mode 100644 index 22ff836..0000000 --- a/flow-rs/src/graph/mod.rs +++ /dev/null @@ -1,345 +0,0 @@ -/** - * \file flow-rs/src/graph/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod channel; -mod context; -mod debug; -mod node; -mod subgraph; - -use crate::broker::Broker; -use crate::config::interlayer as config; -use crate::prelude::*; -use crate::rt::task::JoinHandle; -use anyhow::{anyhow, Result}; -use channel::*; -pub use context::*; -use futures_util::{pin_mut, select, FutureExt}; -use node::AnyNode; -use std::collections::HashMap; - -pub(crate) struct GraphSlice { - pub cons: Box Result + Send + Sync>, - pub info: NodeInfo, -} -crate::collect!(String, GraphSlice); - -/// Represents a graph with nodes and connections, which implement `Node` and `Actor`. -pub struct MainGraph { - graph: Graph, - global_resources: ResourceCollection, - global_ctx: Context, -} - -impl MainGraph { - pub(crate) fn new( - mut graph: Graph, - global_ctx: Context, - global_resources: ResourceCollection, - ) -> MainGraph { - let mut v = vec![]; - for name in &graph.inputs { - v.push((name.clone(), graph.conns[name].make())); - } - for name in &graph.outputs { - v.push((name.clone(), graph.conns[name].make())); - } - - for (name, conn) in v { - graph.set_port(name.as_str(), None, &conn); - } - MainGraph { - graph, - global_ctx, - global_resources, - } - } - /// Get an input port from the graph by name - pub fn input(&self, name: &str) -> Option { - self.graph.conns.get(name).map(|x| x.get().sender()) - } - /// Get an output port from the graph by name - pub fn output(&self, name: &str) -> Option { - self.graph.conns.get(name).map(|x| x.get().receiver()) - } - /// Stop the graph, it is equivalent to drop all inputs of the graph - pub fn stop(&mut self) { - self.graph.close() - } - /// Run the graph, and return a `JoinHandle`, which can be cancel or wait - pub fn start(&mut self) -> JoinHandle<()> { - let handle = self - .graph - .start(Some(std::mem::take(&mut self.global_resources))); - let global_ctx = self.global_ctx.clone(); - crate::rt::task::spawn(async move { - handle.await; - SharedProxy::registry_local() - .get(global_ctx.local_key) - .for_each(|proxy| proxy.close()); - global_ctx.close(); - - let handles = crate::node::SharedHandle::registry_local() - .get(global_ctx.local_key) - .to_vec(); - for handle in handles { - let handle = - std::sync::Arc::try_unwrap(handle).unwrap_or_else(|_| panic!("internal error")); - handle.0.await; - } - // clear graph local resources - finalize(global_ctx.local_key); - }) - } -} - -pub(crate) struct Graph { - nodes: HashMap, - conns: HashMap, - inputs: Vec, - outputs: Vec, - broker: Broker, - shares: HashMap, - ctx: Context, - resources: UniqueResourceCollection, - is_shared: bool, -} - -impl Graph { - pub(crate) fn load(ctx: Context, config: &config::Graph) -> Result { - let mut nodes = HashMap::new(); - let mut conns = HashMap::new(); - let mut broker = Broker::new(); - let mut shares = HashMap::new(); - - // global - let resources = UniqueResourceCollection::new(ctx.local_key, ctx.id, &config.resources); - - for (name, cfg) in &config.nodes { - if !cfg.is_dyn { - nodes.insert(name.clone(), AnyNode::new(ctx.local_key, cfg)?); - } - } - - for (k, cfg) in &config.connections { - let dyn_rxn = cfg.rx.iter().filter(|rx| rx.is_dyn()).count(); - let dyn_txn = cfg.tx.iter().filter(|tx| tx.is_dyn()).count(); - - if !config.inputs.contains(k) && !config.outputs.contains(k) { - if dyn_rxn > 0 && dyn_txn > 0 { - return Err(anyhow!("rx & tx of channel both are dyn")); - } - if (dyn_rxn > 0 && cfg.tx.len() != 1) || (dyn_txn > 0 && cfg.rx.len() != 1) { - return Err(anyhow!("dyn port shared with multiple subgraphs")); - } - if (dyn_rxn != 0 && dyn_rxn != cfg.rx.len()) - || (dyn_txn != 0 && dyn_txn != cfg.tx.len()) - { - return Err(anyhow!("dyn port shared with multiple subgraphs")); - } - - if dyn_rxn > 0 || dyn_txn > 0 { - let subgraph = cfg - .rx - .iter() - .chain(cfg.tx.iter()) - .find(|p| !p.is_dyn()) - .unwrap(); - for port in cfg.rx.iter().chain(cfg.tx.iter()) { - if port.is_dyn() { - // add dyn subgraph resources into trigger node - let mut res = - config.nodes.get(&subgraph.node_name).unwrap().res.clone(); - let nodes = nodes.get_mut(&port.node_name).unwrap(); - let info = nodes.info_mut(); - info.res.append(&mut res); - for node in nodes.get_mut().iter_mut() { - let mut clients = vec![]; - for topic in &subgraph.node_type { - clients.push(broker.subscribe(topic.trim().to_owned())); - } - node.set_port_dynamic( - ctx.local_key, - &port.port_name, - subgraph.port_name.clone(), - cfg.cap, - clients, - ); - } - } - } - } else { - let mut channel = AnyChannel::new(cfg)?; - channel.set(channel.make()); - let info = channel.info(); - for port in info.rx.iter().chain(info.tx.iter()) { - if let Some(nodes) = nodes.get_mut(&port.node_name) { - for node in nodes.get_mut().iter_mut() { - node.set_port(&port.port_name, port.port_tag, channel.get()); - } - } else { - if config.is_shared { - return Err(anyhow!("nested shared graph is not support")); - } - let shared_proxy = - shares.entry(port.node_name.clone()).or_insert_with(|| { - SharedProxy::registry_local() - .get(ctx.local_key) - .get(&port.node_name) - .unwrap_or_else(|| { - panic!("unexpected node {}", port.node_name) - }) - .as_ref() - .clone() - }); - shared_proxy.set_port(&port.port_name, channel.get()); - } - } - conns.insert(k.clone(), channel); - } - } else { - if dyn_rxn > 0 || dyn_txn > 0 { - return Err(anyhow!("dyn inputs or outputs of graph")); - } - for port in cfg.rx.iter().chain(cfg.tx.iter()) { - if let Some(node) = config.nodes.get(&port.node_name) { - if node.is_dyn { - return Err(anyhow!( - "dyn nodes connect with inputs or outputs of graph" - )); - } - } - } - let channel = AnyChannel::new(cfg)?; - conns.insert(k.clone(), channel); - } - } - - Ok(Graph { - ctx, - resources, - nodes, - conns, - broker, - inputs: config.inputs.clone(), - outputs: config.outputs.clone(), - shares, - is_shared: config.is_shared, - }) - } - - pub(crate) fn start(&mut self, resource: Option) -> JoinHandle<()> { - let ext_resource = resource.unwrap_or_else(|| { - UniqueResourceCollection::new(self.ctx.local_key, self.ctx.id, &Default::default()) - .take_into_arc() - }); - let in_resource = std::mem::take(&mut self.resources); - let shares = std::mem::take(&mut self.shares); - for (_, shared) in shares { - shared.build(); - } - let mut handles = vec![self.broker.run()]; - let mut alone_tasks = vec![self.dmon()]; - let nodes: Vec<_> = self - .nodes - .values_mut() - .map(|node| { - let is_alone = node.info().inputs.is_empty() && node.info().outputs.is_empty(); - let res_names: Vec<_> = node.info().res.to_vec(); - (is_alone, res_names, node.get_into()) - }) - .collect(); - - let context = self.ctx.clone(); - let inputs: Vec<_> = self - .inputs - .iter() - .map(|name| self.conns[name].get().clone()) - .collect(); - let outputs: Vec<_> = self - .outputs - .iter() - .map(|name| self.conns[name].get().clone()) - .collect(); - let direct_term = inputs - .iter() - .map(|input| input.sender_count()) - .sum::() - == 0; - - let handle = crate::rt::task::spawn(async move { - let res = ext_resource.chain(in_resource).await; - for (is_alone, res_names, nodes) in nodes { - for node in nodes { - let res = res.filter( - res_names - .iter() - .map(|x| x.as_str()) - .collect::>() - .as_slice(), - ); - if is_alone { - alone_tasks.push(node.start(context.clone(), res)); - } else { - handles.push(node.start(context.clone(), res)); - } - } - } - - let wait_ctx = context.wait().fuse(); - let wait_tasks = futures_util::future::join_all(handles).fuse(); - let mut wait_i = - futures_util::future::join_all(inputs.iter().map(|conn| conn.wait_rx_closed())) - .fuse(); - let mut wait_o = - futures_util::future::join_all(outputs.iter().map(|conn| conn.wait_tx_closed())) - .fuse(); - pin_mut!(wait_ctx, wait_tasks); - - let mut state = 0; - let mut cb = || { - state += 1; - if state == 3 { - context.close(); - } - }; - - loop { - select! { - _ = wait_ctx => { - for input in &inputs { - input.close(); - } - } - _ = wait_tasks => { - cb() - }, - _ = wait_o => { - cb() - }, - _ = wait_i => { - cb() - } - complete => { - break; - }, - } - } - - futures_util::future::join_all(alone_tasks).await; - }); - - if direct_term { - self.close(); - } - - handle - } -} diff --git a/flow-rs/src/graph/node.rs b/flow-rs/src/graph/node.rs deleted file mode 100644 index de6a46e..0000000 --- a/flow-rs/src/graph/node.rs +++ /dev/null @@ -1,54 +0,0 @@ -/** - * \file flow-rs/src/graph/node.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::config::interlayer as config; -use crate::node::Actor; -use anyhow::Result; - -pub struct AnyNode { - nodes: Vec>, - #[allow(dead_code)] - info: config::Node, -} - -impl AnyNode { - pub fn new(local_key: u64, cfg: &config::Node) -> Result { - Ok(AnyNode { - nodes: crate::node::load_static(local_key, cfg)?, - info: cfg.clone(), - }) - } - - #[allow(dead_code)] - pub fn first(&self) -> &dyn Actor { - self.nodes.first().map(|n| n.as_ref()).unwrap() - } - - #[allow(dead_code)] - pub fn get(&self) -> &Vec> { - &self.nodes - } - - pub fn get_mut(&mut self) -> &mut Vec> { - &mut self.nodes - } - - pub fn get_into(&mut self) -> Vec> { - std::mem::take(&mut self.nodes) - } - - pub fn info(&self) -> &config::Node { - &self.info - } - - pub fn info_mut(&mut self) -> &mut config::Node { - &mut self.info - } -} diff --git a/flow-rs/src/graph/subgraph.rs b/flow-rs/src/graph/subgraph.rs deleted file mode 100644 index ae7decd..0000000 --- a/flow-rs/src/graph/subgraph.rs +++ /dev/null @@ -1,93 +0,0 @@ -/** - * \file flow-rs/src/graph/subgraph.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::broker::BrokerClient; -use crate::prelude::*; -use crate::registry::Collect; -use crate::rt::task::JoinHandle; -use futures_util::{pin_mut, select, FutureExt}; - -impl Node for Graph { - fn set_port(&mut self, port_name: &str, tag: Option, channel: &ChannelStorage) { - let port_name = port_name.to_owned(); - let local_key = self.ctx.local_key; - if let Some(chan) = self.conns.get_mut(&port_name) { - chan.set(channel.clone()); - for port in chan.info().rx.iter().chain(chan.info().tx.iter()) { - if let Some(nodes) = self.nodes.get_mut(&port.node_name) { - for node in nodes.get_mut() { - node.set_port(&port.port_name, tag, channel); - } - } else { - if self.is_shared { - panic!("nested shared graph is not support"); - } - let proxy = self - .shares - .entry(port.node_name.clone()) - .or_insert_with(|| { - SharedProxy::registry_local() - .get(local_key) - .get(&port.node_name) - .unwrap_or_else(|| { - panic!("global node not found {}", port.node_name) - }) - .as_ref() - .clone() - }); - proxy.set_port(&port.port_name, channel); - } - } - } else { - unreachable!("unexpected port {} for graph {}", port_name, self.ctx.name) - } - } - - fn set_port_dynamic(&mut self, _: u64, _: &str, _: String, _: usize, _: Vec) { - unimplemented!() - } - - fn close(&mut self) { - for input in &self.inputs { - self.conns[input].get().close(); - } - } - - fn is_allinp_closed(&self) -> bool { - let mut is_closed = true; - for input in &self.inputs { - is_closed = is_closed && self.conns[input].get().is_closed(); - } - is_closed - } -} - -impl Actor for Graph { - fn start( - mut self: Box, - context: Context, - resource: ResourceCollection, - ) -> JoinHandle<()> { - flow_rs::rt::task::spawn(async move { - let wait_ctx = context.wait().fuse(); - let wait_graph = self.as_mut().start(Some(resource)).fuse(); - pin_mut!(wait_ctx, wait_graph); - loop { - select! { - _ = wait_ctx => { - self.close() - } - _ = wait_graph => context.close(), - complete => break, - } - } - }) - } -} diff --git a/flow-rs/src/helper.rs b/flow-rs/src/helper.rs deleted file mode 100644 index 0ef81e6..0000000 --- a/flow-rs/src/helper.rs +++ /dev/null @@ -1,46 +0,0 @@ -/** - * \file flow-rs/src/helper.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use numpy::array::PyArrayDyn; -use numpy::Element; -use pyo3::prelude::*; -use std::ops::Deref; - -pub struct SliceGuard<'a, T> -where - T: Element, -{ - slice: &'a [T], - _ref: PyObject, -} - -impl<'a, T> Deref for SliceGuard<'a, T> -where - T: Element, -{ - type Target = [T]; - fn deref(&self) -> &Self::Target { - self.slice - } -} - -pub fn uget_slice<'a, T: Element>(py: Python, pyobject: &PyAny) -> PyResult> { - let array: &PyArrayDyn = pyobject.extract()?; - unsafe { - let slice = array - .as_slice() - .map_err(|_| pyo3::exceptions::PyTypeError::new_err("not contiguous"))?; - let slice = std::slice::from_raw_parts(slice.as_ptr(), slice.len()); - Ok(SliceGuard { - slice, - _ref: pyobject.into_py(py), - }) - } -} diff --git a/flow-rs/src/lib.rs b/flow-rs/src/lib.rs deleted file mode 100644 index 1a8fe07..0000000 --- a/flow-rs/src/lib.rs +++ /dev/null @@ -1,157 +0,0 @@ -//! MegFlow - -/** - * \file flow-rs/src/lib.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -extern crate self as flow_rs; - -#[doc(hidden)] -pub mod broker; -pub mod channel; -mod config; -mod debug; -pub mod envelope; -mod future; -pub mod graph; -pub mod helper; -pub mod loader; -pub mod node; -#[doc(hidden)] -pub mod registry; -pub mod resource; -#[cfg(test)] -pub mod sandbox; - -pub mod prelude { - #[doc(hidden)] - pub use super::broker::*; - pub use super::channel::*; - pub use super::envelope::*; - pub use super::graph::*; - pub use super::node::*; - pub use super::registry::*; - pub use super::resource::*; - pub use super::{load, load_single_graph}; - /// Re-exports async_std as rt - pub use async_std as rt; - pub use flow_derive::*; -} - -use anyhow::{anyhow, Result}; -/// Re-exports async_std as rt -pub use async_std as rt; -#[doc(hidden)] -pub use ctor::*; -pub use debug::Server as DebugServer; -pub use flow_derive::*; -use node::NodeInfo; -use prelude::MainGraph; -use registry::Collect; - -/// A function to load graph with config -pub fn load(option: Option, config: &str) -> Result { - load_impl(option, toml::from_str(config)?) -} -/// A convenient function to load single graph -pub fn load_single_graph( - option: Option, - config: &str, -) -> Result { - let config: config::presentation::Graph = toml::from_str(config)?; - let config = config::presentation::Config { - main: config.name.clone(), - graphs: vec![config], - nodes: vec![], - resources: vec![], - }; - load_impl(option, config) -} - -use std::sync::atomic::{AtomicU64, Ordering}; - -lazy_static::lazy_static!( - static ref LOCAL_KEY: AtomicU64 = AtomicU64::new(0); -); - -fn load_impl( - option: Option, - config: config::presentation::Config, -) -> Result { - // init graph local resources - let local_key = LOCAL_KEY.fetch_add(1, Ordering::Relaxed); - registry::initialize(local_key); - // load plugins - if let Some(option) = option { - loader::load(local_key, &option).unwrap(); - } - // register subgraph info - for cfg in &config.graphs { - let info = NodeInfo { - inputs: cfg.inputs.iter().map(|conn| conn.name.clone()).collect(), - outputs: cfg.outputs.iter().map(|conn| conn.name.clone()).collect(), - }; - graph::GraphSlice::registry_local().get(local_key).insert( - cfg.name.clone(), - graph::GraphSlice { - cons: Box::new(move |_| Err(anyhow!("graph is not loaded"))), - info, - }, - ); - } - let global_nodes_keys: Vec<_> = config - .nodes - .iter() - .map(|n| &n.entity.name) - .cloned() - .collect(); - - let config = config::translate_config(local_key, config)?; - config::graphviz::dump(&config)?; - - // update graph constructor - for cfg in &config.graphs { - let cfg = cfg.clone(); - let info = NodeInfo { - inputs: cfg.inputs.clone(), - outputs: cfg.outputs.clone(), - }; - graph::GraphSlice::registry_local().get(local_key).insert( - cfg.name.clone(), - graph::GraphSlice { - cons: Box::new(move |name| { - graph::Graph::load(graph::context(name, cfg.name.clone(), local_key), &cfg) - }), - info, - }, - ); - } - - // register shared nodes - let ctx = graph::context("__GLOBAL__".to_owned(), "__GLOBAL__".to_owned(), local_key); - let global_resources = - resource::UniqueResourceCollection::new(ctx.local_key, ctx.id, &config.resources) - .take_into_arc(); - for k in global_nodes_keys { - let cfg = config.nodes.get(&k).unwrap(); - node::SharedProxy::registry_local().get(local_key).insert( - cfg.entity.name.clone(), - node::load_shared(cfg, &config, ctx.clone(), global_resources.clone())?, - ); - } - - match graph::GraphSlice::registry_local() - .get(local_key) - .get(&config.main) - .map(|slice| (slice.cons)(config.main.clone())) - { - Some(ret) => ret.map(|g| MainGraph::new(g, ctx, global_resources)), - _ => Err(anyhow!("graph {} is not exist", config.main)), - } -} diff --git a/flow-rs/src/loader/mod.rs b/flow-rs/src/loader/mod.rs deleted file mode 100644 index ad6eeed..0000000 --- a/flow-rs/src/loader/mod.rs +++ /dev/null @@ -1,89 +0,0 @@ -/** - * \file flow-rs/src/loader/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod python; - -use crate::registry::Collect; -use anyhow::Result; -use std::fs; -use std::path::{Path, PathBuf}; - -trait Plugin { - fn submit(&self); -} - -trait Loader: Send + Sync { - fn load( - &self, - local_key: u64, - module_path: &Path, - plugin_path: &Path, - ) -> Result>>; -} - -#[derive(Copy, Clone, Hash, Eq, PartialEq)] -pub enum PluginType { - Python, -} - -crate::collect!(PluginType, Box); - -pub struct LoaderConfig { - pub plugin_path: PathBuf, - pub module_path: PathBuf, - pub ty: PluginType, -} - -pub(crate) fn load(local_key: u64, cfg: &LoaderConfig) -> Result<()> { - for entry in fs::read_dir(&cfg.plugin_path)? { - let entry = entry?; - let pathbuf = entry.path(); - let path: &Path = pathbuf.as_ref(); - if let Some(path) = cfg.ty.check(path) { - let loader = >::registry_global().get(&cfg.ty).unwrap(); - for plugin in loader.load(local_key, cfg.module_path.as_ref(), path.as_path())? { - plugin.submit(); - } - } - } - Ok(()) -} - -impl PluginType { - fn check(&self, path: &Path) -> Option { - match *self { - PluginType::Python => PluginType::check_python(path), - } - } - - fn check_python(path: &Path) -> Option { - if path.is_file() { - if let Some(ext) = path.extension() { - if ext == "py" { - if let Some(file_stem) = path.file_stem() { - if file_stem != "__init__" { - return Some(path.to_path_buf()); - } - } - } - } - None - } else { - let mut buf = path.to_path_buf(); - buf.push("__init__.py"); - if buf.exists() { - buf.pop(); - Some(buf) - } else { - None - } - } - } -} diff --git a/flow-rs/src/loader/python/channel.rs b/flow-rs/src/loader/python/channel.rs deleted file mode 100644 index 47c0cf0..0000000 --- a/flow-rs/src/loader/python/channel.rs +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file flow-rs/src/loader/python/channel.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::context::with_context; -use super::envelope::PyEnvelope; -use crate::channel::{BatchRecvError, Receiver, Sender}; -use pyo3::prelude::*; -use stackful::wait; -use std::{sync::Arc, time::Duration}; - -#[pyclass] -pub(crate) struct PySender { - pub imp: Arc, -} - -#[pyclass] -pub(crate) struct PyReceiver { - pub imp: Arc, -} - -#[pymethods] -impl PySender { - fn send(&mut self, py: Python, envelope: Py) { - let envelope = envelope.borrow_mut(py).imp.take().expect("use after move"); - with_context(py, || wait(self.imp.send(envelope)).ok()); - } -} - -#[pymethods] -impl PyReceiver { - fn recv(&mut self, py: Python) -> PyObject { - match with_context(py, || wait(self.imp.recv::())) { - Ok(msg) => Py::new(py, PyEnvelope { imp: Some(msg) }) - .unwrap() - .to_object(py), - _ => py.None(), - } - } - - fn batch_recv(&self, py: Python, n: usize, dur: u64) -> (Vec, bool) { - let convert = |envelope| { - Py::new( - py, - PyEnvelope { - imp: Some(envelope), - }, - ) - .unwrap() - .to_object(py) - }; - match with_context(py, || { - wait( - self.imp - .batch_recv::(n, Duration::from_millis(dur)), - ) - }) { - Ok(msg) => (msg.into_iter().map(convert).collect(), false), - Err(BatchRecvError::Closed(msg)) => (msg.into_iter().map(convert).collect(), true), - } - } -} diff --git a/flow-rs/src/loader/python/context.rs b/flow-rs/src/loader/python/context.rs deleted file mode 100644 index 9fb58f7..0000000 --- a/flow-rs/src/loader/python/context.rs +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file flow-rs/src/loader/python/context.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::unlimited::{self, PyThreadStateUnlimited}; -use pyo3::ffi; -use pyo3::prelude::*; -use std::cell::RefCell; - -thread_local! { - static CTX: RefCell = RefCell::new(ContextPool { pool: vec![], freelist: vec![] }); -} - -pub fn with_context(py: Python, f: F) -> R -where - F: FnOnce() -> R + Send, - R: Send, -{ - let id = CTX.with(|ctx| ctx.borrow_mut().store()); - let r = py.allow_threads(f); - CTX.with(|ctx| ctx.borrow_mut().restore(id)); - r -} - -struct Context { - thread: *mut ffi::PyThreadState, - ctx: PyThreadStateUnlimited, -} - -struct ContextPool { - pool: Vec, - freelist: Vec, -} - -impl ContextPool { - fn store(&mut self) -> usize { - let id = self.freelist.pop().unwrap_or(self.pool.len()); - if id == self.pool.len() { - self.pool.push(Context { - thread: std::ptr::null_mut(), - ctx: Default::default(), - }) - } - unsafe { - let context = self.pool.get_unchecked_mut(id); - context.thread = ffi::PyThreadState_Get(); - context.ctx = unlimited::store(context.thread); - } - id - } - - fn restore(&mut self, id: usize) { - unsafe { - let context = self.pool.get_unchecked_mut(id); - ffi::PyThreadState_Swap(context.thread); - unlimited::restore(context.thread, &context.ctx); - context.thread = std::ptr::null_mut(); - context.ctx = Default::default(); - } - self.freelist.push(id); - } -} diff --git a/flow-rs/src/loader/python/envelope.rs b/flow-rs/src/loader/python/envelope.rs deleted file mode 100644 index 42badcd..0000000 --- a/flow-rs/src/loader/python/envelope.rs +++ /dev/null @@ -1,167 +0,0 @@ -/** - * \file flow-rs/src/loader/python/envelope.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::{ - envelope::{AnyEnvelope, Envelope}, - prelude::EnvelopeInfo, -}; -use pyo3::{ - prelude::*, - types::{IntoPyDict, PyDict}, -}; - -static ERR_MSG: &str = "use after move"; - -#[pyclass(name = "Envelope", module = "megflow")] -pub(crate) struct PyEnvelope { - pub imp: Option>, -} - -#[pymethods] -impl PyEnvelope { - #[new] - fn new() -> Self { - PyEnvelope { imp: None } - } - - #[staticmethod] - #[args(info = "None")] - fn pack(py: Python, msg: PyObject, info: Option<&PyDict>) -> PyResult { - let mut envelope = if msg.is_none(py) { - Envelope::::empty() - } else { - Envelope::new(msg) - }; - - if let Some(info) = info { - let target = envelope.info_mut(); - macro_rules! restore { - ($k:ident) => { - target.$k = info - .get_item(stringify!($k)) - .expect(concat!("expect ", stringify!($k), " field")) - .extract()?; - }; - } - restore!(from_addr); - restore!(to_addr); - restore!(transfer_addr); - restore!(partial_id); - restore!(tag); - } - Ok(PyEnvelope { - imp: Some(envelope), - }) - } - - fn __getstate__(&mut self, py: Python) -> PyResult { - let envelope = self.imp.as_mut().expect(ERR_MSG); - let dict = envelope.info().clone().into_py_dict(py); - dict.set_item("msg", envelope.get_mut().clone_ref(py))?; - Ok(dict.to_object(py)) - } - - fn __setstate__(&mut self, py: Python, state: PyObject) -> PyResult<()> { - let dict: &PyDict = state.extract(py)?; - let msg: PyObject = dict.get_item("msg").expect("expect msg field").into(); - let envelope = PyEnvelope::pack(py, msg, Some(dict))?; - self.imp = envelope.imp; - Ok(()) - } - - fn repack(&self, msg: PyObject) -> Self { - let envelope = self.imp.as_ref().expect(ERR_MSG); - PyEnvelope { - imp: Some(envelope.repack(msg)), - } - } - - #[getter(msg)] - fn get_msg(&self, py: Python) -> PyObject { - let envelope = self.imp.as_ref().expect(ERR_MSG); - envelope.get_ref().clone_ref(py) - } - - #[setter(msg)] - fn set_msg(&mut self, msg: PyObject) { - let envelope = self.imp.as_mut().expect(ERR_MSG); - envelope.repack_inplace(msg) - } - - #[getter(from_addr)] - fn get_from_addr(&self) -> Option { - let envelope = self.imp.as_ref().expect(ERR_MSG); - envelope.info().from_addr - } - - #[setter(from_addr)] - fn set_from_addr(&mut self, addr: u64) { - let envelope = self.imp.as_mut().expect(ERR_MSG); - envelope.info_mut().from_addr = Some(addr) - } - - #[getter(to_addr)] - fn get_to_addr(&self) -> Option { - let envelope = self.imp.as_ref().expect(ERR_MSG); - envelope.info().to_addr - } - - #[setter(to_addr)] - fn set_to_addr(&mut self, addr: u64) { - let envelope = self.imp.as_mut().expect(ERR_MSG); - envelope.info_mut().to_addr = Some(addr) - } - - #[getter(partial_id)] - fn get_partial_id(&self) -> Option { - let envelope = self.imp.as_ref().expect(ERR_MSG); - envelope.info().partial_id - } - - #[setter(partial_id)] - fn set_partial_id(&mut self, addr: u64) { - let envelope = self.imp.as_mut().expect(ERR_MSG); - envelope.info_mut().partial_id = Some(addr) - } - - #[getter(tag)] - fn get_tag(&self) -> Option<&String> { - let envelope = self.imp.as_ref().expect(ERR_MSG); - envelope.info().tag.as_ref() - } - - #[setter(tag)] - fn set_tag(&mut self, tag: String) { - let envelope = self.imp.as_mut().expect(ERR_MSG); - envelope.info_mut().tag = Some(tag); - } -} - -impl IntoPyDict for EnvelopeInfo { - fn into_py_dict(self, py: Python) -> &PyDict { - let dict = PyDict::new(py); - macro_rules! store { - ($k: ident) => { - dict.set_item(stringify!($k), self.$k).unwrap(); - }; - } - store!(from_addr); - store!(to_addr); - store!(transfer_addr); - store!(partial_id); - store!(tag); - dict - } -} - -pub fn envelope_register(module: &PyModule) -> PyResult<()> { - module.add_class::()?; - Ok(()) -} diff --git a/flow-rs/src/loader/python/mod.rs b/flow-rs/src/loader/python/mod.rs deleted file mode 100644 index 04679c5..0000000 --- a/flow-rs/src/loader/python/mod.rs +++ /dev/null @@ -1,261 +0,0 @@ -/** - * \file flow-rs/src/loader/python/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod channel; -mod context; -mod envelope; -mod node; -mod unlimited; -mod utils; - -use crate::registry::Collect; -use crate::resource::Resource; - -use super::{Loader, Plugin, PluginType}; -use anyhow::Result; -use pyo3::prelude::*; -use pyo3::types::{PyDict, PyList}; -use std::collections::HashMap; -use std::path::Path; -use std::sync::{Arc, Once}; - -#[derive(Clone)] -pub(crate) struct RegistryNodeParams { - pub name: String, - pub code: PyObject, - pub inputs: Vec, - pub outputs: Vec, - pub exclusive: bool, -} - -struct NodePlugin { - local_key: u64, - params: RegistryNodeParams, -} - -impl NodePlugin { - fn new(local_key: u64, params: RegistryNodeParams) -> NodePlugin { - NodePlugin { local_key, params } - } - - fn boxed(self) -> Box { - Box::new(self) - } -} - -impl Plugin for NodePlugin { - fn submit(&self) { - let params = self.params.clone(); - crate::node::NodeSlice::registry_local() - .get(self.local_key) - .insert( - self.params.name.clone(), - crate::node::NodeSlice { - cons: Box::new(move |name: String, args: &toml::value::Table| { - Box::new(node::PyNode::new(name, args, ¶ms)) - }), - info: flow_rs::node::NodeInfo { - inputs: self.params.inputs.clone(), - outputs: self.params.outputs.clone(), - }, - }, - ); - } -} - -struct ResourcePlugin { - local_key: u64, - name: String, - res: PyObject, -} - -impl ResourcePlugin { - fn boxed(self) -> Box { - Box::new(self) - } -} - -impl Resource for PyObject { - fn to_python(&self, py: pyo3::Python) -> pyo3::PyObject { - self.clone_ref(py) - } -} - -impl Plugin for ResourcePlugin { - fn submit(&self) { - let res = self.res.clone(); - crate::resource::ResourceSlice::registry_local() - .get(self.local_key) - .insert( - self.name.clone(), - crate::resource::ResourceSlice { - cons: Box::new(move |name: String, args: &toml::value::Table| { - let imp = Python::with_gil(|py| -> _ { - let pyargs = node::toml2dict(py, args) - .expect("convert toml to python dict fault"); - match res.call1(py, (name.as_str(), pyargs)) { - Err(err) => { - err.print(py); - None - } - Ok(ret) => Some(ret), - } - }); - match imp { - Some(imp) => Ok(Arc::new(imp)), - _ => Err(std::io::Error::new( - std::io::ErrorKind::OutOfMemory, - "maybe out of memory", - )), - } - }), - }, - ); - } -} - -static ONCE_REGISTER: Once = Once::new(); - -struct PythonLoader; -const ERR_MSG: &str = "python plugin parse fault"; - -impl Loader for PythonLoader { - fn load( - &self, - local_key: u64, - module_path: &Path, - plugin_path: &Path, - ) -> Result>> { - pyo3::prepare_freethreaded_python(); - let mut plugins = vec![]; - - let module_name = path_to_module(module_path, plugin_path)?; - - Python::with_gil(|py| -> PyResult<_> { - let module_path = module_path.display().to_string(); - let syspath: &PyList = py.import("sys")?.getattr("path")?.try_into()?; - if !syspath - .iter() - .any(|path| module_path.as_str() == path.extract::<&str>().unwrap()) - { - syspath.insert(0, module_path)?; - } - - ONCE_REGISTER.call_once(|| { - let module = py.import("megflow").expect("module megflow not found"); - utils::utils_register(module).expect("python utility functions register fault"); - envelope::envelope_register(module).expect("python envelope register fault"); - }); - - py.import(module_name.as_str())?; - - let plugins_param: HashMap> = py - .import("megflow")? - .getattr("collect")? - .call0()? - .extract()?; - for plugin_param in &plugins_param["nodes"] { - let name: String = plugin_param.get_item("name").expect(ERR_MSG).extract()?; - let inputs: Vec = - plugin_param.get_item("inputs").expect(ERR_MSG).extract()?; - let outputs: Vec = - plugin_param.get_item("outputs").expect(ERR_MSG).extract()?; - let code: PyObject = plugin_param.get_item("code").expect(ERR_MSG).extract()?; - let exclusive: bool = plugin_param - .get_item("exclusive") - .expect(ERR_MSG) - .extract()?; - plugins.push( - NodePlugin::new( - local_key, - RegistryNodeParams { - name, - code, - inputs, - outputs, - exclusive, - }, - ) - .boxed(), - ); - } - for plugin_param in &plugins_param["resources"] { - let name: String = plugin_param.get_item("name").expect(ERR_MSG).extract()?; - let code: PyObject = plugin_param.get_item("code").expect(ERR_MSG).extract()?; - plugins.push( - ResourcePlugin { - local_key, - name, - res: code, - } - .boxed(), - ) - } - Ok(()) - })?; - - Ok(plugins) - } -} - -crate::submit!( - PluginType::Python, - Box::new(PythonLoader {}) as Box -); - -fn path_to_module(root: &Path, path: &Path) -> Result { - let abs_root = std::fs::canonicalize(root)?; - let abs_path = std::fs::canonicalize(path)?; - - if abs_path.starts_with(&abs_root) && abs_path != abs_root { - let relative = abs_path.strip_prefix(&abs_root)?; - let relative = relative.to_str().unwrap().to_owned(); - if relative.ends_with(".py") { - Ok(relative[..relative.len() - 3].replace("/", ".")) - } else if relative.ends_with('/') { - Ok(relative[..relative.len() - 1].replace("/", ".")) - } else { - Ok(relative.replace("/", ".")) - } - } else { - Err(anyhow::anyhow!("module not found")) - } -} - -#[cfg(test)] -mod test { - use super::*; - use std::path::PathBuf; - - #[test] - fn test_path_to_module() { - let mut module_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - module_path.pop(); - module_path.push("flow-python/examples"); - let mut path = PathBuf::from(&module_path); - path.push("logical_test/source.py"); - let ret = path_to_module(&module_path, &path); - assert!(ret.is_ok()); - assert_eq!(ret.unwrap(), "logical_test.source".to_owned()); - - path.pop(); - let ret = path_to_module(&module_path, &path); - assert!(ret.is_ok()); - assert_eq!(ret.unwrap(), "logical_test".to_owned()); - - path.pop(); - let ret = path_to_module(&module_path, &path); - assert!(ret.is_err()); - - path.pop(); - let ret = path_to_module(&module_path, &path); - assert!(ret.is_err()); - } -} diff --git a/flow-rs/src/loader/python/node.rs b/flow-rs/src/loader/python/node.rs deleted file mode 100644 index 624ce47..0000000 --- a/flow-rs/src/loader/python/node.rs +++ /dev/null @@ -1,238 +0,0 @@ -/** - * \file flow-rs/src/loader/python/node.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::channel::*; -use super::RegistryNodeParams; -use flow_rs::prelude::*; -use pyo3::prelude::*; -use pyo3::types::{PyDict, PyList}; -use stackful::stackful; -use std::collections::HashMap; -use std::sync::Arc; - -pub(crate) struct PyNode { - imp: PyObject, - inputs: HashMap>, - outputs: HashMap>, - name: String, - exclusive: bool, -} - -impl Drop for PyNode { - fn drop(&mut self) { - Python::with_gil(|py| { - if !self.imp.as_ref(py).hasattr("__del__").unwrap() { - return; - } - if let Err(err) = self.imp.call_method0(py, "__del__") { - err.print(py); - panic!("python node {} __del__ fault!", self.name); - } - }); - } -} - -impl PyNode { - pub fn new( - instance_name: String, - args: &toml::value::Table, - params: &RegistryNodeParams, - ) -> PyNode { - let mut inputs = HashMap::new(); - let mut outputs = HashMap::new(); - for port in ¶ms.inputs { - inputs.insert(port.clone(), Arc::new(Default::default())); - } - for port in ¶ms.outputs { - outputs.insert(port.clone(), Arc::new(Default::default())); - } - let imp = Python::with_gil(|py| -> _ { - let pyargs = toml2dict(py, args).expect("convert toml to python dict fault"); - match params.code.call1(py, (instance_name.as_str(), pyargs)) { - Err(err) => { - err.print(py); - panic!("parse python code fault"); - } - Ok(ret) => ret, - } - }); - PyNode { - inputs, - outputs, - imp, - name: params.name.clone(), - exclusive: params.exclusive, - } - } - - async fn initialize(&mut self, res: ResourceCollection) { - let inputs = self.inputs.clone(); - let outputs = self.outputs.clone(); - - Python::with_gil(|py| { - for (name, input) in inputs { - let rp = PyReceiver { imp: input }; - let cell = PyCell::new(py, rp).unwrap(); - self.imp.as_ref(py).setattr(name, cell).unwrap(); - } - for (name, output) in outputs { - let sp = PySender { imp: output }; - let cell = PyCell::new(py, sp).unwrap(); - self.imp.as_ref(py).setattr(name, cell).unwrap(); - } - }); - - for k in res.keys() { - let any_r = res - .get_any(k.as_str()) - .await - .unwrap_or_else(|| panic!("resource {} not found", k)); - Python::with_gil(|py| { - let r = any_r.to_python(py); - self.imp.as_ref(py).setattr(k, r).unwrap(); - }); - } - } - - async fn exec(&mut self) { - stackful(|| { - Python::with_gil(|py| { - if let Err(err) = self.imp.call_method0(py, "exec") { - err.print(py); - panic!("python node {} exec fault!", self.name); - } - }) - }) - .await; - } - - async fn start_loop(&mut self, res: ResourceCollection) { - self.initialize(res).await; - let mut empty_n = 0; - loop { - self.exec().await; - if !self.inputs.is_empty() { - let mut min_empty_n = usize::MAX; - for port in self.inputs.values() { - min_empty_n = std::cmp::min(min_empty_n, port.empty_n()); - } - - for _ in empty_n..min_empty_n { - for port in self.outputs.values() { - port.send_any(DummyEnvelope {}.seal()).await.ok(); - } - } - - empty_n = min_empty_n; - } - if self.is_allinp_closed() { - break; - } - } - self.close(); - } -} - -impl Node for PyNode { - fn set_port(&mut self, port_name: &str, _: Option, channel: &ChannelStorage) { - if let Some(port) = self.inputs.get_mut(port_name) { - *port = Arc::new(channel.receiver()); - } else if let Some(port) = self.outputs.get_mut(port_name) { - *port = Arc::new(channel.sender()); - } else { - unreachable!(); - } - } - fn set_port_dynamic(&mut self, _: u64, _: &str, _: String, _: usize, _: Vec) { - unimplemented!() - } - fn close(&mut self) { - for port in self.outputs.values_mut() { - unsafe { &mut *(Arc::as_ptr(port) as *mut Sender) }.abort(); - } - } - fn is_allinp_closed(&self) -> bool { - let mut is_closed = true; - for port in self.inputs.values() { - is_closed = is_closed && port.is_closed(); - } - is_closed - } -} - -impl Actor for PyNode { - fn start(mut self: Box, _: Context, res: ResourceCollection) -> rt::task::JoinHandle<()> { - if self.exclusive { - flow_rs::rt::task::spawn_blocking(move || { - flow_rs::rt::task::block_on(async move { - self.start_loop(res).await; - }); - }) - } else { - flow_rs::rt::task::spawn_local(async move { - self.start_loop(res).await; - }) - } - } -} - -pub fn toml2dict<'a>(py: Python<'a>, args: &toml::value::Table) -> PyResult<&'a PyDict> { - fn append_list(py: Python, value: &toml::Value, list: &PyList) -> PyResult<()> { - match value { - toml::Value::String(s) => list.append(s), - toml::Value::Float(f) => list.append(f), - toml::Value::Integer(i) => list.append(i), - toml::Value::Boolean(b) => list.append(b), - toml::Value::Datetime(t) => list.append(t.to_string()), - toml::Value::Array(l) => { - let pylist = PyList::empty(py); - for e in l { - append_list(py, e, pylist)?; - } - list.append(pylist) - } - toml::Value::Table(d) => { - let pydict = PyDict::new(py); - for (key, value) in d { - fill_dict(py, key, value, pydict)?; - } - list.append(pydict) - } - } - } - fn fill_dict(py: Python, key: &str, value: &toml::Value, dict: &PyDict) -> PyResult<()> { - match value { - toml::Value::String(s) => dict.set_item(key, s), - toml::Value::Float(f) => dict.set_item(key, f), - toml::Value::Integer(i) => dict.set_item(key, i), - toml::Value::Boolean(b) => dict.set_item(key, b), - toml::Value::Datetime(t) => dict.set_item(key, t.to_string()), - toml::Value::Array(l) => { - let pylist = PyList::empty(py); - for e in l { - append_list(py, e, pylist)?; - } - dict.set_item(key, pylist) - } - toml::Value::Table(d) => { - let pydict = PyDict::new(py); - for (key, value) in d { - fill_dict(py, key, value, pydict)?; - } - dict.set_item(key, pydict) - } - } - } - let dict = PyDict::new(py); - for (key, value) in args { - fill_dict(py, key, value, dict)?; - } - Ok(dict) -} diff --git a/flow-rs/src/loader/python/unlimited.rs b/flow-rs/src/loader/python/unlimited.rs deleted file mode 100644 index 516790e..0000000 --- a/flow-rs/src/loader/python/unlimited.rs +++ /dev/null @@ -1,317 +0,0 @@ -use pyo3::ffi; -use pyo3::Python; -use std::ffi::c_void; - -lazy_static::lazy_static! { - static ref VERSION: (u8,u8,u8) = { - pyo3::prepare_freethreaded_python(); - Python::with_gil(|py| { - let version = py.version_info(); - assert_eq!(version.major, 3); - (version.major, version.minor, version.patch) - }) - }; -} - -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CFrame { - use_tracing: i32, - previous: *mut CFrame, -} - -#[repr(C)] -#[derive(Copy, Clone)] -pub struct PyErrStackItem { - pub exc_type: *mut ffi::PyObject, - pub exc_value: *mut ffi::PyObject, - pub exc_traceback: *mut ffi::PyObject, - pub previous_item: *mut PyErrStackItem, -} - -impl Default for PyErrStackItem { - fn default() -> Self { - PyErrStackItem { - exc_type: std::ptr::null_mut(), - exc_value: std::ptr::null_mut(), - exc_traceback: std::ptr::null_mut(), - previous_item: std::ptr::null_mut(), - } - } -} - -#[repr(C)] -#[derive(Copy, Clone)] -struct PyThreadStateUnlimited3_10 { - ob_base: ffi::PyObject, - interp: *mut ffi::PyInterpreterState, - frame: *mut ffi::PyFrameObject, - recursion_depth: i32, - recursion_headroom: i32, - stackcheck_counter: i32, - - tracing: i32, - cframe: *mut CFrame, - - c_profilefunc: *mut c_void, - c_tracefunc: *mut c_void, - c_profileobj: *mut ffi::PyObject, - c_traceobj: *mut ffi::PyObject, - curexc_type: *mut ffi::PyObject, - curexc_value: *mut ffi::PyObject, - curexc_traceback: *mut ffi::PyObject, - exc_state: PyErrStackItem, - exc_info: *mut PyErrStackItem, - dict: *mut ffi::PyObject, - - gilstate_counter: i32, - - async_exc: *mut ffi::PyObject, - thread_id: u64, - - trash_delete_nesting: i32, - trash_delete_later: *mut ffi::PyObject, - - on_delete: *mut std::ffi::c_void, - on_delete_data: *mut std::ffi::c_void, - - coroutine_origin_tracking_depth: i32, - - async_gen_firstiter: *mut ffi::PyObject, - async_gen_finalizer: *mut ffi::PyObject, - - context: *mut ffi::PyObject, - context_ver: u64, - id: u64, - root_cframe: CFrame, -} - -#[repr(C)] -#[derive(Copy, Clone)] -struct PyThreadStateUnlimited3_789 { - ob_base: ffi::PyObject, - interp: *mut ffi::PyInterpreterState, - frame: *mut ffi::PyFrameObject, - recursion_depth: i32, - overflowed: i8, - recursion_critical: i8, - stackcheck_counter: i32, - tracing: i32, - use_tracing: i32, - c_profilefunc: *mut c_void, - c_tracefunc: *mut c_void, - c_profileobj: *mut ffi::PyObject, - c_traceobj: *mut ffi::PyObject, - curexc_type: *mut ffi::PyObject, - curexc_value: *mut ffi::PyObject, - curexc_traceback: *mut ffi::PyObject, - exc_state: PyErrStackItem, - exc_info: *mut PyErrStackItem, - dict: *mut ffi::PyObject, - - gilstate_counter: i32, - - async_exc: *mut ffi::PyObject, - thread_id: u64, - - trash_delete_nesting: i32, - trash_delete_later: *mut ffi::PyObject, - - on_delete: *mut std::ffi::c_void, - on_delete_data: *mut std::ffi::c_void, - - coroutine_origin_tracking_depth: i32, - - coroutine_wrapper: *mut ffi::PyObject, - in_coroutine_wrapper: i32, - - async_gen_firstiter: *mut ffi::PyObject, - async_gen_finalizer: *mut ffi::PyObject, - - context: *mut ffi::PyObject, -} - -#[repr(C)] -#[derive(Copy, Clone)] -struct PyThreadStateUnlimited3_6 { - ob_base: ffi::PyObject, - interp: *mut ffi::PyInterpreterState, - frame: *mut ffi::PyFrameObject, - recursion_depth: i32, - tracing: i32, - use_tracing: i32, - c_profilefunc: *mut c_void, - c_tracefunc: *mut c_void, - c_profileobj: *mut ffi::PyObject, - c_traceobj: *mut ffi::PyObject, - curexc_type: *mut ffi::PyObject, - curexc_value: *mut ffi::PyObject, - curexc_traceback: *mut ffi::PyObject, - exc_type: *mut ffi::PyObject, - exc_value: *mut ffi::PyObject, - exc_traceback: *mut ffi::PyObject, -} - -#[derive(Copy, Clone)] -pub struct PyThreadStateUnlimited { - pub frame: *mut ffi::PyFrameObject, - pub cframe: *mut CFrame, - pub recursion_depth: i32, - pub context: *mut ffi::PyObject, - pub exc_state: PyErrStackItem, - pub exc_info: *mut PyErrStackItem, - pub exc_type: *mut ffi::PyObject, - pub exc_value: *mut ffi::PyObject, - pub exc_traceback: *mut ffi::PyObject, -} - -impl Default for PyThreadStateUnlimited { - fn default() -> Self { - PyThreadStateUnlimited { - frame: std::ptr::null_mut(), - cframe: std::ptr::null_mut(), - recursion_depth: 0, - context: std::ptr::null_mut(), - exc_state: Default::default(), - exc_info: std::ptr::null_mut(), - exc_type: std::ptr::null_mut(), - exc_value: std::ptr::null_mut(), - exc_traceback: std::ptr::null_mut(), - } - } -} - -pub fn store(ts: *mut ffi::PyThreadState) -> PyThreadStateUnlimited { - match VERSION.1 { - 6 => { - let ts = ts as *mut PyThreadStateUnlimited3_6; - unsafe { - let unlimited = PyThreadStateUnlimited { - frame: (*ts).frame, - recursion_depth: (*ts).recursion_depth, - exc_type: (*ts).exc_type, - exc_value: (*ts).exc_value, - exc_traceback: (*ts).exc_traceback, - ..Default::default() - }; - (*ts).frame = std::ptr::null_mut(); - (*ts).recursion_depth = 0; - (*ts).exc_type = std::ptr::null_mut(); - (*ts).exc_value = std::ptr::null_mut(); - (*ts).exc_traceback = std::ptr::null_mut(); - unlimited - } - } - 7 | 8 | 9 => { - let ts = ts as *mut PyThreadStateUnlimited3_789; - unsafe { - let unlimited = PyThreadStateUnlimited { - frame: (*ts).frame, - recursion_depth: (*ts).recursion_depth, - context: (*ts).context, - exc_state: (*ts).exc_state, - exc_info: (*ts).exc_info, - ..Default::default() - }; - (*ts).frame = std::ptr::null_mut(); - (*ts).recursion_depth = 0; - (*ts).context = std::ptr::null_mut(); - (*ts).exc_state = Default::default(); - (*ts).exc_info = std::ptr::addr_of_mut!((*ts).exc_state); - unlimited - } - } - 10 => { - let ts = ts as *mut PyThreadStateUnlimited3_10; - unsafe { - let unlimited = PyThreadStateUnlimited { - frame: (*ts).frame, - cframe: (*ts).cframe, - recursion_depth: (*ts).recursion_depth, - context: (*ts).context, - exc_state: (*ts).exc_state, - exc_info: (*ts).exc_info, - ..Default::default() - }; - (*ts).frame = std::ptr::null_mut(); - (*ts).recursion_depth = 0; - (*ts).context = std::ptr::null_mut(); - (*ts).exc_state = Default::default(); - (*ts).exc_info = std::ptr::addr_of_mut!((*ts).exc_state); - (*ts).cframe = std::ptr::addr_of_mut!((*ts).root_cframe); - unlimited - } - } - _ => unimplemented!(), - } -} - -pub fn restore(limited: *mut ffi::PyThreadState, unlimited: &PyThreadStateUnlimited) { - match VERSION.1 { - 6 => { - let ts = limited as *mut PyThreadStateUnlimited3_6; - unsafe { - (*ts).frame = unlimited.frame; - (*ts).recursion_depth = unlimited.recursion_depth; - (*ts).exc_type = unlimited.exc_type; - (*ts).exc_value = unlimited.exc_value; - (*ts).exc_traceback = unlimited.exc_traceback; - } - } - 7 | 8 | 9 => { - let ts = limited as *mut PyThreadStateUnlimited3_789; - unsafe { - (*ts).frame = unlimited.frame; - (*ts).recursion_depth = unlimited.recursion_depth; - (*ts).context = unlimited.context; - (*ts).exc_state = unlimited.exc_state; - (*ts).exc_info = unlimited.exc_info; - } - } - 10 => { - let ts = limited as *mut PyThreadStateUnlimited3_10; - unsafe { - (*ts).frame = unlimited.frame; - (*ts).cframe = unlimited.cframe; - (*ts).recursion_depth = unlimited.recursion_depth; - (*ts).context = unlimited.context; - (*ts).exc_state = unlimited.exc_state; - (*ts).exc_info = unlimited.exc_info; - } - } - _ => unimplemented!(), - } -} - -#[cfg(test)] -mod test { - use super::*; - use pyo3::Python; - - #[test] - fn test_unlimited_ffi() { - pyo3::prepare_freethreaded_python(); - Python::with_gil(|_py| unsafe { - let thread = ffi::PyThreadState_Get(); - let raw_frame = ffi::PyEval_GetFrame(); - let mut unlimited = store(thread); - assert_eq!(unlimited.frame, raw_frame); - let mptr = ffi::PyImport_AddModule("__main__\0".as_ptr() as *const _); - assert!(mptr != std::ptr::null_mut()); - let globals = ffi::PyModule_GetDict(mptr); - let locals = globals; - let code = ffi::PyCode_NewEmpty( - "\0".as_ptr() as *const _, - "\0".as_ptr() as *const _, - 0, - ); - let frame = ffi::PyFrame_New(thread as *mut ffi::PyThreadState, code, globals, locals); - unlimited.frame = frame; - restore(thread, &unlimited); - let frame = ffi::PyEval_GetFrame(); - assert_eq!(unlimited.frame, frame); - unlimited.frame = raw_frame; - ffi::Py_XDECREF(frame as *mut ffi::PyObject); - }); - } -} diff --git a/flow-rs/src/loader/python/utils.rs b/flow-rs/src/loader/python/utils.rs deleted file mode 100644 index 130b43f..0000000 --- a/flow-rs/src/loader/python/utils.rs +++ /dev/null @@ -1,117 +0,0 @@ -/** - * \file flow-rs/src/loader/python/utils.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::context::with_context; -use pyo3::prelude::*; -use pyo3::types::PyFunction; -use pyo3::wrap_pyfunction; -use stackful::wait; -use std::time::Duration; - -#[pyclass(name = "Future")] -struct PyFuture { - chan: Option>, -} - -#[pyclass(name = "Waker")] -struct PyWaker { - chan: Option>, - callback: Option>, -} - -#[pymethods] -impl PyFuture { - fn wait(&mut self, py: Python) -> PyObject { - if let Some(chan) = std::mem::take(&mut self.chan) { - with_context(py, || wait(chan)).unwrap() - } else { - py.None() - } - } - - fn cancel(&mut self) { - self.chan = None; - } -} - -#[pymethods] -impl PyWaker { - fn wake(&mut self, py: Python, result: PyObject) -> PyResult<()> { - if let Some(chan) = std::mem::take(&mut self.chan) { - if chan.send(result.clone_ref(py)).is_ok() { - if let Some(callback) = std::mem::take(&mut self.callback) { - callback.call1(py, (result,))?; - } - } - } - Ok(()) - } -} - -#[pyfunction(callback = "None")] -fn create_future(callback: Option>) -> (PyFuture, PyWaker) { - let (s, r) = oneshot::channel(); - ( - PyFuture { chan: Some(r) }, - PyWaker { - chan: Some(s), - callback, - }, - ) -} - -#[pyfunction] -fn yield_now(py: Python) { - with_context(py, || wait(crate::rt::task::yield_now())) -} - -#[pyfunction] -fn sleep(py: Python, dur: u64) { - with_context(py, || { - wait(crate::rt::task::sleep(Duration::from_millis(dur))) - }) -} - -#[pyfunction] -fn join(py: Python, tasks: Vec>) -> Vec { - let mut futs = vec![]; - for task in tasks { - futs.push(async move { Python::with_gil(|py| task.call0(py).unwrap()) }); - } - with_context(py, || wait(futures_util::future::join_all(futs))) -} - -pub fn utils_register(module: &PyModule) -> PyResult<()> { - module.add_function(wrap_pyfunction!(yield_now, module)?)?; - module.add_function(wrap_pyfunction!(sleep, module)?)?; - module.add_function(wrap_pyfunction!(join, module)?)?; - module.add_function(wrap_pyfunction!(create_future, module)?)?; - module.add_class::()?; - module.add_class::()?; - Ok(()) -} - -#[cfg(test)] -mod test { - use super::*; - - #[flow_rs::rt::test] - async fn test_future() -> PyResult<()> { - pyo3::prepare_freethreaded_python(); - let (mut fut, mut waker) = create_future(None); - Python::with_gil(|py| -> PyResult<_> { - waker.wake(py, 1usize.into_py(py))?; - let ret: usize = fut.wait(py).extract(py)?; - assert_eq!(ret, 1); - Ok(()) - })?; - Ok(()) - } -} diff --git a/flow-rs/src/node/bcast.rs b/flow-rs/src/node/bcast.rs deleted file mode 100644 index a768b3d..0000000 --- a/flow-rs/src/node/bcast.rs +++ /dev/null @@ -1,63 +0,0 @@ -/** - * \file flow-rs/src/node/bcast.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out:[])] -#[derive(Node, Actor, Default)] -struct Bcast {} - -impl Bcast { - fn new(_: String, _: &Table) -> Bcast { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(msg) = self.inp.recv_any().await { - for out in &self.out[0..self.out.len() - 1] { - let msg_cloned = msg.clone(); - out.send_any(msg_cloned).await.ok(); - } - if let Some(out) = self.out.last() { - out.send_any(msg).await.ok(); - } - } - Ok(()) - } -} - -node_register!("Bcast", Bcast); - -#[cfg(test)] -mod test { - use crate::envelope::Envelope; - use crate::sandbox::Sandbox; - #[flow_rs::rt::test] - async fn test_bcast() { - let bcast = Sandbox::pure("Bcast").unwrap(); - let input = bcast.input("inp").unwrap(); - let output = bcast.output("out").unwrap(); - let handle = bcast.start(); - input.send(Envelope::new(0usize)).await.ok(); - let envelope = output.recv::().await; - assert!(envelope.is_ok()); - let envelope = envelope.unwrap(); - assert_eq!(envelope.get_ref(), &0); - assert!(output.is_empty()); - input.close(); - handle.await; - } -} diff --git a/flow-rs/src/node/demux.rs b/flow-rs/src/node/demux.rs deleted file mode 100644 index 9321e8f..0000000 --- a/flow-rs/src/node/demux.rs +++ /dev/null @@ -1,129 +0,0 @@ -/** - * \file flow-rs/src/node/demux.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; -use rt::task::JoinHandle; -use std::collections::HashMap; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out:dyn)] -#[derive(Node, Actor, Default)] -struct DynDemux { - tasks: HashMap>, - resources: Option, -} - -impl DynDemux { - fn new(_: String, _: &Table) -> DynDemux { - Default::default() - } - - async fn initialize(&mut self, resources: ResourceCollection) { - self.resources = Some(resources); - } - async fn finalize(&mut self) { - for (_, task) in std::mem::take(&mut self.tasks) { - task.await; - } - } - - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(msg) = self.inp.recv_any().await { - let id = msg - .info() - .to_addr - .expect("the envelope has no destination address"); - let tag = msg.info().tag.as_ref(); - if msg.is_none() { - self.out.fetch_with_cache().await.remove(&id); - if let Some(task) = self.tasks.remove(&id) { - task.await; - } - } else { - if !self.out.cache().contains_key(&id) { - if let Some(tag) = tag { - self.tasks.insert( - id, - self.out - .create_spec(id, tag, self.resources.clone().unwrap()) - .await - .expect("create subgraph fault"), - ); - } else { - self.tasks.insert( - id, - self.out - .create(id, self.resources.clone().unwrap()) - .await - .expect("create subgraph fault"), - ); - } - } - let out = self.out.fetch_with_cache().await.get(&id).unwrap(); - out.send_any(msg).await.ok(); - } - } - Ok(()) - } -} - -node_register!("DynDemux", DynDemux); - -#[inputs(inp)] -#[outputs(out:[])] -#[derive(Node, Actor, Default)] -struct Demux {} - -impl Demux { - fn new(_: String, _: &Table) -> Demux { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(msg) = self.inp.recv_any().await { - let id = msg - .info() - .to_addr - .expect("the envelope has no destination address"); - let id = id as usize; - self.out[id].send_any(msg).await.ok(); - } - Ok(()) - } -} - -node_register!("Demux", Demux); - -#[cfg(test)] -mod test { - use crate::envelope::Envelope; - use crate::sandbox::Sandbox; - #[flow_rs::rt::test] - async fn test_demux() { - let demux = Sandbox::pure("Demux").unwrap(); - let input = demux.input("inp").unwrap(); - let output = demux.output("out").unwrap(); - let handle = demux.start(); - let mut envelope = Envelope::new(0usize).seal(); - envelope.info_mut().to_addr = Some(0); - input.send_any(envelope).await.ok(); - let envelope = output.recv_any().await; - assert!(envelope.is_ok()); - let envelope = envelope.unwrap(); - assert_eq!(envelope.info().to_addr, Some(0)); - input.close(); - handle.await; - } -} diff --git a/flow-rs/src/node/mod.rs b/flow-rs/src/node/mod.rs deleted file mode 100644 index 41548eb..0000000 --- a/flow-rs/src/node/mod.rs +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file flow-rs/src/node/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod bcast; -mod demux; -mod noop; -mod port; -mod reorder; -mod shared; -mod transform; - -use crate::channel::ChannelStorage; -use crate::graph::Context; -use crate::graph::GraphSlice; -use crate::registry::Collect; -use crate::rt::task::JoinHandle; -use crate::{broker::BrokerClient, resource::ResourceCollection}; -use anyhow::{anyhow, Result}; -pub use port::*; -pub(crate) use shared::*; -use std::collections::BTreeSet; - -#[doc(hidden)] -pub struct NodeSlice { - pub cons: Box Box + Send + Sync>, - pub info: NodeInfo, -} -#[doc(hidden)] -#[derive(Clone)] -pub struct NodeInfo { - pub inputs: Vec, - pub outputs: Vec, -} -crate::collect!(String, NodeSlice); -/// Trait for interactiving with graph, which can be derived by `#[derive(Node)]`. -pub trait Node { - fn set_port(&mut self, port_name: &str, tag: Option, channel: &ChannelStorage); - fn set_port_dynamic( - &mut self, - local_key: u64, - port_name: &str, - target: String, - cap: usize, - brokers: Vec, - ); - fn close(&mut self); - fn is_allinp_closed(&self) -> bool; -} - -/// Trait for interactiving with schedule, which can be derived by `#[derive(Actor)]`. -pub trait Actor: Node + Send + 'static { - /// Run the actor - fn start(self: Box, _: Context, _: ResourceCollection) -> JoinHandle<()> { - unimplemented!() - } -} - -pub(crate) fn load_static( - local_key: u64, - config: &crate::config::interlayer::Node, -) -> Result>> { - if config.entity.ty.len() > 1 { - return Err(anyhow!("static subgraph/node dont support dyn type")); - } - let ty = config.entity.ty.first().unwrap(); - if let Some(node) = NodeSlice::registry_local().get(local_key).get(ty) { - Ok((0..config.cloned.unwrap_or(1)) - .into_iter() - .map(|_| (node.cons)(config.entity.name.clone(), &config.entity.args)) - .collect()) - } else if let Some(graph) = GraphSlice::registry_local().get(local_key).get(ty) { - (0..config.cloned.unwrap_or(1)) - .into_iter() - .map(|_| (graph.cons)(config.entity.name.clone())) - .map(|g| g.map(|g| Box::new(g) as Box)) - .collect() - } else { - Err(anyhow!( - "unexpected node {}:{:?}", - config.entity.name, - config.entity.ty - )) - } -} - -pub(crate) fn inputs(local_key: u64, ty: &str) -> Result> { - if let Some(node) = NodeSlice::registry_local().get(local_key).get(ty) { - Ok(node.info.inputs.iter().cloned().collect()) - } else if let Some(graph) = GraphSlice::registry_local().get(local_key).get(ty) { - Ok(graph.info.inputs.iter().cloned().collect()) - } else { - Err(anyhow!("unexpected node {}", ty)) - } -} - -pub(crate) fn outputs(local_key: u64, ty: &str) -> Result> { - if let Some(node) = NodeSlice::registry_local().get(local_key).get(ty) { - Ok(node.info.outputs.iter().cloned().collect()) - } else if let Some(graph) = GraphSlice::registry_local().get(local_key).get(ty) { - Ok(graph.info.outputs.iter().cloned().collect()) - } else { - Err(anyhow!("unexpected node {}", ty)) - } -} diff --git a/flow-rs/src/node/noop.rs b/flow-rs/src/node/noop.rs deleted file mode 100644 index 286283a..0000000 --- a/flow-rs/src/node/noop.rs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file flow-rs/src/node/noop.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; -use toml::value::Table; - -#[inputs] -#[outputs(out)] -#[derive(Node, Actor, Default)] -struct NoopProducer {} - -impl NoopProducer { - fn new(_name: String, _args: &Table) -> NoopProducer { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - Ok(()) - } -} - -node_register!("NoopProducer", NoopProducer); - -#[inputs(inp)] -#[outputs] -#[derive(Node, Actor, Default)] -struct NoopConsumer {} - -impl NoopConsumer { - fn new(_name: String, _args: &Table) -> NoopConsumer { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - self.inp.recv_any().await.ok(); - Ok(()) - } -} - -node_register!("NoopConsumer", NoopConsumer); diff --git a/flow-rs/src/node/port.rs b/flow-rs/src/node/port.rs deleted file mode 100644 index 881175d..0000000 --- a/flow-rs/src/node/port.rs +++ /dev/null @@ -1,241 +0,0 @@ -/** - * \file flow-rs/src/node/port.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::broker::BrokerClient; -use crate::channel::{ChannelStorage, Receiver, Sender}; -use crate::future::select_ok; -use crate::graph::GraphSlice; -use crate::prelude::ChannelBase; -use crate::registry::Collect; -use crate::resource::ResourceCollection; -use crate::rt::task::JoinHandle; -use anyhow::{anyhow, Result}; -use std::collections::HashMap; -use std::marker::PhantomData; - -use super::Node; - -#[derive(Clone)] -struct DynConns { - name: u64, - inputs: HashMap, - outputs: HashMap, -} - -#[derive(Default)] -pub struct DynPorts { - local_key: u64, - target: String, - cap: usize, - brokers: HashMap, - cache: HashMap, - _v_holder: PhantomData, -} - -impl DynPorts { - pub fn new( - local_key: u64, - target: String, - cap: usize, - brokers: Vec, - ) -> DynPorts { - DynPorts { - local_key, - target, - cap, - brokers: brokers - .into_iter() - .map(|x| (x.topic().to_owned(), x)) - .collect(), - cache: HashMap::new(), - _v_holder: Default::default(), - } - } - - pub async fn create( - &mut self, - key: u64, - resource: ResourceCollection, - ) -> Result> { - self.create_spec( - key, - self.brokers - .keys() - .next() - .expect("not init") - .clone() - .as_str(), - resource, - ) - .await - } - - pub async fn create_spec( - &mut self, - key: u64, - which: &str, - resource: ResourceCollection, - ) -> Result> { - let broker = self - .brokers - .get(which) - .ok_or_else(|| anyhow!("{} not found", which))?; - if let Some(slice) = GraphSlice::registry_local() - .get(self.local_key) - .get(broker.topic()) - { - let mut g = (slice.cons)(format!("{}_instance", broker.topic()))?; - - let mut inputs = HashMap::new(); - let mut outputs = HashMap::new(); - - for input in &slice.info.inputs { - let channel = ChannelStorage::bound(self.cap); - g.set_port(input.as_str(), None, &channel); - inputs.insert(input.clone(), channel.sender()); - } - - for output in &slice.info.outputs { - let channel = ChannelStorage::bound(self.cap); - g.set_port(output.as_str(), None, &channel); - outputs.insert(output.clone(), channel.receiver()); - } - - let handle = g.start(Some(resource)); - - broker - .publish(DynConns { - name: key, - inputs, - outputs, - }) - .await; - Ok(handle) - } else { - Err(anyhow!("{} not found", broker.topic())) - } - } -} - -impl DynPorts { - pub fn try_fetch(&self) -> Option<(u64, Receiver)> { - for broker in self.brokers.values() { - if let Some(mut conns) = broker.try_fetch::() { - let conn = conns.outputs.remove(&self.target).unwrap_or_else(|| { - panic!("port {} not found in graph {}", self.target, broker.topic()) - }); - return Some((conns.name, conn)); - } - } - None - } - - pub async fn fetch(&self) -> Result<(u64, Receiver)> { - let fut: Vec<_> = self - .brokers - .values() - .map(|x| x.fetch::()) - .collect(); - if let Ok(mut conns) = select_ok(fut).await { - let conn = conns.outputs.remove(&self.target).unwrap_or_else(|| { - panic!( - "port {} not found in graph {:?}", - self.target, - self.brokers.keys() - ) - }); - return Ok((conns.name, conn)); - } - Err(anyhow!("broker is closed")) - } - - pub async fn fetch_with_cache(&mut self) -> &mut HashMap { - if self.cache.is_empty() { - if let Ok((k, v)) = self.fetch().await { - self.cache.insert(k, v); - } - } else if let Some((k, v)) = self.try_fetch() { - self.cache.insert(k, v); - } - &mut self.cache - } - - pub fn cache(&self) -> &HashMap { - &self.cache - } - - pub fn is_closed(&self) -> bool { - let mut is_closed = self - .brokers - .values() - .fold(false, |is_closed, broker| is_closed && broker.is_closed()); - for chan in self.cache.values() { - is_closed = is_closed && chan.is_closed(); - } - is_closed - } -} - -impl DynPorts { - pub fn try_fetch(&mut self) -> Option<(u64, Sender)> { - for broker in self.brokers.values() { - if let Some(mut conns) = broker.try_fetch::() { - let conn = conns.inputs.remove(&self.target).unwrap_or_else(|| { - panic!("port {} not found in graph {}", self.target, broker.topic()) - }); - return Some((conns.name, conn)); - } - } - None - } - - pub async fn fetch(&mut self) -> Result<(u64, Sender)> { - let fut: Vec<_> = self - .brokers - .values() - .map(|x| x.fetch::()) - .collect(); - if let Ok(mut conns) = select_ok(fut).await { - let conn = conns.inputs.remove(&self.target).unwrap_or_else(|| { - panic!( - "port {} not found in graph {:?}", - self.target, - self.brokers.keys() - ) - }); - return Ok((conns.name, conn)); - } - Err(anyhow!("broker is closed")) - } - - pub async fn fetch_with_cache(&mut self) -> &mut HashMap { - if self.cache.is_empty() { - if let Ok((k, v)) = self.fetch().await { - self.cache.insert(k, v); - } - } else if let Some((k, v)) = self.try_fetch() { - self.cache.insert(k, v); - } - &mut self.cache - } - - pub fn cache(&self) -> &HashMap { - &self.cache - } - - pub fn close(&self) { - for broker in self.brokers.values() { - broker.close(); - } - for chan in self.cache.values() { - chan.close(); - } - } -} diff --git a/flow-rs/src/node/reorder.rs b/flow-rs/src/node/reorder.rs deleted file mode 100644 index d37b029..0000000 --- a/flow-rs/src/node/reorder.rs +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file flow-rs/src/node/reorder.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use anyhow::Result; -use flow_rs::prelude::*; -use std::collections::BTreeMap; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor, Default)] -struct Reorder { - cache: BTreeMap, - seq_id: u64, -} - -impl Reorder { - fn new(_: String, _: &Table) -> Reorder { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(msg) = self.inp.recv_any().await { - let id = msg - .info() - .partial_id - .expect("partial_id required by reorder"); - assert!(id >= self.seq_id); - if id == self.seq_id { - self.seq_id += 1; - self.out.send_any(msg).await.ok(); - } else { - self.cache.insert(id, msg); - } - - let mut stop = self.seq_id; - for &id in self.cache.keys() { - assert!(id >= self.seq_id); - if id == self.seq_id { - self.seq_id += 1; - } else { - stop = id; - break; - } - } - if stop != self.seq_id { - let rest = if stop > self.seq_id { - let rest = self.cache.split_off(&stop); - std::mem::replace(&mut self.cache, rest) - } else { - std::mem::take(&mut self.cache) - }; - - for (_, msg) in rest { - self.out.send_any(msg).await.ok(); - } - } - } else { - assert!(self.cache.is_empty()); - } - Ok(()) - } -} - -node_register!("Reorder", Reorder); - -#[cfg(test)] -mod test { - use crate::envelope::Envelope; - use crate::sandbox::Sandbox; - use futures_util::join; - use rand::prelude::*; - use rand::seq::SliceRandom; - #[flow_rs::rt::test] - async fn test_reorder() { - let reorder = Sandbox::pure("Reorder").unwrap(); - let input = reorder.input("inp").unwrap(); - let output = reorder.output("out").unwrap(); - let handle = reorder.start(); - let send_fut = async move { - let mut rng: StdRng = SeedableRng::from_entropy(); - let mut list: Vec = (0..10).collect(); - list[..].shuffle(&mut rng); - for i in list { - let mut envelope = Envelope::new(0usize).seal(); - envelope.info_mut().partial_id = Some(i); - input.send_any(envelope).await.ok(); - } - input.close(); - }; - - let recv_fut = async move { - let mut seq_id = 0; - while let Ok(msg) = output.recv_any().await { - assert_eq!(msg.info().partial_id, Some(seq_id)); - seq_id += 1; - } - }; - - join!(send_fut, recv_fut); - - handle.await; - } -} diff --git a/flow-rs/src/node/shared.rs b/flow-rs/src/node/shared.rs deleted file mode 100644 index df6b7a4..0000000 --- a/flow-rs/src/node/shared.rs +++ /dev/null @@ -1,294 +0,0 @@ -/** - * \file flow-rs/src/node/shared.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::load_static; -use crate::prelude::*; -use crate::rt::channel::{unbounded, Receiver as ReceiverT, Sender as SenderT}; -use crate::rt::sync::RwLock; -use anyhow::Result; -use std::collections::HashMap; -use std::sync::atomic::{fence, AtomicUsize, Ordering}; -use std::sync::Arc; - -#[derive(Clone)] -struct SharedConns { - inputs: HashMap, - outputs: HashMap, -} - -#[derive(Node)] -struct Shared { - nodes: Vec>, - rx: ReceiverT, - inputs: HashMap>, - outputs: HashMap, -} - -pub struct SharedHandle(pub rt::task::JoinHandle<()>); -// is safe because we visit it only in single thread -unsafe impl Sync for SharedHandle {} -crate::collect!(String, SharedHandle); - -#[derive(Clone)] -pub struct SharedProxy { - ty: String, - conns: SharedConns, - tx: SenderT, - inputs: Vec, - outputs: Vec, -} - -impl Shared { - pub fn new( - local_key: u64, - rx: ReceiverT, - cfg: &crate::config::interlayer::Node, - graphs: &crate::config::interlayer::Config, - ) -> Result { - let mut nodes = load_static(local_key, cfg)?; - let mut inputs = HashMap::new(); - let mut outputs = HashMap::new(); - - let find_cap = - |port| { - let mut cap = 0usize; - for graph in graphs - .graphs - .iter() - .filter(|graph| !graph.nodes.keys().any(|node| node == &cfg.entity.name)) - { - cap = - std::cmp::max( - cap, - graph - .connections - .values() - .map(|conn| { - if conn.rx.iter().chain(conn.tx.iter()).any(|p| { - p.node_name == cfg.entity.name && &p.port_name == port - }) { - conn.cap - } else { - 0 - } - }) - .max() - .expect("unused port in shared nodes"), - ); - } - cap - }; - - for input in &cfg.inputs { - let cap = find_cap(input); - let chan = ChannelStorage::bound(cap); - for node in &mut nodes { - node.set_port(input.as_str(), None, &chan); - } - inputs.insert(input.clone(), Arc::new(chan.sender())); - } - - for output in &cfg.outputs { - let cap = find_cap(output); - let chan = ChannelStorage::bound(cap); - for node in &mut nodes { - node.set_port(output.as_str(), None, &chan); - } - outputs.insert(output.clone(), chan.receiver()); - } - - Ok(Shared { - nodes, - rx, - inputs, - outputs, - }) - } - pub fn boxed(self) -> Box { - Box::new(self) - } -} - -impl Actor for Shared { - fn start( - mut self: Box, - ctx: Context, - resources: ResourceCollection, - ) -> rt::task::JoinHandle<()> { - let (s1, r1) = unbounded::(); - let mut s2s = vec![]; - let mut r2s = vec![]; - for _ in 0..self.outputs.len() { - let (s2, r2) = unbounded::(); - s2s.push(s2); - r2s.push(r2); - } - let inputs = self.inputs.clone(); - if !inputs.is_empty() { - // close in order - crate::rt::task::spawn(async move { - while let Ok(id) = r1.recv().await { - for input in inputs.values() { - input.send_any(DummyEnvelope {}.seal()).await.ok(); - } - for s2 in &s2s { - s2.send(id).await.ok(); - } - } - }); - } - - let mut outputs: HashMap<_, Arc>>> = HashMap::new(); - for (k, input) in std::mem::take(&mut self.outputs) { - let demux = Arc::new(RwLock::new(HashMap::new())); - outputs.insert(k, demux.clone()); - let r2 = r2s.pop().unwrap(); - crate::rt::task::spawn(async move { - loop { - match input.recv_any().await { - Ok(msg) => { - let outputs = demux.read().await; - let output = outputs - .get( - msg.info() - .transfer_addr - .as_ref() - .expect("lost transfer_address"), - ) - .expect("unexpected transfer_address"); - output.send_any(msg).await.ok(); - } - _ if !input.is_closed() => { - if let Ok(id) = r2.recv().await { - demux.write().await.remove(&id); - } - } - _ => break, - } - } - }); - } - - let mut handles = vec![]; - for node in std::mem::take(&mut self.nodes) { - handles.push(node.start(ctx.clone(), resources.clone())); - } - - if !self.inputs.is_empty() || !self.outputs.is_empty() { - crate::rt::task::spawn(async move { - let mut counter = 0; - while let Ok(mut msg) = self.rx.recv().await { - let closed_n = Arc::new(AtomicUsize::new(self.inputs.len())); - let id = counter; - for (k, v) in outputs.iter() { - let output = msg.outputs.remove(k).expect("shared port match fault"); - v.write().await.insert(id, output); - } - fence(Ordering::SeqCst); - for (k, output) in self.inputs.iter_mut() { - let input = msg.inputs.remove(k).expect("shared port match fault"); - let output = output.clone(); - let s1 = s1.clone(); - let closed_n = closed_n.clone(); - crate::rt::task::spawn(async move { - loop { - while let Ok(mut envelope) = input.recv_any().await { - envelope.info_mut().transfer_addr = Some(id); - output.send_any(envelope).await.ok(); - } - if input.is_closed() { - break; - } else { - // todo: fix nested shared subgraph - unreachable!("nested shared subgraph is not supported"); - } - } - if 1 == closed_n.fetch_sub(1, Ordering::Relaxed) { - s1.send(id).await.ok(); - } - }); - } - - counter += 1; - } - }); - } - - crate::rt::task::spawn(async move { - futures_util::future::join_all(handles).await; - }) - } -} - -impl SharedProxy { - fn new( - local_key: u64, - tx: SenderT, - cfg: &crate::config::interlayer::Node, - ) -> Result { - // shared subgraph dont support dyn type - let inputs: Vec<_> = inputs(local_key, cfg.entity.ty.first().unwrap())? - .into_iter() - .collect(); - let outputs: Vec<_> = outputs(local_key, cfg.entity.ty.first().unwrap())? - .into_iter() - .collect(); - Ok(SharedProxy { - ty: cfg.entity.ty.first().unwrap().to_owned(), - tx, - conns: SharedConns { - inputs: HashMap::new(), - outputs: HashMap::new(), - }, - inputs, - outputs, - }) - } - - pub fn set_port(&mut self, port_name: &str, chan: &ChannelStorage) { - if self.inputs.iter().any(|p| p == port_name) { - self.conns - .inputs - .insert(port_name.to_owned(), chan.receiver()); - } else if self.outputs.iter().any(|p| p == port_name) { - self.conns - .outputs - .insert(port_name.to_owned(), chan.sender()); - } else { - unreachable!() - } - } - - pub fn build(self) { - self.tx.try_send(self.conns).ok(); - } - - pub fn close(&self) { - self.tx.close(); - } -} - -crate::collect!(String, SharedProxy); - -pub fn load_shared( - cfg: &crate::config::interlayer::Node, - graphs: &crate::config::interlayer::Config, - ctx: Context, - resources: ResourceCollection, -) -> Result { - let local_key = ctx.local_key; - let (s, r) = unbounded(); - let shared = Shared::new(ctx.local_key, r, cfg, graphs)?.boxed(); - let handle = shared.start(ctx, resources); - SharedHandle::registry_local() - .get(local_key) - .insert(cfg.entity.name.clone(), SharedHandle(handle)); - SharedProxy::new(local_key, s, cfg) -} diff --git a/flow-rs/src/node/transform.rs b/flow-rs/src/node/transform.rs deleted file mode 100644 index 3a591da..0000000 --- a/flow-rs/src/node/transform.rs +++ /dev/null @@ -1,125 +0,0 @@ -/** - * \file flow-rs/src/node/transform.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::rt; -use anyhow::Result; -use flow_rs::prelude::*; -use toml::value::Table; - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor, Default)] -struct Transform {} - -impl Transform { - fn new(_name: String, _args: &Table) -> Transform { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - if let Ok(msg) = self.inp.recv_any().await { - self.out.send_any(msg).await.ok(); - } - Ok(()) - } -} - -node_register!("Transform", Transform); - -#[inputs(inp)] -#[outputs(out:dyn)] -#[derive(Node, Default)] -struct DynOutTransform {} - -impl DynOutTransform { - fn new(_name: String, _args: &Table) -> DynOutTransform { - Default::default() - } -} - -impl Actor for DynOutTransform { - fn start(mut self: Box, _: Context, _: ResourceCollection) -> rt::task::JoinHandle<()> { - let (s, r) = rt::channel::unbounded(); - rt::task::spawn(async move { - while let Ok((_, out)) = self.out.fetch().await { - let inp = self.inp.clone(); - s.send(rt::task::spawn(async move { - let mut empty_n = 0; - loop { - while let Ok(msg) = inp.recv_any().await { - out.send_any(msg).await.ok(); - } - if inp.is_closed() { - break; - } - let n = inp.empty_n(); - for _ in empty_n..n { - out.send_any(DummyEnvelope {}.seal()).await.ok(); - } - empty_n = n; - } - })) - .await - .ok(); - } - }); - rt::task::spawn(async move { - while let Ok(handle) = r.recv().await { - handle.await; - } - }) - } -} - -node_register!("DynOutTransform", DynOutTransform); - -#[inputs(inp: dyn)] -#[outputs(out)] -#[derive(Node, Default)] -struct DynInTransform {} - -impl DynInTransform { - fn new(_name: String, _args: &Table) -> DynInTransform { - Default::default() - } -} - -impl Actor for DynInTransform { - fn start(self: Box, _: Context, _: ResourceCollection) -> rt::task::JoinHandle<()> { - let (s, r) = rt::channel::unbounded(); - rt::task::spawn(async move { - while let Ok((_, inp)) = self.inp.fetch().await { - let out = self.out.clone(); - s.send(rt::task::spawn(async move { - while !inp.is_closed() { - while let Ok(msg) = inp.recv_any().await { - out.send_any(msg).await.ok(); - } - assert!( - inp.empty_n() == 0, - "DynInTransform is not supported in a shared subgraph" - ); - } - })) - .await - .ok(); - } - }); - rt::task::spawn(async move { - while let Ok(handle) = r.recv().await { - handle.await; - } - }) - } -} - -node_register!("DynInTransform", DynInTransform); diff --git a/flow-rs/src/registry.rs b/flow-rs/src/registry.rs deleted file mode 100644 index 17ebbe9..0000000 --- a/flow-rs/src/registry.rs +++ /dev/null @@ -1,185 +0,0 @@ -/** - * \file flow-rs/src/registry.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use std::borrow::Borrow; -use std::collections::HashMap; -use std::hash::Hash; -use std::sync::{Arc, RwLock}; - -pub trait Collect: Sized + 'static { - fn registry_global() -> &'static Registry; - fn registry_local() -> &'static RegistryMap; -} -struct RegistryInner { - elems: HashMap, -} -pub struct Registry { - inner: RwLock>>, -} -pub struct RegistryMap { - inner: RwLock>>>, -} - -impl Default for Registry { - fn default() -> Registry { - Registry { - inner: RwLock::new(RegistryInner { - elems: HashMap::new(), - }), - } - } -} - -impl Default for RegistryMap { - fn default() -> RegistryMap { - RegistryMap { - inner: RwLock::new(Default::default()), - } - } -} - -impl Registry { - pub(crate) fn get(&self, id: &Q) -> Option> - where - ID: Borrow, - Q: Hash + Eq, - { - let registry = self.inner.read().unwrap(); - registry.elems.get(id).cloned() - } - - pub(crate) fn insert(&self, id: Q, elem: T) - where - Q: Into, - { - let mut registry = self.inner.write().unwrap(); - registry.elems.insert(id.into(), Arc::new(elem)); - } - - pub(crate) fn for_each(&self, f: F) - where - F: FnMut(&T), - { - let registry = self.inner.read().unwrap(); - registry.elems.values().map(|x| x.as_ref()).for_each(f); - } - - pub(crate) fn to_vec(&self) -> Vec> { - let mut registry = self.inner.write().unwrap(); - let elems = std::mem::take(&mut registry.elems); - elems.into_iter().map(|(_, v)| v).collect() - } -} - -impl Registry -where - ID: Hash + Clone + Eq, -{ - pub(crate) fn keys(&self) -> Vec { - let registry = self.inner.read().unwrap(); - registry.elems.keys().cloned().collect() - } -} - -impl Clone for Registry -where - ID: Clone, -{ - fn clone(&self) -> Self { - let inner = self.inner.read().unwrap(); - Registry { - inner: RwLock::new(RegistryInner { - elems: inner.elems.clone(), - }), - } - } -} - -type GlobalCallback = RwLock>>; - -lazy_static::lazy_static! { - pub(crate) static ref INITIALIZE: GlobalCallback = RwLock::new(vec![]); -} - -lazy_static::lazy_static! { - pub(crate) static ref FINALIZE: GlobalCallback = RwLock::new(vec![]); -} - -pub(crate) fn initialize(id: u64) { - INITIALIZE.read().unwrap().iter().for_each(|f| f(id)); -} - -pub(crate) fn finalize(id: u64) { - FINALIZE.read().unwrap().iter().for_each(|f| f(id)); -} - -impl> RegistryMap -where - ID: 'static + Eq + Hash + Clone, -{ - pub(crate) fn __or_insert_only_in_ctor(&self, id: u64) -> Arc> { - let mut map = self.inner.write().unwrap(); - map.entry(id) - .or_insert_with(|| Arc::new(T::registry_global().clone())) - .clone() - } - - pub(crate) fn get(&self, id: u64) -> Arc> { - let map = self.inner.read().unwrap(); - map.get(&id).cloned().unwrap() - } - - pub(crate) fn remove(&self, id: u64) { - let mut map = self.inner.write().unwrap(); - map.remove(&id); - } -} - -pub fn __submit_only_in_ctor>(key: Q, value: T) -where - ID: Eq + Hash + 'static, - Q: Into, -{ - T::registry_global().insert(key, value); -} - -#[macro_export] -#[doc(hidden)] -macro_rules! collect { - ($id:ty, $ty:ty) => { - impl $crate::registry::Collect<$id> for $ty { - #[inline] - fn registry_global() -> &'static $crate::registry::Registry<$id, Self> { - lazy_static::lazy_static! { - static ref REGISTRY: $crate::registry::Registry<$id, $ty> = - $crate::registry::Registry::default(); - }; - ®ISTRY - } - #[inline] - fn registry_local() -> &'static $crate::registry::RegistryMap<$id, Self> { - lazy_static::lazy_static! { - static ref REGISTRY: $crate::registry::RegistryMap<$id, $ty> = - $crate::registry::RegistryMap::default(); - }; - #[flow_rs::ctor] - fn init() { - let mut initialize = $crate::registry::INITIALIZE.write().unwrap(); - initialize.push(Box::new(|id| { - REGISTRY.__or_insert_only_in_ctor(id); - })); - let mut finalize = $crate::registry::FINALIZE.write().unwrap(); - finalize.push(Box::new(|id| REGISTRY.remove(id))); - } - ®ISTRY - } - } - }; -} diff --git a/flow-rs/src/resource/any_resource.rs b/flow-rs/src/resource/any_resource.rs deleted file mode 100644 index bd29f85..0000000 --- a/flow-rs/src/resource/any_resource.rs +++ /dev/null @@ -1,42 +0,0 @@ -use pyo3::Python; -use std::any::{Any, TypeId}; -use std::sync::Arc; - -pub trait DowncastArc { - fn into_arc_any(self: Arc) -> Arc; -} - -impl DowncastArc for T -where - T: 'static + Send + Sync, -{ - fn into_arc_any(self: Arc) -> Arc { - self - } -} - -pub trait Resource: Any + DowncastArc + Send + Sync { - fn to_python(&self, py: Python) -> pyo3::PyObject; -} - -impl dyn Resource { - pub fn is(&self) -> bool { - let t = TypeId::of::(); - let boxed = self.type_id(); - - t == boxed - } - #[inline] - pub fn downcast_arc(self: Arc) -> Result, Arc> - where - Self: Send + Sync, - { - if self.is::() { - Ok(DowncastArc::into_arc_any(self).downcast::().unwrap()) - } else { - Err(self) - } - } -} - -pub type AnyResource = Arc; diff --git a/flow-rs/src/resource/collection.rs b/flow-rs/src/resource/collection.rs deleted file mode 100644 index 6b39c5d..0000000 --- a/flow-rs/src/resource/collection.rs +++ /dev/null @@ -1,86 +0,0 @@ -use super::storage::{storage, ResourceStorage}; -use super::{AnyResource, Resource}; -use crate::config::presentation::Entity; -use std::collections::HashMap; -use std::sync::Arc; - -/// A collection of any resource which has been registered -#[derive(Clone, Default)] -pub struct ResourceCollection { - resources: HashMap, - storage: Arc, -} - -#[derive(Default)] -pub struct UniqueResourceCollection { - resources: HashMap, - storage: ResourceStorage, -} - -impl UniqueResourceCollection { - pub(crate) fn new( - local_key: u64, - id: u64, - cfg: &HashMap, - ) -> UniqueResourceCollection { - UniqueResourceCollection { - resources: cfg.keys().cloned().map(|x| (x, id)).collect(), - storage: storage(local_key, id, cfg), - } - } - - pub(crate) fn take_into_arc(self) -> ResourceCollection { - ResourceCollection { - resources: self.resources, - storage: Arc::new(self.storage), - } - } -} - -impl ResourceCollection { - pub(crate) fn filter(&self, names: &[&str]) -> ResourceCollection { - ResourceCollection { - resources: names - .iter() - .map(|&name| self.resources.get_key_value(name)) - .flatten() - .map(|(k, v)| (k.clone(), *v)) - .collect(), - storage: self.storage.clone(), - } - } - // Chain two ResourceCollections, and `other` will overwrite `self` - pub(crate) async fn chain(self, mut other: UniqueResourceCollection) -> ResourceCollection { - let other_storage = other.storage.get_mut(); - self.storage.lock().await.append(other_storage); - let mut resources = other.resources.clone(); - for (k, v) in self.resources.into_iter() { - resources.entry(k).or_insert(v); - } - ResourceCollection { - resources, - storage: self.storage, - } - } - /// Get a resource by name, return None if the type `T` is not match or the name is not exist - pub async fn get(&self, name: &str) -> Option> - where - T: Resource, - { - self.get_any(name) - .await - .map(|x| x.downcast_arc().ok()) - .flatten() - } - pub async fn get_any(&self, name: &str) -> Option { - if let Some((k, v)) = self.resources.get_key_value(name) { - self.storage.lock().await.get(&(*v, k.clone())) - } else { - None - } - } - /// Get all keys - pub fn keys(&self) -> Vec { - self.resources.keys().cloned().collect() - } -} diff --git a/flow-rs/src/resource/lazy.rs b/flow-rs/src/resource/lazy.rs deleted file mode 100644 index e27b711..0000000 --- a/flow-rs/src/resource/lazy.rs +++ /dev/null @@ -1,55 +0,0 @@ -/** - * \file flow-rs/src/resource/lazy.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ - -// Async initialized lazily -pub struct LazyCell { - cons: Box T + Send + Sync>, - inner: Option, -} - -impl LazyCell { - pub fn new(cons: Box T + Send + Sync>) -> LazyCell { - LazyCell { cons, inner: None } - } - - pub fn revert(&mut self) { - self.inner = None; - } - - pub fn get(&mut self) -> &T { - if self.inner.is_none() { - self.inner = Some((self.cons)()); - } - self.inner.as_ref().unwrap() - } - - pub fn view(&self) -> Option<&T> { - self.inner.as_ref() - } -} - -// we will lock when we set UnsafeCell -unsafe impl Sync for LazyCell where T: Send + Sync {} - -#[cfg(test)] -mod test { - use super::*; - use std::sync::Arc; - #[crate::rt::test] - async fn test_basis() { - let cap = 100; - let mut raw = LazyCell::new(Box::new(move || Arc::new(Vec::::with_capacity(cap)))); - assert!(raw.view().is_none()); - let has_init = raw.get(); - assert_eq!(has_init.capacity(), cap); - assert!(raw.view().is_some()); - } -} diff --git a/flow-rs/src/resource/mod.rs b/flow-rs/src/resource/mod.rs deleted file mode 100644 index 7809132..0000000 --- a/flow-rs/src/resource/mod.rs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * \file flow-rs/src/resource/mod.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -mod any_resource; -mod collection; -mod lazy; -mod storage; - -use crate::config::presentation::Entity; -use crate::registry::Collect; -use any_resource::*; -use lazy::LazyCell; - -pub use any_resource::Resource; -pub use collection::*; - -type ResResult = Result; - -#[doc(hidden)] -pub struct ResourceSlice { - pub cons: Box ResResult + Send + Sync>, -} -crate::collect!(String, ResourceSlice); - -#[cfg(test)] -mod test { - use super::*; - use std::collections::HashMap; - use std::sync::atomic::{AtomicBool, Ordering}; - use std::sync::Arc; - - impl Resource for AtomicBool { - fn to_python(&self, _: pyo3::Python) -> pyo3::PyObject { - unimplemented!() - } - } - - #[crate::rt::test] - async fn test_basis() { - let local_key = crate::LOCAL_KEY.fetch_add(1, Ordering::Relaxed); - crate::registry::initialize(local_key); - ResourceSlice::registry_local().get(local_key).insert( - "abool_test", - ResourceSlice { - cons: Box::new(|_, _| Ok(Arc::new(AtomicBool::new(true)))), - }, - ); - let mut map = HashMap::new(); - map.insert( - "abool_test_instance".to_owned(), - Entity { - name: "abool_test_instance".to_owned(), - ty: "abool_test".to_owned(), - args: Default::default(), - }, - ); - let collection = UniqueResourceCollection::new(local_key, 0, &map).take_into_arc(); - let resource = collection.get::("abool_test_instance").await; - assert!(resource.is_some()); - let resource = resource.unwrap(); - let is = resource.load(Ordering::Relaxed); - assert!(is); - crate::registry::finalize(local_key); - } -} diff --git a/flow-rs/src/resource/storage.rs b/flow-rs/src/resource/storage.rs deleted file mode 100644 index ac1225a..0000000 --- a/flow-rs/src/resource/storage.rs +++ /dev/null @@ -1,75 +0,0 @@ -/** - * \file flow-rs/src/resource/storage.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use super::*; -use crate::rt::sync::Mutex; -use std::collections::HashMap; -use std::sync::Arc; - -#[derive(Default)] -pub(crate) struct StorageInner { - resources: HashMap<(u64, String), lazy::LazyCell>, -} - -impl StorageInner { - pub(crate) fn get(&mut self, key: &(u64, String)) -> Option { - if let Some(resource) = self.resources.get_mut(key) { - if let Ok(res) = resource.get() { - return Some(res.clone()); - } else { - resource.revert(); - } - } else { - return None; - } - for v in self.resources.values_mut() { - if let Some(Ok(res)) = v.view() { - // it is safe because of `&mut self` - if Arc::strong_count(res) == 1 { - v.revert(); - } - } - } - let resource = self.resources.get_mut(key).unwrap(); - if let Ok(res) = resource.get() { - Some(res.clone()) - } else { - // FIXME: panic or throw err ? - None - } - } - - pub(crate) fn append(&mut self, other: &mut StorageInner) { - for (k, v) in std::mem::take(&mut other.resources).into_iter() { - self.resources.insert(k, v); - } - } -} - -pub(crate) type ResourceStorage = Mutex; - -pub(crate) fn storage(local_key: u64, id: u64, cfg: &HashMap) -> ResourceStorage { - let mut resources = HashMap::new(); - for (name, res) in cfg { - let slice = ResourceSlice::registry_local() - .get(local_key) - .get(&res.ty) - .unwrap(); - let name_cloned = name.clone(); - let args_cloned = res.args.clone(); - resources.insert( - (id, name.clone()), - LazyCell::new(Box::new(move || { - (slice.cons)(name_cloned.clone(), &args_cloned) - })), - ); - } - Mutex::new(StorageInner { resources }) -} diff --git a/flow-rs/src/sandbox.rs b/flow-rs/src/sandbox.rs deleted file mode 100644 index c64e29b..0000000 --- a/flow-rs/src/sandbox.rs +++ /dev/null @@ -1,206 +0,0 @@ -/** - * \file flow-rs/src/sandbox.rs - * MegFlow is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2019-2021 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -use crate::broker::Broker; -use crate::registry::Collect; -use crate::resource::*; -use crate::rt::task::JoinHandle; -use crate::{ - channel::{Receiver, Sender}, - config::interlayer, - graph::context, - node::{inputs, load_static, outputs, Actor}, - prelude::ChannelStorage, -}; -use anyhow::Result; -use std::collections::HashMap; -use std::sync::atomic::Ordering; -use std::sync::Once; - -static ONCE_INIT_I: Once = Once::new(); -static ONCE_INIT_O: Once = Once::new(); - -pub struct Sandbox { - local_key: u64, - ty: String, - actor: Box, - broker: Broker, - inputs: HashMap, - outputs: HashMap, -} - -impl Sandbox { - pub fn pure(ty: &str) -> Result { - Sandbox::new(ty, Default::default(), vec![]) - } - pub fn with_args(ty: &str, args: toml::value::Table) -> Result { - Sandbox::new(ty, args, vec![]) - } - pub fn new(ty: &str, args: toml::value::Table, res: Vec) -> Result { - let local_key = crate::LOCAL_KEY.fetch_add(1, Ordering::Relaxed); - crate::registry::initialize(local_key); - - let config = interlayer::Node { - entity: interlayer::Entity { - name: format!("sandbox-{}", ty), - ty: vec![ty.to_owned()], - args, - }, - res, - cloned: None, - inputs: Default::default(), - outputs: Default::default(), - is_dyn: false, - is_shared: false, - }; - let inputs_name: Vec = inputs(local_key, ty)?.into_iter().collect(); - let outputs_name: Vec = outputs(local_key, ty)?.into_iter().collect(); - let mut inputs = HashMap::new(); - let mut outputs = HashMap::new(); - let mut actor = load_static(local_key, &config)?.pop().unwrap(); - let mut broker = Broker::new(); - - if inputs_name.iter().any(|x| x.starts_with("dyn")) { - ONCE_INIT_I.call_once(|| { - graph_register(local_key, "NoopProducer", "out"); - }); - } - - if outputs_name.iter().any(|x| x.starts_with("dyn")) { - ONCE_INIT_O.call_once(|| { - graph_register(local_key, "NoopConsumer", "inp"); - }); - } - - for input in &inputs_name { - if !input.starts_with("dyn") { - let chan = ChannelStorage::unbound(); - actor.set_port(input, Some(0), &chan); - let mut input = input.as_str(); - if input.starts_with('[') { - input = &input[1..input.len() - 1]; - } - inputs.insert(input.to_owned(), chan); - } else { - let client = broker.subscribe("_NoopProducer_".to_owned()); - actor.set_port_dynamic(local_key, input, "out".to_owned(), 16, vec![client]); - } - } - for output in &outputs_name { - if !output.starts_with("dyn") { - let chan = ChannelStorage::unbound(); - actor.set_port(output, Some(0), &chan); - let mut output = output.as_str(); - if output.starts_with('[') { - output = &output[1..output.len() - 1]; - } - outputs.insert(output.to_owned(), chan); - } else { - let client = broker.subscribe("_NoopConsumer_".to_owned()); - actor.set_port_dynamic(local_key, output, "inp".to_owned(), 16, vec![client]); - } - } - Ok(Sandbox { - local_key, - ty: ty.to_owned(), - broker, - actor, - outputs, - inputs, - }) - } - - pub fn input(&self, name: &str) -> Option { - self.inputs.get(name).map(|x| x.sender()) - } - - pub fn output(&self, name: &str) -> Option { - self.outputs.get(name).map(|x| x.receiver()) - } - - pub fn start(mut self) -> JoinHandle<()> { - let local_key = self.local_key; - let ctx = context("Sandbox".to_owned(), self.ty.clone(), local_key); - crate::rt::task::spawn(async move { - futures_util::join!( - self.actor.start( - ctx.clone(), - UniqueResourceCollection::new(ctx.local_key, ctx.id, &Default::default()) - .take_into_arc() - ), - self.broker.run() - ); - crate::registry::finalize(local_key); - }) - } -} - -fn graph_register(local_key: u64, ty: &str, port_name: &str) { - let inputs = if port_name == "inp" { - vec![port_name.to_owned()] - } else { - vec![] - }; - let outputs = if port_name == "out" { - vec![port_name.to_owned()] - } else { - vec![] - }; - let node = interlayer::Node { - entity: interlayer::Entity { - name: "noop".to_owned(), - ty: vec![ty.to_owned()], - args: Default::default(), - }, - cloned: None, - inputs: inputs.iter().cloned().collect(), - outputs: outputs.iter().cloned().collect(), - is_dyn: false, - is_shared: false, - res: vec![], - }; - let port = interlayer::Port { - node_type: vec![ty.to_owned()], - node_name: "noop".to_owned(), - port_type: interlayer::PortTy::Unit, - port_tag: None, - port_name: port_name.to_owned(), - }; - let conn = interlayer::Connection { - cap: 16, - tx: inputs.iter().map(|_| port.clone()).collect(), - rx: outputs.iter().map(|_| port.clone()).collect(), - }; - let cfg = interlayer::Graph { - name: format!("_{}_", ty), - nodes: vec![("noop".to_owned(), node)].into_iter().collect(), - inputs: inputs.clone(), - outputs: outputs.clone(), - connections: vec![(port_name.to_owned(), conn)].into_iter().collect(), - resources: Default::default(), - is_shared: false, - global_res: vec![], - }; - let info = crate::node::NodeInfo { - inputs: cfg.inputs.clone(), - outputs: cfg.outputs.clone(), - }; - crate::graph::GraphSlice::registry_local() - .get(local_key) - .insert( - cfg.name.clone(), - crate::graph::GraphSlice { - cons: Box::new(move |name| { - crate::graph::Graph::load(context(name, cfg.name.clone(), local_key), &cfg) - }), - info, - }, - ); -} diff --git a/flow-rs/tests/01-subgraph.rs b/flow-rs/tests/01-subgraph.rs deleted file mode 100644 index c8b1a93..0000000 --- a/flow-rs/tests/01-subgraph.rs +++ /dev/null @@ -1,130 +0,0 @@ -mod nodes_ext; - -use anyhow::Result; -use flow_rs::prelude::*; - -#[rt::test] -async fn test_error() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -[[graphs]] -name="sub" -nodes=[ - {name="a", ty="Transform"}, - {name="b", ty="ErrorOpr"}, - {name="c", ty="Transform"} -] -inputs=[{name="inp",cap=1,ports=["a:inp"]}] -outputs=[{name="out",cap=1,ports=["c:out"]}] -connections=[ - {cap=1,ports=["a:out", "b:inp"]}, - {cap=1,ports=["b:out", "c:inp"]} -] -[[graphs]] -name="test" -nodes=[ - {name="a", ty="NeverOpr"}, - {name="b", ty="sub"}, - {name="c", ty="NoopConsumer"}, -] -connections=[ - {cap=1,ports=["a:out", "b:inp"]}, - {cap=1,ports=["b:out", "c:inp"]} -] - "#, - )?; - graph.start().await; - Ok(()) -} - -#[rt::test] -async fn test_basis() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -[[graphs]] -name="sub" -nodes=[{name="b",ty="BinaryOpr"}] -inputs=[ - {name="a",cap=1,ports=["b:a"]}, - {name="b",cap=1,ports=["b:b"]} -] -outputs=[{name="c",cap=1,ports=["b:c"]}] -[[graphs]] -name="test" -inputs=[{name="inp",cap=1,ports=["t1:inp","t2:inp"]}] -outputs=[{name="out",cap=2,ports=["t3:out"]}] -connections=[ - {cap=1,ports=["t1:out", "sub:a"]}, - {cap=1,ports=["t2:out", "sub:b"]}, - {cap=1,ports=["t3:inp", "sub:c"]} -] -nodes=[ - {name="sub",ty="sub"}, - {name="t1",ty="Transform"}, - {name="t2",ty="Transform"}, - {name="t3",ty="Transform"} -] - "#, - )?; - let inp = graph.input("inp").unwrap(); - let out = graph.output("out").unwrap(); - let handle = graph.start(); - - inp.send(Envelope::new(1usize)).await.ok(); - inp.close(); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_err()); - - handle.await; - - Ok(()) -} - -#[rt::test] -async fn test_empty() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -nodes=[{name="gb",ty="BinaryOpr"}] -[[graphs]] -name="sub" -inputs=[ - {name="a",cap=1,ports=["gb:a"]}, - {name="b",cap=1,ports=["gb:b"]} -] -outputs=[{name="c",cap=1,ports=["gb:c"]}] -[[graphs]] -name="test" -inputs=[{name="inp",cap=1,ports=["t1:inp","t2:inp"]}] -outputs=[{name="out",cap=2,ports=["t3:out"]}] -connections=[ - {cap=1,ports=["t1:out", "sub:a"]}, - {cap=1,ports=["t2:out", "sub:b"]}, - {cap=1,ports=["t3:inp", "sub:c"]} -] -nodes=[ - {name="sub",ty="sub"}, - {name="t1",ty="Transform"}, - {name="t2",ty="Transform"}, - {name="t3",ty="Transform"} -] - "#, - )?; - let inp = graph.input("inp").unwrap(); - let out = graph.output("out").unwrap(); - let handle = graph.start(); - - inp.send(Envelope::new(1usize)).await.ok(); - inp.close(); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_err()); - handle.await; - Ok(()) -} diff --git a/flow-rs/tests/02-dyn-subgraph.rs b/flow-rs/tests/02-dyn-subgraph.rs deleted file mode 100644 index 4c669c2..0000000 --- a/flow-rs/tests/02-dyn-subgraph.rs +++ /dev/null @@ -1,39 +0,0 @@ -mod nodes_ext; - -use anyhow::Result; -use flow_rs::prelude::*; - -#[rt::test] -async fn test_basis() -> Result<()> { - let _ = load( - None, - r#" -main="test" -[[graphs]] -name="sub" -nodes=[{name="b",ty="BinaryOpr"}] -inputs=[ - {name="a",cap=1,ports=["b:a"]}, - {name="b",cap=1,ports=["b:b"]} -] -outputs=[{name="c",cap=1,ports=["b:c"]}] -[[graphs]] -name="test" -inputs=[{name="inp",cap=1,ports=["t1:inp","t2:inp"]}] -outputs=[{name="out",cap=1,ports=["t3:out"]}] -connections=[ - {cap=1,ports=["t1:out", "sub:a"]}, - {cap=1,ports=["t2:out", "sub:b"]}, - {cap=1,ports=["t3:inp", "sub:c"]} -] -nodes=[ - {name="sub",ty="sub"}, - {name="t1",ty="DynOutTransform"}, - {name="t2",ty="DynOutTransform"}, - {name="t3",ty="DynInTransform"} -] - "#, - )?; - - Ok(()) -} diff --git a/flow-rs/tests/03-share-subgraph.rs b/flow-rs/tests/03-share-subgraph.rs deleted file mode 100644 index 0fd1daa..0000000 --- a/flow-rs/tests/03-share-subgraph.rs +++ /dev/null @@ -1,87 +0,0 @@ -mod nodes_ext; - -use anyhow::Result; -use flow_rs::prelude::*; - -#[rt::test] -async fn test_basis() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -nodes = [{name="sub", ty="sub"}] -[[graphs]] -name="sub" -nodes=[{name="b",ty="BinaryOpr"}] -inputs=[ - {name="a",cap=1,ports=["b:a"]}, - {name="b",cap=1,ports=["b:b"]} -] -outputs=[{name="c",cap=2,ports=["b:c"]}] -[[graphs]] -name="test" -inputs=[{name="inp",cap=1,ports=["t1:inp","t2:inp"]}] -outputs=[{name="out",cap=1,ports=["t3:out"]}] -connections=[ - {cap=1,ports=["t1:out", "sub:a"]}, - {cap=1,ports=["t2:out", "sub:b"]}, - {cap=1,ports=["t3:inp", "sub:c"]} -] -nodes=[ - {name="t1",ty="Transform"}, - {name="t2",ty="Transform"}, - {name="t3",ty="Transform"} -] - "#, - )?; - - let inp = graph.input("inp").unwrap(); - let out = graph.output("out").unwrap(); - let handle = graph.start(); - - inp.send(Envelope::new(1usize)).await.ok(); - inp.close(); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_ok()); - assert!(out.recv::().await.is_err()); - handle.await; - - Ok(()) -} - -#[test] -#[should_panic] -fn test_empty() { - let _ = load( - None, - r#" -main="test" -nodes=[ - {name="gb",ty="BinaryOpr"}, - {name="sub",ty="sub"} -] -[[graphs]] -name="sub" -inputs=[ - {name="a",cap=1,ports=["gb:a"]}, - {name="b",cap=1,ports=["gb:b"]} -] -outputs=[{name="c",cap=1,ports=["gb:c"]}] -[[graphs]] -name="test" -inputs=[{name="inp",cap=1,ports=["t1:inp","t2:inp"]}] -outputs=[{name="out",cap=1,ports=["t3:out"]}] -connections=[ - {cap=1,ports=["t1:out", "sub:a"]}, - {cap=1,ports=["t2:out", "sub:b"]}, - {cap=1,ports=["t3:inp", "sub:c"]} -] -nodes=[ - {name="t1",ty="Transform"}, - {name="t2",ty="Transform"}, - {name="t3",ty="Transform"} -] - "#, - ) - .is_ok(); -} diff --git a/flow-rs/tests/04-isolated.rs b/flow-rs/tests/04-isolated.rs deleted file mode 100644 index 35af495..0000000 --- a/flow-rs/tests/04-isolated.rs +++ /dev/null @@ -1,49 +0,0 @@ -mod nodes_ext; - -use anyhow::Result; -use flow_rs::prelude::*; - -#[rt::test] -async fn test_isolated() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -[[graphs]] -name="test" -nodes=[ - {name="a", ty="Isolated"}, -] - "#, - )?; - graph.start().await; - Ok(()) -} - -#[rt::test] -async fn test_isolated_in_global() -> Result<()> { - let mut graph = load( - None, - r#" -main="test" -[[nodes]] -name="a" -ty="IsolatedNever" -[[graphs]] -name="test" -[[graphs.inputs]] -name="inp" -cap=1 -ports=["t:inp"] -[[graphs.outputs]] -name="out" -cap=1 -ports=["t:out"] -[[graphs.nodes]] -name="t" -ty="Transform" - "#, - )?; - graph.start().await; - Ok(()) -} diff --git a/flow-rs/tests/nodes_ext.rs b/flow-rs/tests/nodes_ext.rs deleted file mode 100644 index baef034..0000000 --- a/flow-rs/tests/nodes_ext.rs +++ /dev/null @@ -1,122 +0,0 @@ -use anyhow::Result; -use flow_rs::prelude::*; -use futures_util::{select, stream::FuturesUnordered, StreamExt}; -use toml::value::Table; - -#[inputs(a, b)] -#[outputs(c)] -#[derive(Node, Actor, Default)] -struct BinaryOpr {} - -impl BinaryOpr { - fn new(_name: String, _args: &Table) -> BinaryOpr { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - let mut recv_a = FuturesUnordered::new(); - recv_a.push(self.a.recv_any()); - let mut recv_b = FuturesUnordered::new(); - recv_b.push(self.b.recv_any()); - loop { - select! { - a = recv_a.select_next_some() => { - if let Ok(a) = a { - self.c.send_any(a).await.ok(); - recv_a.push(self.a.recv_any()); - } - } - b = recv_b.select_next_some() => { - if let Ok(b) = b { - self.c.send_any(b).await.ok(); - recv_b.push(self.b.recv_any()); - } - } - complete => break, - } - } - Ok(()) - } -} - -node_register!("BinaryOpr", BinaryOpr); - -#[inputs(inp)] -#[outputs(out)] -#[derive(Node, Actor, Default)] -struct ErrorOpr {} - -impl ErrorOpr { - fn new(_name: String, _: &Table) -> ErrorOpr { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - Err(anyhow::anyhow!("error")) - } -} - -node_register!("ErrorOpr", ErrorOpr); - -#[inputs] -#[outputs(out)] -#[derive(Node, Actor, Default)] -struct NeverOpr {} - -impl NeverOpr { - fn new(_name: String, _: &Table) -> NeverOpr { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, ctx: &Context) -> Result<()> { - ctx.wait().await; - Ok(()) - } -} - -node_register!("NeverOpr", NeverOpr); - -#[inputs] -#[outputs] -#[derive(Node, Actor, Default)] -struct Isolated {} - -impl Isolated { - fn new(_name: String, _: &Table) -> Self { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, _: &Context) -> Result<()> { - Ok(()) - } -} - -node_register!("Isolated", Isolated); - -#[inputs] -#[outputs] -#[derive(Node, Actor, Default)] -struct IsolatedNever {} - -impl IsolatedNever { - fn new(_name: String, _: &Table) -> Self { - Default::default() - } - - async fn initialize(&mut self, _: ResourceCollection) {} - async fn finalize(&mut self) {} - async fn exec(&mut self, ctx: &Context) -> Result<()> { - ctx.wait().await; - Ok(()) - } -} - -node_register!("IsolatedNever", IsolatedNever); diff --git a/logo.png b/logo.png deleted file mode 100644 index 56caf972592aa6992ac4f3938c1e7edb26c39d87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27834 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 QPqLH$?=k%Seg`A}25Zon2><{9 diff --git a/pylintrc b/pylintrc deleted file mode 100644 index db110b9..0000000 --- a/pylintrc +++ /dev/null @@ -1,610 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-whitelist=['cv2'] - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS,_internal - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use. -jobs=1 - -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. -limit-inference-results=100 - -# List of plugins (as comma separated values of python module names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable=print-statement, - no-else-return, - len-as-condition, - bad-continuation, - redefined-builtin, # TBD - arguments-differ, # TBD - invalid-name, # TBD - too-many-locals, # TBD - too-many-attributes, # TBD - too-many-arguments, # TBD - too-many-instance-attributes, # TBD - too-few-public-methods, # TBD - protected-access, # TBD - no-self-use, # TBD - cyclic-import, # TBD - no-else-raise, # TBD - line-too-long, # Although We ensure line length by YAPF, there are some cases YAPF won't split lines (e.g. comments). We just ignore these cases. - fixme, # Will be enable after a while - duplicate-code, # Will be enable after a while - missing-function-docstring, # Will be enable after a while - missing-module-docstring, # Will be enable after a while - missing-class-docstring, # Will be enable after a while - singleton-comparison, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, - bad-inline-option, - locally-disabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - use-symbolic-message-instead, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, - attribute-defined-outside-init, - logging-format-interpolation, - unsubscriptable-object, # pylint bug for numpy array - abstract-class-instantiated, # FIXME: Abstract class 'Tensor' with abstract methods instantiated - no-member, - import-error - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a score less than or equal to 10. You -# have access to the variables 'error', 'warning', 'refactor', and 'convention' -# which contain the number of messages in each category, as well as 'statement' -# which is the total number of statements analyzed. This score is used by the -# global evaluation report (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore. -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members=numpy.*, torch.*, megbrain.*, cv2.* - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. -ignore-none=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=numpy.random - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - -# List of decorators that change the signature of a decorated function. -signature-mutators= - - -[STRING] - -# This flag controls whether the implicit-str-concat-in-sequence should -# generate a warning on implicit string concatenation in sequences defined over -# several lines. -check-str-concat-over-line-jumps=no - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes. -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it work, -# install the python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains the private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to the private dictionary (see the -# --spelling-private-dict-file option) instead of raising a message. -spelling-store-unknown-words=no - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO - - -[LOGGING] - -# Format style used to check logging format string. `old` means using % -# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings. -logging-format-style=old - -# Logging modules to check that the string format arguments are in logging -# function parameter format. -logging-modules=logging - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=88 - -# Maximum number of lines in a module. -max-module-lines=1000 - -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[BASIC] - -# Naming style matching correct argument names. -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style. -#argument-rgx= - -# Naming style matching correct attribute names. -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - baz, - toto, - tutu, - tata - -# Naming style matching correct class attribute names. -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. -#class-attribute-rgx= - -# Naming style matching correct class names. -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming- -# style. -#class-rgx= - -# Naming style matching correct constant names. -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style. -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names. -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style. -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma. -good-names=i, - j, - k, - f, - ex, - Run, - _ - -# Include a hint for the correct naming format with invalid-name. -include-naming-hint=no - -# Naming style matching correct inline iteration names. -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. -#inlinevar-rgx= - -# Naming style matching correct method names. -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style. -#method-rgx= - -# Naming style matching correct module names. -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style. -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names. -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style. -#variable-rgx= - - -[IMPORTS] - -# List of modules that can be imported at any level, not just the top level -# one. -allow-any-import-level= - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - -# Couples of modules and preferred modules, separated by a comma. -preferred-modules= - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement (see R0916). -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp, - __post_init__ - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=BaseException, - Exception - From 8381da3d858652bd92c464051a88356c45c813fc Mon Sep 17 00:00:00 2001 From: MegEngine Date: Thu, 4 Nov 2021 18:24:14 +0800 Subject: [PATCH 02/11] update --- README | 1 + 1 file changed, 1 insertion(+) create mode 100644 README diff --git a/README b/README new file mode 100644 index 0000000..14d1d14 --- /dev/null +++ b/README @@ -0,0 +1 @@ +modelserving template From 9c7e32b2fad110ca482b6b1ff1574964f4a360b8 Mon Sep 17 00:00:00 2001 From: MegEngine Date: Sat, 6 Nov 2021 14:22:12 +0800 Subject: [PATCH 03/11] update(modelserving): update template --- .gitignore | 23 +------------ README | 1 - README.md | 18 ++++++++++ __init__.py | 10 ++++++ config.toml | 32 +++++++++++++++++ lite.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ model.py | 36 ++++++++++++++++++++ requirements.txt | 2 ++ requires.sh | 7 ++++ requires.txt | 4 +++ 10 files changed, 199 insertions(+), 23 deletions(-) delete mode 100644 README create mode 100644 README.md create mode 100644 __init__.py create mode 100644 config.toml create mode 100644 lite.py create mode 100644 model.py create mode 100644 requirements.txt create mode 100644 requires.sh create mode 100755 requires.txt diff --git a/.gitignore b/.gitignore index b657038..ed8ebf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1 @@ -/gh-pages -__pycache__ -*.out -*.pyc -*.pid -*.sock -*~ -target/ -*.pyo -*.so -.eggs -.tox -dist -build -.pytest_cache -*.egg-info -setuptools_rust/version.py -pyo3 -docs/_build -*.dot -.clippy.toml -run_with_plugins_inner +__pycache__ \ No newline at end of file diff --git a/README b/README deleted file mode 100644 index 14d1d14..0000000 --- a/README +++ /dev/null @@ -1 +0,0 @@ -modelserving template diff --git a/README.md b/README.md new file mode 100644 index 0000000..853bbab --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# MegFlow Modelserving Template + +This doc is generated by `megflow-quickstart`. + +## How to run + +1. install requirements + +```bash +$ ./requires.sh +... +$ megflow-run -c ${APP}/config.toml -p ${APP} +... +``` + +2. open http://127.0.0.1:8080 in your web browser. + +3. click "try it out", choose an image, give an extra string (anything your want), POST diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..f57558f --- /dev/null +++ b/__init__.py @@ -0,0 +1,10 @@ +# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") +# +# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +#!/usr/bin/env python +# coding=utf-8 diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..89032d6 --- /dev/null +++ b/config.toml @@ -0,0 +1,32 @@ +main = "quickstart-modelserving" + +[[graphs]] +name = "subgraph" +inputs = [{ name = "inp", cap = 16, ports = ["model:inp"] }] +outputs = [{ name = "out", cap = 16, ports = ["model:out"] }] +connections = [ +] + + [[graphs.nodes]] + name = "model" + ty = "Model" + path = "##PATH##" + device = "cpu" + device_id = 0 + +[[graphs]] +name = "tutorial_01_image" +connections = [ + { cap = 16, ports = ["source:out", "destination:inp"] }, + { cap = 16, ports = ["source:inp", "destination:out"] } +] + + [[graphs.nodes]] + name = "source" + ty = "ImageServer" + port = 8080 + response = "json" + + [[graphs.nodes]] + name = "destination" + ty = "subgraph" diff --git a/lite.py b/lite.py new file mode 100644 index 0000000..20e8ce7 --- /dev/null +++ b/lite.py @@ -0,0 +1,89 @@ +# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") +# +# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +#!/usr/bin/env python +# coding=utf-8 + +import argparse +import time +import cv2 +import numpy as np +import megenginelite as mgelite +from loguru import logger + + +class PredictorLite: + def __init__( + self, + path, + device="gpu", + device_id=0, + ): + + if "gpu" in device.lower(): + device_type = mgelite.LiteDeviceType.LITE_CUDA + else: + device_type = mgelite.LiteDeviceType.LITE_CPU + + net_config = mgelite.LiteConfig(device_type=device_type) + ios = mgelite.LiteNetworkIO() + ios.add_input(mgelite.LiteIO("##INP##", is_host=True)) + + net = mgelite.LiteNetwork(config=net_config, io=ios) + net.device_id = device_id + net.load(path) + + inp_shape = net.get_io_tensor("##INP##").to_numpy().shape + self.HEIGHT = inp_shape[2] + self.WIDTH = inp_shape[3] + + self.net = net + + + def inference(self, img): + t0 = time.time() + + img = cv2.resize(img, (self.HEIGHT, self.WIDTH)) + # build input tensor + inp_data = self.net.get_io_tensor("##INP##") + inp_data.set_data_by_share(img) + + # forward + self.net.forward() + self.net.wait() + + # postprocess + output_keys = self.net.get_all_output_name() + output_dict = dict() + for key in output_keys: + value = self.net.get_io_tensor(key).to_numpy().tolist() + output_dict[key] = value + logger.debug("timecost: {:.4f}s".format(time.time() - t0)) + return json.dumps(output_dict) + + +def make_parser(): + parser = argparse.ArgumentParser("Single Model Demo!") + parser.add_argument("--path", + default="./test.png", + help="path to image") + parser.add_argument("--model", + default=None, + type=str, + help=".mge for eval") + return parser + + +if __name__ == "__main__": + args = make_parser().parse_args() + predictor = PredictorLite(args.model) + image = cv2.imread(args.path) + if image is None: + logger.error(f"open {args.path} failed") + out = predictor.inference(image) + logger.info(f'{out}') diff --git a/model.py b/model.py new file mode 100644 index 0000000..ab2abfe --- /dev/null +++ b/model.py @@ -0,0 +1,36 @@ +# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") +# +# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +#!/usr/bin/env python +# coding=utf-8 + +import json +import numpy as np +from loguru import logger +from megflow import register + +from .lite import PredictorLite + + +@register(inputs=['inp'], outputs=['out']) +class Classify: + def __init__(self, name, arg): + logger.info("loading model...") + self.name = name + self._model = PredictorLite(path=arg['path'], + device=arg['device'], + device_id=arg['device_id']) + + def exec(self): + envelope = self.inp.recv() + if envelope is None: + return + + data = envelope.msg['data'] + result = self._model.inference(data) + self.out.send(envelope.repack(result)) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b96544b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +opencv-python +numpy diff --git a/requires.sh b/requires.sh new file mode 100644 index 0000000..6f413d3 --- /dev/null +++ b/requires.sh @@ -0,0 +1,7 @@ +# upgrade pip +python3 -m pip install --upgrade pip +# install partial requirements with tuna mirror +python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requires.txt +# install megenginelite for inference +python3 -m pip install megengine -f https://megengine.org.cn/whl/mge.html + diff --git a/requires.txt b/requires.txt new file mode 100755 index 0000000..55babca --- /dev/null +++ b/requires.txt @@ -0,0 +1,4 @@ +numpy +scipy +opencv-python +loguru From 9540771bad004cd9f2519b54a29cc93488e67fa6 Mon Sep 17 00:00:00 2001 From: MegEngine Date: Sat, 6 Nov 2021 14:59:39 +0800 Subject: [PATCH 04/11] style(branch): format code with yapf pep8 --- lite.py | 9 ++------- model.py | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lite.py b/lite.py index 20e8ce7..069f33b 100644 --- a/lite.py +++ b/lite.py @@ -44,7 +44,6 @@ def __init__( self.net = net - def inference(self, img): t0 = time.time() @@ -69,9 +68,7 @@ def inference(self, img): def make_parser(): parser = argparse.ArgumentParser("Single Model Demo!") - parser.add_argument("--path", - default="./test.png", - help="path to image") + parser.add_argument("--path", default="./test.png", help="path to image") parser.add_argument("--model", default=None, type=str, @@ -83,7 +80,5 @@ def make_parser(): args = make_parser().parse_args() predictor = PredictorLite(args.model) image = cv2.imread(args.path) - if image is None: - logger.error(f"open {args.path} failed") out = predictor.inference(image) - logger.info(f'{out}') + print(out) diff --git a/model.py b/model.py index ab2abfe..005df88 100644 --- a/model.py +++ b/model.py @@ -26,7 +26,7 @@ def __init__(self, name, arg): device=arg['device'], device_id=arg['device_id']) - def exec(self): + def exec (self): envelope = self.inp.recv() if envelope is None: return From fc321a2690174b0445de5fd77601361b67e4b4e1 Mon Sep 17 00:00:00 2001 From: MegEngine Date: Mon, 8 Nov 2021 12:13:47 +0800 Subject: [PATCH 05/11] feat(template): add image pipeline template --- model.py => attr.py | 17 ++------- config.toml | 29 +++++++++------- det.py | 27 +++++++++++++++ lite.py | 84 --------------------------------------------- 4 files changed, 47 insertions(+), 110 deletions(-) rename model.py => attr.py (58%) create mode 100644 det.py delete mode 100644 lite.py diff --git a/model.py b/attr.py similarity index 58% rename from model.py rename to attr.py index 005df88..4b4bbaf 100644 --- a/model.py +++ b/attr.py @@ -9,28 +9,17 @@ #!/usr/bin/env python # coding=utf-8 -import json -import numpy as np -from loguru import logger from megflow import register -from .lite import PredictorLite - - @register(inputs=['inp'], outputs=['out']) -class Classify: +class Attribute: def __init__(self, name, arg): - logger.info("loading model...") self.name = name - self._model = PredictorLite(path=arg['path'], - device=arg['device'], - device_id=arg['device_id']) def exec (self): envelope = self.inp.recv() if envelope is None: return + print('attr') + self.out.send(envelope) - data = envelope.msg['data'] - result = self._model.inference(data) - self.out.send(envelope.repack(result)) diff --git a/config.toml b/config.toml index 89032d6..569db96 100644 --- a/config.toml +++ b/config.toml @@ -1,21 +1,27 @@ -main = "quickstart-modelserving" +main = "image" + +[[nodes]] +name = "det" +ty = "Detect" +device = "cpu" +device_id = 0 + +[[nodes]] +name = "attr" +ty = "Attribute" +device = "cpu" +device_id = 0 [[graphs]] name = "subgraph" -inputs = [{ name = "inp", cap = 16, ports = ["model:inp"] }] -outputs = [{ name = "out", cap = 16, ports = ["model:out"] }] +inputs = [{ name = "inp", cap = 16, ports = ["det:inp"] }] +outputs = [{ name = "out", cap = 16, ports = ["attr:out"] }] connections = [ + { cap = 16, ports = ["det:out", "attr:inp"] }, ] - [[graphs.nodes]] - name = "model" - ty = "Model" - path = "##PATH##" - device = "cpu" - device_id = 0 - [[graphs]] -name = "tutorial_01_image" +name = "image" connections = [ { cap = 16, ports = ["source:out", "destination:inp"] }, { cap = 16, ports = ["source:inp", "destination:out"] } @@ -25,7 +31,6 @@ connections = [ name = "source" ty = "ImageServer" port = 8080 - response = "json" [[graphs.nodes]] name = "destination" diff --git a/det.py b/det.py new file mode 100644 index 0000000..1f1272d --- /dev/null +++ b/det.py @@ -0,0 +1,27 @@ +# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") +# +# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +#!/usr/bin/env python +# coding=utf-8 + +from megflow import register + +@register(inputs=['inp'], outputs=['out']) +class Detect: + def __init__(self, name, arg): + print('init det') + self.name = name + + def exec (self): + envelope = self.inp.recv() + print('det') + if envelope is None: + return + print('det') + self.out.send(envelope) + diff --git a/lite.py b/lite.py deleted file mode 100644 index 069f33b..0000000 --- a/lite.py +++ /dev/null @@ -1,84 +0,0 @@ -# MegFlow is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2019-2021 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -#!/usr/bin/env python -# coding=utf-8 - -import argparse -import time -import cv2 -import numpy as np -import megenginelite as mgelite -from loguru import logger - - -class PredictorLite: - def __init__( - self, - path, - device="gpu", - device_id=0, - ): - - if "gpu" in device.lower(): - device_type = mgelite.LiteDeviceType.LITE_CUDA - else: - device_type = mgelite.LiteDeviceType.LITE_CPU - - net_config = mgelite.LiteConfig(device_type=device_type) - ios = mgelite.LiteNetworkIO() - ios.add_input(mgelite.LiteIO("##INP##", is_host=True)) - - net = mgelite.LiteNetwork(config=net_config, io=ios) - net.device_id = device_id - net.load(path) - - inp_shape = net.get_io_tensor("##INP##").to_numpy().shape - self.HEIGHT = inp_shape[2] - self.WIDTH = inp_shape[3] - - self.net = net - - def inference(self, img): - t0 = time.time() - - img = cv2.resize(img, (self.HEIGHT, self.WIDTH)) - # build input tensor - inp_data = self.net.get_io_tensor("##INP##") - inp_data.set_data_by_share(img) - - # forward - self.net.forward() - self.net.wait() - - # postprocess - output_keys = self.net.get_all_output_name() - output_dict = dict() - for key in output_keys: - value = self.net.get_io_tensor(key).to_numpy().tolist() - output_dict[key] = value - logger.debug("timecost: {:.4f}s".format(time.time() - t0)) - return json.dumps(output_dict) - - -def make_parser(): - parser = argparse.ArgumentParser("Single Model Demo!") - parser.add_argument("--path", default="./test.png", help="path to image") - parser.add_argument("--model", - default=None, - type=str, - help=".mge for eval") - return parser - - -if __name__ == "__main__": - args = make_parser().parse_args() - predictor = PredictorLite(args.model) - image = cv2.imread(args.path) - out = predictor.inference(image) - print(out) From 0e1b6c1d00db236622a79d1388c4e47064d10886 Mon Sep 17 00:00:00 2001 From: MegEngine Date: Mon, 8 Nov 2021 12:18:49 +0800 Subject: [PATCH 06/11] feat(template): fix run error --- attr.py | 7 +++++-- config.toml | 2 ++ det.py | 8 ++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/attr.py b/attr.py index 4b4bbaf..708ae3d 100644 --- a/attr.py +++ b/attr.py @@ -11,15 +11,18 @@ from megflow import register + @register(inputs=['inp'], outputs=['out']) class Attribute: def __init__(self, name, arg): self.name = name + print('Attribute init') def exec (self): envelope = self.inp.recv() if envelope is None: return - print('attr') - self.out.send(envelope) + print("Attribute") + self.out.send(envelope) + # self.out.send(envelope.repack("json string")) diff --git a/config.toml b/config.toml index 569db96..c76807f 100644 --- a/config.toml +++ b/config.toml @@ -31,6 +31,8 @@ connections = [ name = "source" ty = "ImageServer" port = 8080 + # uncomment this line to return json string + # response = "json" [[graphs.nodes]] name = "destination" diff --git a/det.py b/det.py index 1f1272d..feabc1f 100644 --- a/det.py +++ b/det.py @@ -11,17 +11,17 @@ from megflow import register + @register(inputs=['inp'], outputs=['out']) class Detect: def __init__(self, name, arg): - print('init det') self.name = name + print('Detect init') def exec (self): envelope = self.inp.recv() - print('det') if envelope is None: return - print('det') - self.out.send(envelope) + print('Detect') + self.out.send(envelope) From ac50cc6d4fa1ad7e913c6aeffb140212381baa6d Mon Sep 17 00:00:00 2001 From: MegEngine Date: Mon, 8 Nov 2021 17:25:17 +0800 Subject: [PATCH 07/11] fix(template): remove useless --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b96544b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -opencv-python -numpy From c6ad3fa28b95747c496208039fa2daff1f4c27fd Mon Sep 17 00:00:00 2001 From: tpoisonooo Date: Mon, 8 Nov 2021 19:01:45 +0800 Subject: [PATCH 08/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 853bbab..7b9e0c0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MegFlow Modelserving Template +# MegFlow Image Pipeline Template This doc is generated by `megflow-quickstart`. From 1cc507674d92dda3936402e4619259ffaa00f459 Mon Sep 17 00:00:00 2001 From: MegEngine Date: Tue, 21 Dec 2021 18:06:35 +0800 Subject: [PATCH 09/11] feat(project): add bytes server template --- attr.py | 4 ++-- config.toml | 4 +--- det.py | 2 ++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/attr.py b/attr.py index 708ae3d..780405e 100644 --- a/attr.py +++ b/attr.py @@ -24,5 +24,5 @@ def exec (self): return print("Attribute") - self.out.send(envelope) - # self.out.send(envelope.repack("json string")) + # self.out.send(envelope) + self.out.send(envelope.repack("json string")) diff --git a/config.toml b/config.toml index c76807f..cae8f23 100644 --- a/config.toml +++ b/config.toml @@ -29,10 +29,8 @@ connections = [ [[graphs.nodes]] name = "source" - ty = "ImageServer" + ty = "BytesServer" port = 8080 - # uncomment this line to return json string - # response = "json" [[graphs.nodes]] name = "destination" diff --git a/det.py b/det.py index feabc1f..cb5ab18 100644 --- a/det.py +++ b/det.py @@ -23,5 +23,7 @@ def exec (self): if envelope is None: return + data = envelope.msg['data'] + print(data) print('Detect') self.out.send(envelope) From f307c7e5e6521424e781e71db2cfb22225cb0ef6 Mon Sep 17 00:00:00 2001 From: tpoisonooo Date: Thu, 23 Dec 2021 16:40:05 +0800 Subject: [PATCH 10/11] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 7b9e0c0..6ba6819 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# MegFlow Image Pipeline Template - -This doc is generated by `megflow-quickstart`. +# MegFlow BytesServer Pipeline Template ## How to run From ac5beda087f40a9d6ffcbd5709196ea57d7fdb1f Mon Sep 17 00:00:00 2001 From: tpoisonooo Date: Mon, 27 Dec 2021 18:27:17 +0800 Subject: [PATCH 11/11] Update attr.py --- attr.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/attr.py b/attr.py index 780405e..510f9bf 100644 --- a/attr.py +++ b/attr.py @@ -24,5 +24,4 @@ def exec (self): return print("Attribute") - # self.out.send(envelope) - self.out.send(envelope.repack("json string")) + self.out.send(envelope)

    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