From 0e791a0060c18cfeab5f06ebd503c2a3572a24c0 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 16:22:18 +0100 Subject: [PATCH 001/254] Bump the node-notifier version. GitHub has detected that a package defined in the www/frontends/compiler_gym/package-lock.json file of the facebookresearch/CompilerGym repository contains a security vulnerability. Package name: node-notifier Affected versions: < 8.0.1 Fixed in version: 8.0.1 Severity: MODERATE --- www/frontends/compiler_gym/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/frontends/compiler_gym/package-lock.json b/www/frontends/compiler_gym/package-lock.json index 12534640e..239ffe822 100644 --- a/www/frontends/compiler_gym/package-lock.json +++ b/www/frontends/compiler_gym/package-lock.json @@ -7521,7 +7521,7 @@ "jest-snapshot": "^20.0.3", "jest-util": "^20.0.3", "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", + "node-notifier": "^8.01", "pify": "^2.3.0", "slash": "^1.0.0", "string-length": "^1.0.1", From 43973e53d4077ebe0d4d8443d8f28c271ad72aaa Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 19:38:07 +0100 Subject: [PATCH 002/254] [ci] Persist the bazel build cache. Issue #385. --- .github/workflows/ci.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4b6a4b556..d958e0c0d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,6 +14,15 @@ jobs: build-linux: runs-on: ubuntu-latest steps: + - name: Persist the bazel cache + uses: actions/cache@v2 + with: + path: ~/.cache/bazel/_bazel_runner + key: bazel-${{ runner.os }}-${{ hashFiles('WORKSPACE') }}-${{ hashFiles('**/BUILD') }} + restore-keys: | + bazel-${{ runner.os }}-${{ hashFiles('WORKSPACE') }}- + bazel-${{ runner.os }}- + - uses: actions/checkout@v2 - uses: actions/setup-python@v2 @@ -43,6 +52,15 @@ jobs: build-macos: runs-on: macos-latest steps: + - name: Persist the bazel cache + uses: actions/cache@v2 + with: + path: /private/var/tmp/_bazel_runner + key: bazel-${{ runner.os }}-${{ hashFiles('WORKSPACE') }}-${{ hashFiles('**/BUILD') }} + restore-keys: | + bazel-${{ runner.os }}-${{ hashFiles('WORKSPACE') }}- + bazel-${{ runner.os }}- + - uses: actions/checkout@v2 - uses: actions/setup-python@v2 From ba22bb74b033a97f2fd09b28b6338386d6b4a977 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 20:59:28 +0100 Subject: [PATCH 003/254] [llvm] Add a new Bitcode observation space. This adds a Bitcode observation space that returns the bitcode of an LLVM module directly as a byte array, without having to go via an intermediate file. Fixes #426. --- compiler_gym/envs/llvm/service/Observation.cc | 7 ++++ .../envs/llvm/service/ObservationSpaces.cc | 6 +++ .../envs/llvm/service/ObservationSpaces.h | 2 + tests/llvm/observation_spaces_test.py | 40 ++++++++++++++++++- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/compiler_gym/envs/llvm/service/Observation.cc b/compiler_gym/envs/llvm/service/Observation.cc index d2a8e86ae..7e3f7f363 100644 --- a/compiler_gym/envs/llvm/service/Observation.cc +++ b/compiler_gym/envs/llvm/service/Observation.cc @@ -59,6 +59,13 @@ Status setObservation(LlvmObservationSpace space, const fs::path& workingDirecto reply.set_string_value(ss.str()); break; } + case LlvmObservationSpace::BITCODE: { + std::string bitcode; + llvm::raw_string_ostream outbuffer(bitcode); + llvm::WriteBitcodeToFile(benchmark.module(), outbuffer); + reply.set_binary_value(outbuffer.str()); + break; + } case LlvmObservationSpace::BITCODE_FILE: { // Generate an output path with 16 bits of randomness. const auto outpath = fs::unique_path(workingDirectory / "module-%%%%%%%%.bc"); diff --git a/compiler_gym/envs/llvm/service/ObservationSpaces.cc b/compiler_gym/envs/llvm/service/ObservationSpaces.cc index 566a3b40e..b27c9ff49 100644 --- a/compiler_gym/envs/llvm/service/ObservationSpaces.cc +++ b/compiler_gym/envs/llvm/service/ObservationSpaces.cc @@ -46,6 +46,12 @@ std::vector getLlvmObservationSpaceList() { space.set_platform_dependent(false); break; } + case LlvmObservationSpace::BITCODE: { + space.mutable_binary_size_range()->mutable_min()->set_value(0); + space.set_deterministic(true); + space.set_platform_dependent(false); + break; + } case LlvmObservationSpace::BITCODE_FILE: { ScalarRange pathLength; space.mutable_string_size_range()->mutable_min()->set_value(0); diff --git a/compiler_gym/envs/llvm/service/ObservationSpaces.h b/compiler_gym/envs/llvm/service/ObservationSpaces.h index bb91bada6..fc4f659c5 100644 --- a/compiler_gym/envs/llvm/service/ObservationSpaces.h +++ b/compiler_gym/envs/llvm/service/ObservationSpaces.h @@ -30,6 +30,8 @@ enum class LlvmObservationSpace { IR, /** The 40-digit hex SHA1 checksum of the LLVM module. */ IR_SHA1, + /** Get the bitcode as a bytes array. */ + BITCODE, /** Write the bitcode to a file and return its path as a string. */ BITCODE_FILE, /** The counts of all instructions in a program. */ diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 4e7facf2f..640b4b6d2 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -41,6 +41,7 @@ def test_observation_spaces(env: LlvmEnv): assert set(env.observation.spaces.keys()) == { "Ir", "IrSha1", + "Bitcode", "BitcodeFile", "InstCount", "InstCountDict", @@ -105,12 +106,31 @@ def test_ir_sha1_observation_space(env: LlvmEnv): def test_bitcode_observation_space(env: LlvmEnv): + env.reset("cbench-v1/crc32") + key = "Bitcode" + space = env.observation.spaces[key] + assert isinstance(space.space, Sequence) + assert space.space.dtype == bytes + assert space.space.size_range == (0, None) + + assert space.deterministic + assert not space.platform_dependent + + value: str = env.observation[key] + print(value) # For debugging in case of error. + assert isinstance(value, bytes) + assert space.space.contains(value) + + +def test_bitcode_file_observation_space(env: LlvmEnv): env.reset("cbench-v1/crc32") key = "BitcodeFile" space = env.observation.spaces[key] assert isinstance(space.space, Sequence) assert space.space.dtype == str assert space.space.size_range == (0, 4096) + assert not space.deterministic + assert not space.platform_dependent value: str = env.observation[key] print(value) # For debugging in case of error. @@ -121,8 +141,24 @@ def test_bitcode_observation_space(env: LlvmEnv): finally: os.unlink(value) - assert not space.deterministic - assert not space.platform_dependent + +@pytest.mark.parametrize( + "benchmark_uri", ["cbench-v1/crc32", "cbench-v1/qsort", "cbench-v1/gsm"] +) +def test_bitcode_file_equivalence(env: LlvmEnv, benchmark_uri: str): + """Test that LLVM produces the same bitcode as a file and as a byte array.""" + env.reset(benchmark=benchmark_uri) + + bitcode = env.observation.Bitcode() + bitcode_file = env.observation.BitcodeFile() + + try: + with open(bitcode_file, "rb") as f: + bitcode_from_file = f.read() + + assert bitcode == bitcode_from_file + finally: + os.unlink(bitcode_file) # The Autophase feature vector for benchmark://cbench-v1/crc32 in its initial From e7cfce8a7ac66056ca14d6dd2d0b928859068ac8 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 21:01:24 +0100 Subject: [PATCH 004/254] [spaces] Fix and document an inconsistency in Sequence type checking. --- compiler_gym/spaces/sequence.py | 13 +++++++++++-- tests/spaces/sequence_test.py | 7 +++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/compiler_gym/spaces/sequence.py b/compiler_gym/spaces/sequence.py index b1881baef..b60fcfeda 100644 --- a/compiler_gym/spaces/sequence.py +++ b/compiler_gym/spaces/sequence.py @@ -79,9 +79,18 @@ def contains(self, x): upper_bound = float("inf") if self.size_range[1] is None else self.size_range[1] if not (lower_bound <= len(x) <= upper_bound): return False - for element in x: - if not isinstance(element, self.dtype): + + # TODO(cummins): The dtype API is inconsistent. When dtype=str or + # dtype=bytes, we expect this to be the type of the entire sequence. But + # for dtype=int, we expect this to be the type of each element. We + # should distinguish these differences better. + if self.dtype in {str, bytes}: + if not isinstance(x, self.dtype): return False + else: + for element in x: + if not isinstance(element, self.dtype): + return False # Run the bounds check on every scalar element, if there is a scalar # range specified. diff --git a/tests/spaces/sequence_test.py b/tests/spaces/sequence_test.py index d0f8dd85a..1a5818242 100644 --- a/tests/spaces/sequence_test.py +++ b/tests/spaces/sequence_test.py @@ -54,5 +54,12 @@ def test_contains_with_float_scalar_range(): assert not space.contains([0.0, 0]) # wrong shape +def test_bytes_contains(): + space = Sequence(size_range=(0, None), dtype=bytes) + assert space.contains(b"Hello, world!") + assert space.contains(b"") + assert not space.contains("Hello, world!") + + if __name__ == "__main__": main() From b2dc549acd48df0a54e6437014239b66cdfbd9c2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 21:02:16 +0100 Subject: [PATCH 005/254] [llvm] Tiny refactor for readability. --- .../envs/llvm/service/ObservationSpaces.cc | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/compiler_gym/envs/llvm/service/ObservationSpaces.cc b/compiler_gym/envs/llvm/service/ObservationSpaces.cc index b27c9ff49..110dcbae0 100644 --- a/compiler_gym/envs/llvm/service/ObservationSpaces.cc +++ b/compiler_gym/envs/llvm/service/ObservationSpaces.cc @@ -32,14 +32,12 @@ std::vector getLlvmObservationSpaceList() { space.set_name(util::enumNameToPascalCase(value)); switch (value) { case LlvmObservationSpace::IR: { - ScalarRange irSize; space.mutable_string_size_range()->mutable_min()->set_value(0); space.set_deterministic(true); space.set_platform_dependent(false); break; } case LlvmObservationSpace::IR_SHA1: { - ScalarRange sha1Size; space.mutable_string_size_range()->mutable_min()->set_value(40); space.mutable_string_size_range()->mutable_max()->set_value(40); space.set_deterministic(true); @@ -53,7 +51,6 @@ std::vector getLlvmObservationSpaceList() { break; } case LlvmObservationSpace::BITCODE_FILE: { - ScalarRange pathLength; space.mutable_string_size_range()->mutable_min()->set_value(0); // 4096 is the maximum path length for most filesystems. space.mutable_string_size_range()->mutable_max()->set_value(kMaximumPathLength); @@ -95,10 +92,8 @@ std::vector getLlvmObservationSpaceList() { } case LlvmObservationSpace::PROGRAML: { // ProGraML serializes the graph to JSON. - ScalarRange encodedSize; - encodedSize.mutable_min()->set_value(0); space.set_opaque_data_format("json://networkx/MultiDiGraph"); - *space.mutable_string_size_range() = encodedSize; + space.mutable_string_size_range()->mutable_min()->set_value(0); space.set_deterministic(true); space.set_platform_dependent(false); programl::ProgramGraph graph; @@ -110,10 +105,8 @@ std::vector getLlvmObservationSpaceList() { } case LlvmObservationSpace::PROGRAML_JSON: { // ProGraML serializes the graph to JSON. - ScalarRange encodedSize; - encodedSize.mutable_min()->set_value(0); space.set_opaque_data_format("json://"); - *space.mutable_string_size_range() = encodedSize; + space.mutable_string_size_range()->mutable_min()->set_value(0); space.set_deterministic(true); space.set_platform_dependent(false); programl::ProgramGraph graph; @@ -125,10 +118,8 @@ std::vector getLlvmObservationSpaceList() { } case LlvmObservationSpace::CPU_INFO: { // Hardware info is returned as a JSON - ScalarRange encodedSize; - encodedSize.mutable_min()->set_value(0); space.set_opaque_data_format("json://"); - *space.mutable_string_size_range() = encodedSize; + space.mutable_string_size_range()->mutable_min()->set_value(0); space.set_deterministic(true); space.set_platform_dependent(true); *space.mutable_default_value()->mutable_string_value() = "{}"; From d85eabf87fdd5e6daf8f24ee55bd57e1e93d8141 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 21:04:50 +0100 Subject: [PATCH 006/254] [ci] Don't fail CI jobs if code coverage upload fails. --- .github/workflows/ci.yaml | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4b6a4b556..d03ec2375 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -101,9 +101,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-macos: needs: build-macos runs-on: macos-latest @@ -138,9 +135,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-llvm-env-linux: needs: build-linux runs-on: ubuntu-latest @@ -175,9 +169,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-llvm-env-macos: needs: build-macos runs-on: macos-latest @@ -212,9 +203,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-gcc-env-linux: needs: build-linux runs-on: ubuntu-latest @@ -249,9 +237,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-gcc-env-linux-no-docker: needs: build-linux runs-on: ubuntu-latest @@ -288,9 +273,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-gcc-env-macos: needs: build-macos @@ -327,9 +309,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-gcc-env-macos-no-docker: needs: build-macos @@ -361,9 +340,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-loop_tool-env-linux: needs: build-linux @@ -395,9 +371,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-loop_tool-env-macos: needs: build-macos @@ -434,9 +407,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-examples-linux: needs: build-linux @@ -472,9 +442,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true test-examples-macos: needs: build-macos @@ -510,9 +477,6 @@ jobs: - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: true - verbose: true build-asan-llvm-service: runs-on: ubuntu-latest From a67d0bf80f71b72ef641444fa717eda9ae9c5ae4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 19:39:12 +0100 Subject: [PATCH 007/254] [README] Improve code sample. Make sure to close the environment in the README sample, and use compiler_gym.make() to remove the need to import the gym module. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f9d6684c..4bd12d056 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,8 @@ an overview of the key concepts. In Python, import `compiler_gym` to use the environments: ```py ->>> import gym >>> import compiler_gym # imports the CompilerGym environments ->>> env = gym.make( # creates a new environment +>>> env = compiler_gym.make( # creates a new environment (same as gym.make) ... "llvm-v0", # selects the compiler to use ... benchmark="cbench-v1/qsort", # selects the program to compile ... observation_space="Autophase", # selects the observation space @@ -95,6 +94,7 @@ In Python, import `compiler_gym` to use the environments: >>> env.reset() # starts a new compilation session >>> env.render() # prints the IR of the program >>> env.step(env.action_space.sample()) # applies a random optimization, updates state/reward/actions +>>> env.close() # closes the environment, freeing resources ``` See the [documentation website](http://facebookresearch.github.io/CompilerGym/) From 0d9e1d358bbff8fa675ad0de30d0fee11b190b06 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 12:35:51 +0000 Subject: [PATCH 008/254] [util] Increase persistence on "Too many Requests" errors. --- compiler_gym/util/download.py | 4 ++-- tests/util/download_test.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler_gym/util/download.py b/compiler_gym/util/download.py index d38ba001e..2171e525b 100644 --- a/compiler_gym/util/download.py +++ b/compiler_gym/util/download.py @@ -78,7 +78,7 @@ def _download(urls: List[str], sha256: Optional[str], max_retries: int) -> bytes # A retry loop, and loop over all urls provided. last_exception = None - wait_time = 5 + wait_time = 10 for _ in range(max(max_retries, 1)): for url in urls: try: @@ -99,7 +99,7 @@ def _download(urls: List[str], sha256: Optional[str], max_retries: int) -> bytes def download( - urls: Union[str, List[str]], sha256: Optional[str] = None, max_retries: int = 3 + urls: Union[str, List[str]], sha256: Optional[str] = None, max_retries: int = 5 ) -> bytes: """Download a file and return its contents. diff --git a/tests/util/download_test.py b/tests/util/download_test.py index d94622dcc..b94aa297a 100644 --- a/tests/util/download_test.py +++ b/tests/util/download_test.py @@ -26,7 +26,8 @@ def patched_download(*args): assert download._do_download_attempt.call_count == max_retries assert download.sleep.call_count == max_retries - download.sleep.assert_called_with(5 * 1.5 ** (max_retries - 1)) + starting_wait_time = 10 # The initial wait time in seconds. + download.sleep.assert_called_with(starting_wait_time * 1.5 ** (max_retries - 1)) @pytest.mark.parametrize("max_retries", [1, 2, 3, 5, 10]) From 54afff69789f4c27b2cdecc26f8d144827335792 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 00:46:20 +0100 Subject: [PATCH 009/254] [util] Fix missing build dependency. --- compiler_gym/util/BUILD | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler_gym/util/BUILD b/compiler_gym/util/BUILD index b8bbc384a..a0a83b572 100644 --- a/compiler_gym/util/BUILD +++ b/compiler_gym/util/BUILD @@ -92,6 +92,9 @@ cc_library( name = "Unreachable", hdrs = ["Unreachable.h"], visibility = ["//visibility:public"], + deps = [ + "@glog", + ], ) genrule( From a2d18ad1384bfb1b11be4dcdaa580d47f889485e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 00:48:27 +0100 Subject: [PATCH 010/254] [proto] Make actions composable. This expands the Action protocol buffer from a scalar integer value to a list of Choice objects, where each choice is either a scalar integer, double, or an enum. This enables multi-dimensional action spaces. Issue #52. --- compiler_gym/service/proto/__init__.py | 6 ++ .../service/proto/compiler_gym_service.proto | 59 +++++++++++++++---- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/compiler_gym/service/proto/__init__.py b/compiler_gym/service/proto/__init__.py index ef177e963..5a7bf1597 100644 --- a/compiler_gym/service/proto/__init__.py +++ b/compiler_gym/service/proto/__init__.py @@ -9,6 +9,8 @@ AddBenchmarkRequest, Benchmark, BenchmarkDynamicConfig, + Choice, + ChoiceSpace, Command, DoubleList, EndSessionReply, @@ -21,6 +23,7 @@ GetVersionReply, GetVersionRequest, Int64List, + NamedDiscreteSpace, Observation, ObservationSpace, ScalarLimit, @@ -46,6 +49,8 @@ "AddBenchmarkRequest", "Benchmark", "BenchmarkDynamicConfig", + "Choice", + "ChoiceSpace", "Command", "CompilerGymServiceConnection", "CompilerGymServiceServicer", @@ -62,6 +67,7 @@ "GetVersionReply", "GetVersionRequest", "Int64List", + "NamedDiscreteSpace", "Observation", "ObservationSpace", "ScalarLimit", diff --git a/compiler_gym/service/proto/compiler_gym_service.proto b/compiler_gym/service/proto/compiler_gym_service.proto index 0cd5abcfe..0e653f7fc 100644 --- a/compiler_gym/service/proto/compiler_gym_service.proto +++ b/compiler_gym/service/proto/compiler_gym_service.proto @@ -122,24 +122,58 @@ message StepReply { repeated Observation observation = 4; } -// A description of an action space. -// -// \warning This message format is likely to change. This currently only -// supports flat action spaces of categorical values. In the future we will -// want to replace this with a more extensible representation that supports -// parameterized actions, and actions of different types (e.g. optimization -// passes vs optimization contexts). +// A description of an action space. An action space consists of one or more +// choices that can be made by an agent in a call to Step(). An action space +// with a single choice is scalar; an action-space with `n` choices represents +// an `n`-dimensional action space. message ActionSpace { // The name of the action space. string name = 1; - // A list of discrete action names. - repeated string action = 2; + // The list of choices that comprise this action. + repeated ChoiceSpace choice = 2; + // An optional list of names for the choices. + bool named_choices = 3; } // An action. message Action { - // An index into the ActionSpace.action list. - int32 action = 1; + // A list of choices that corresponds to the ActionSpace's choice list. + repeated Choice choice = 1; +} + +// The space for a single choice. An Action comprises one or more choices. +message ChoiceSpace { + // An optional name for this choice. Only required if + // ActionSpace.named_choices is set. + string name = 1; + // The choice space. + oneof space { + // A bounded integer choice. + ScalarRange int64_range = 2; + // A possibly bounded real-valued choice. + ScalarRange double_range = 3; + // A discrete space in which every point in the space is named. + NamedDiscreteSpace named_discrete_space = 4; + } +} + +// A single choice. An Action comprises one or more Choices. +message Choice { + // The value of the choice, corresponding to the ChoiceSpace from the + // ActionSpace.choice list. + oneof value { + int64 int64_value = 1; + double double_value = 2; + int64 named_discrete_value_index = 3; + } +} + +// A discrete space in which every point in the space is named. This can be used +// for representing enumerations. +message NamedDiscreteSpace { + // A list of names for every value in the space. The order in which these + // values are returned is used. + repeated string value = 1; } // An observations from a compiler. @@ -256,8 +290,7 @@ message GetSpacesRequest {} // A GetSpaces() reply. message GetSpacesReply { - // The initial space of actions. Subsequent calls to step() may produce - // a new action space. + // A list of one or more action spaces that the service supports. repeated ActionSpace action_space_list = 1; // A list of available observation spaces. A service may support one or more // observation spaces. From a662f6ff3dc68187a73ba6c02a0fdfda5d839574 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 01:03:02 +0100 Subject: [PATCH 011/254] [proto] Add an is_commandline flag for NamedDiscreteSpace. Issue #52. --- compiler_gym/envs/llvm/service/ActionSpace.cc | 6 +++++- compiler_gym/service/proto/compiler_gym_service.proto | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler_gym/envs/llvm/service/ActionSpace.cc b/compiler_gym/envs/llvm/service/ActionSpace.cc index 80769065e..d2f8699d3 100644 --- a/compiler_gym/envs/llvm/service/ActionSpace.cc +++ b/compiler_gym/envs/llvm/service/ActionSpace.cc @@ -21,7 +21,11 @@ std::vector getLlvmActionSpaceList() { for (const auto& value : magic_enum::enum_values()) { space.add_action(util::enumNameToPascalCase(value)); } - break; + flagChoice->mutable_named_discrete_space()->set_is_commandline(true); + } break; + default: + UNREACHABLE(fmt::format("Unknown LLVM action space {}", + util::enumNameToPascalCase(value))); } spaces.push_back(space); diff --git a/compiler_gym/service/proto/compiler_gym_service.proto b/compiler_gym/service/proto/compiler_gym_service.proto index 0e653f7fc..0129a0f8d 100644 --- a/compiler_gym/service/proto/compiler_gym_service.proto +++ b/compiler_gym/service/proto/compiler_gym_service.proto @@ -174,6 +174,9 @@ message NamedDiscreteSpace { // A list of names for every value in the space. The order in which these // values are returned is used. repeated string value = 1; + // If true, the set of space can be interpreted as a list of command line + // flags. + bool is_commandline = 2; } // An observations from a compiler. From 3ceff4c299715ec4a44d41280193b1ceb5598bf4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 01:47:30 +0100 Subject: [PATCH 012/254] [proto] Add python converters for the new action space. This adds a new module for converting from the ActionSpace protocol buffers to gym.Space objects. This also handles creating a callback that performs the conversion from python `action` type to an Action protocol buffer. Issue #52. --- compiler_gym/service/proto/BUILD | 8 +- compiler_gym/service/proto/__init__.py | 2 + compiler_gym/service/proto/py_converters.py | 125 ++++++++++++++++++++ compiler_gym/spaces/BUILD | 3 + 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 compiler_gym/service/proto/py_converters.py diff --git a/compiler_gym/service/proto/BUILD b/compiler_gym/service/proto/BUILD index 7c6d1b253..a2402cb76 100644 --- a/compiler_gym/service/proto/BUILD +++ b/compiler_gym/service/proto/BUILD @@ -10,11 +10,17 @@ load("@rules_python//python:defs.bzl", "py_library") py_library( name = "proto", - srcs = ["__init__.py"], + srcs = [ + "__init__.py", + "py_converters.py", + ], visibility = ["//visibility:public"], deps = [ ":compiler_gym_service_py", ":compiler_gym_service_py_grpc", + "//compiler_gym/spaces:commandline", + "//compiler_gym/spaces:named_discrete", + "//compiler_gym/spaces:scalar", ], ) diff --git a/compiler_gym/service/proto/__init__.py b/compiler_gym/service/proto/__init__.py index 5a7bf1597..5d8acf2d7 100644 --- a/compiler_gym/service/proto/__init__.py +++ b/compiler_gym/service/proto/__init__.py @@ -41,8 +41,10 @@ CompilerGymServiceServicer, CompilerGymServiceStub, ) +from compiler_gym.service.proto.py_converters import action_space_from_proto __all__ = [ + "action_space_from_proto", "Action", "ActionSpace", "AddBenchmarkReply", diff --git a/compiler_gym/service/proto/py_converters.py b/compiler_gym/service/proto/py_converters.py new file mode 100644 index 000000000..86990de9d --- /dev/null +++ b/compiler_gym/service/proto/py_converters.py @@ -0,0 +1,125 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Any, Callable, List, NamedTuple + +import gym +from gym.spaces import Dict, Discrete, Tuple + +from compiler_gym.service.proto.compiler_gym_service_pb2 import ( + Action, + ActionSpace, + Choice, + ChoiceSpace, +) +from compiler_gym.spaces.commandline import Commandline, CommandlineFlag +from compiler_gym.spaces.named_discrete import NamedDiscrete +from compiler_gym.spaces.scalar import Scalar + + +class PyChoiceSpace(NamedTuple): + """An choice space with a callback to construction Choice messages.""" + + space: gym.Space + make_choice: Callable[[Any], Choice] + + +class PyActionSpace(NamedTuple): + """An action space with a callback to construction Action messages.""" + + space: gym.Space + make_action: Callable[[Any], Action] + + +def compose_choices(choices: List[PyChoiceSpace]) -> Callable[[Any], Action]: + """Compose a list of choice spaces into a single make_action() callback.""" + + def _compose_choices(action: Any) -> Action: + return Action( + choice=[choice.make_choice(a) for a, choice in zip(action, choices)] + ) + + return _compose_choices + + +def action_space_from_proto(proto: ActionSpace) -> PyActionSpace: + """Construct an ActionSpace from protocol buffer.""" + + def make_space_from_choice(choice: ChoiceSpace) -> PyChoiceSpace: + choice_type = choice.WhichOneof("space") + if choice_type == "int64_range": + if choice.int64_range.min.value: + return PyChoiceSpace( + space=Scalar( + min=choice.int64_range.min.value, + max=choice.int64_range.max.value, + dtype=int, + ), + make_choice=lambda a: Choice(int64_value=a), + ) + else: + return PyChoiceSpace( + space=Discrete(n=choice.int64_range.max.value), + make_choice=lambda a: Choice(named_discrete_value_index=a), + ) + elif choice_type == "double_range": + return PyChoiceSpace( + space=Scalar( + min=choice.int64_range.min.value, + max=choice.int64_range.max.value, + dtype=float, + ), + make_choice=lambda a: Choice(double_value=a), + ) + elif ( + choice_type == "named_discrete_space" + and choice.named_discrete_space.is_commandline + ): + return PyChoiceSpace( + space=Commandline( + # TODO: Decide whether commandline makes sense ... + items=[ + CommandlineFlag(name=x, flag=x, description="") + for x in choice.named_discrete_space.value + ], + name=choice.name, + ), + make_choice=lambda a: Choice(named_discrete_value_index=a), + ) + elif choice_type == "named_discrete_space": + return PyChoiceSpace( + space=NamedDiscrete( + items=choice.named_discrete_space.value, name=choice.name + ), + make_choice=lambda a: Choice(named_discrete_value_index=a), + ) + raise ValueError(f"Unknown space for ChoiceSpace: {choice}") + + if len(proto.choice) > 1 and proto.named_choices: + choices = [make_space_from_choice(choice) for choice in proto.choice] + return PyActionSpace( + space=Dict( + spaces={ + choice.name: space.space + for choice, space in zip(proto.choice, choices) + } + ), + make_action=compose_choices(choices), + ) + + elif len(proto.choice) > 1: + choices = [make_space_from_choice(choice) for choice in proto.choice] + + return PyActionSpace( + space=Tuple(spaces=[choice.space for choice in choices]), + make_action=compose_choices(choices), + ) + elif proto.choice: + space, make_choice = make_space_from_choice(proto.choice[0]) + # When there is only a single choice, use the name of the parent space. + space.name = proto.name + return PyActionSpace( + space=space, make_action=lambda a: Action(choice=[make_choice(a)]) + ) + raise ValueError("No choices set for ActionSpace") diff --git a/compiler_gym/spaces/BUILD b/compiler_gym/spaces/BUILD index 22083fc13..cc13e0f8d 100644 --- a/compiler_gym/spaces/BUILD +++ b/compiler_gym/spaces/BUILD @@ -22,6 +22,7 @@ py_library( py_library( name = "commandline", srcs = ["commandline.py"], + visibility = ["//compiler_gym:__subpackages__"], deps = [ ":named_discrete", ], @@ -30,6 +31,7 @@ py_library( py_library( name = "named_discrete", srcs = ["named_discrete.py"], + visibility = ["//compiler_gym:__subpackages__"], ) py_library( @@ -45,6 +47,7 @@ py_library( py_library( name = "scalar", srcs = ["scalar.py"], + visibility = ["//compiler_gym:__subpackages__"], ) py_library( From a57260fd9980b6c8a7648bbc4c54b95518961ee6 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 7 Sep 2021 12:15:48 +0100 Subject: [PATCH 013/254] Update CompilerEnv to use the new action spaces. --- compiler_gym/envs/compiler_env.py | 36 ++++++++++++++----------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/compiler_gym/envs/compiler_env.py b/compiler_gym/envs/compiler_env.py index 520b4f61b..f3dfaed28 100644 --- a/compiler_gym/envs/compiler_env.py +++ b/compiler_gym/envs/compiler_env.py @@ -31,6 +31,7 @@ from compiler_gym.service.proto import Action, AddBenchmarkRequest from compiler_gym.service.proto import Benchmark as BenchmarkProto from compiler_gym.service.proto import ( + Choice, EndSessionReply, EndSessionRequest, ForkSessionReply, @@ -43,6 +44,7 @@ StartSessionRequest, StepReply, StepRequest, + action_space_from_proto, ) from compiler_gym.spaces import DefaultRewardFromObservation, NamedDiscrete, Reward from compiler_gym.util.debug_util import get_logging_level @@ -285,10 +287,12 @@ def __init__( pass # Process the available action, observation, and reward spaces. - self.action_spaces = [ - self._make_action_space(space.name, space.action) - for space in self.service.action_spaces + action_spaces = [ + action_space_from_proto(space) for space in self.service.action_spaces ] + self.action_spaces = [a.space for a in action_spaces] + self._make_actions = [a.make_action for a in action_spaces] + self.observation = self._observation_view_type( raw_step=self.raw_step, spaces=self.service.observation_spaces, @@ -299,6 +303,7 @@ def __init__( self._versions: Optional[GetVersionReply] = None self.action_space: Optional[Space] = None + self._make_action: Optional[Callable[[Any], Action]] = None self.observation_space: Optional[Space] = None # Mutable state initialized in reset(). @@ -413,6 +418,7 @@ def action_space(self, action_space: Optional[str]): else 0 ) self._action_space: NamedDiscrete = self.action_spaces[index] + self._make_actions: Callable[[Any], Action] = self._make_actions[index] @property def benchmark(self) -> Benchmark: @@ -829,8 +835,8 @@ def _call_with_error( # If the action space has changed, update it. if reply.HasField("new_action_space"): - self.action_space = self._make_action_space( - self.action_space.name, reply.new_action_space.action + self.action_space, self._make_action = action_space_from_proto( + reply.new_action_space ) self.reward.reset(benchmark=self.benchmark, observation_view=self.observation) @@ -903,7 +909,9 @@ def raw_step( # Send the request to the backend service. request = StepRequest( session_id=self._session_id, - action=[Action(action=a) for a in actions], + action=[ + Action(choice=[Choice(named_discrete_value_index=a)]) for a in actions + ], observation_space=[ observation_space.index for observation_space in observations_to_compute ], @@ -947,8 +955,8 @@ def raw_step( # If the action space has changed, update it. if reply.HasField("new_action_space"): - self.action_space = self._make_action_space( - self.action_space.name, reply.action_space.action + self.action_space, self._make_action = action_space_from_proto( + reply.action_space ) # Translate observations to python representations. @@ -1110,18 +1118,6 @@ def benchmarks(self) -> Iterable[str]: """Enumerate a (possible unbounded) list of available benchmarks.""" return self.datasets.benchmark_uris() - def _make_action_space(self, name: str, entries: List[str]) -> Space: - """Create an action space from the given values. - - Subclasses may override this method to produce specialized action - spaces. - - :param name: The name of the action space. - :param entries: The entries in the action space. - :return: A :code:`gym.Space` instance. - """ - return NamedDiscrete(entries, name) - @property def _observation_view_type(self): """Returns the type for observation views. From c5de2a8cd1360a88346095daa6a1d0fed6938d74 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 7 Sep 2021 12:56:47 +0100 Subject: [PATCH 014/254] [util] Add a new Enum -> command line flag converter. --- compiler_gym/util/EnumUtil.h | 22 ++++++++++++++++++++++ tests/util/EnumUtilTest.cc | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/compiler_gym/util/EnumUtil.h b/compiler_gym/util/EnumUtil.h index 08b201506..33effd73e 100644 --- a/compiler_gym/util/EnumUtil.h +++ b/compiler_gym/util/EnumUtil.h @@ -57,6 +57,28 @@ std::string enumNameToPascalCase(std::optional value) { return enumNameToPascalCase(value.value()); } +/** + * Convert an UPPER_SNAKE_CASE enum name to -flag-name. + * + * E.g. `MyEnum::MY_ENUM_VALUE -> "-my-enum-value"`. + * + * @param value An enum. + * @return A string. + */ +template +std::string enumNameToCommandlineFlag(Enum value) { + const std::string name(magic_enum::enum_name(value)); + std::string out{"-"}; + for (size_t i = 0; i < name.size(); ++i) { + if (name[i] == '_') { + out.push_back('-'); + } else { + out.push_back(tolower(name[i])); + } + } + return out; +} + /** * Enumerate all values of an optional Enum, including `std::nullopt`. * diff --git a/tests/util/EnumUtilTest.cc b/tests/util/EnumUtilTest.cc index 81534e749..b81084db8 100644 --- a/tests/util/EnumUtilTest.cc +++ b/tests/util/EnumUtilTest.cc @@ -29,6 +29,12 @@ TEST(EnumUtilTest, optionalEnumNameToPascalCase) { EXPECT_EQ(enumNameToPascalCase(std::nullopt), "None"); } +TEST(EnumUtilTest, enumNameToCommandlineFlag) { + EXPECT_EQ(enumNameToCommandlineFlag(Fruit::APPLES), "-apples"); + EXPECT_EQ(enumNameToCommandlineFlag(Fruit::UNRIPE_bAnAnAs), "-unripe-bananas"); + EXPECT_EQ(enumNameToCommandlineFlag(Fruit::is_tomato_even_a_fruit), "-is-tomato-even-a-fruit"); +} + TEST(EnumUtilTest, optionalEnumValues) { const auto values = optionalEnumValues(); ASSERT_EQ(values.size(), 4); From 987a2676d9c78e7e3a64b85f6ced94dcd56cca9f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 7 Sep 2021 12:56:30 +0100 Subject: [PATCH 015/254] [examples] Update example codes to new action space. --- examples/RandomSearch.cc | 2 +- .../example_compiler_gym_service/env_tests.py | 16 ++++++-- .../service_cc/ExampleService.cc | 31 +++++++++++--- .../service_py/example_service.py | 40 ++++++++++++++----- 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/examples/RandomSearch.cc b/examples/RandomSearch.cc index 2ce5cda86..c1129f868 100644 --- a/examples/RandomSearch.cc +++ b/examples/RandomSearch.cc @@ -89,7 +89,7 @@ class Environment { StepReply reply; request.set_session_id(sessionId_); - request.add_action()->set_action(static_cast(action)); + request.add_action()->add_choice()->set_named_discrete_value_index(static_cast(action)); request.add_observation_space(static_cast(observationSpace)); RETURN_IF_ERROR(service_.Step(nullptr, &request, &reply)); CHECK(reply.observation_size() == 1); diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index ed792ba28..1e6ae7db4 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -12,7 +12,6 @@ import pytest from gym.spaces import Box -import compiler_gym import examples.example_compiler_gym_service as example from compiler_gym.envs import CompilerEnv from compiler_gym.service import SessionNotFound @@ -74,7 +73,6 @@ def run(cmd): def test_versions(env: CompilerEnv): """Tests the GetVersion() RPC endpoint.""" - assert env.version == compiler_gym.__version__ assert env.compiler_version == "1.0.0" @@ -150,9 +148,19 @@ def test_double_reset(env: CompilerEnv): """Test that reset() can be called twice.""" env.reset() assert env.in_episode - env.step(env.action_space.sample()) env.reset() - env.step(env.action_space.sample()) + assert env.in_episode + + +def test_double_reset_with_step(env: CompilerEnv): + """Test that reset() can be called twice with a step.""" + env.reset() + assert env.in_episode + _, _, done, info = env.step(env.action_space.sample()) + assert not done, info + env.reset() + _, _, done, info = env.step(env.action_space.sample()) + assert not done, info assert env.in_episode diff --git a/examples/example_compiler_gym_service/service_cc/ExampleService.cc b/examples/example_compiler_gym_service/service_cc/ExampleService.cc index 799bcee87..0e85a922c 100644 --- a/examples/example_compiler_gym_service/service_cc/ExampleService.cc +++ b/examples/example_compiler_gym_service/service_cc/ExampleService.cc @@ -33,11 +33,20 @@ class ExampleCompilationSession final : public CompilationSession { std::string getCompilerVersion() const final override { return "1.0.0"; } std::vector getActionSpaces() const final override { + // The acction spaces supported by this service. Here we will implement a + // single action space, called "default", that represents a command line + // with three options: "a", "b", and "c". ActionSpace space; space.set_name("default"); - space.add_action("a"); - space.add_action("b"); - space.add_action("c"); + + ChoiceSpace* choice = space.add_choice(); + choice->set_name("optimization_choice"); + + NamedDiscreteSpace* namedDiscreteChoice = choice->mutable_named_discrete_space(); + + namedDiscreteChoice->add_value("a"); + namedDiscreteChoice->add_value("b"); + namedDiscreteChoice->add_value("c"); return {space}; } @@ -84,12 +93,24 @@ class ExampleCompilationSession final : public CompilationSession { [[nodiscard]] grpc::Status applyAction(const Action& action, bool& endOfEpisode, std::optional& newActionSpace, bool& actionHadNoEffect) final override { - LOG(INFO) << "Applying action " << action.action(); + const int numChoices = getActionSpaces()[0].choice(0).named_discrete_space().value_size(); - if (action.action() < 0 || action.action() > getActionSpaces()[0].action_size()) { + if (action.choice_size() != 1) { + return Status(StatusCode::INVALID_ARGUMENT, "Missing choice"); + } + + // This is the index into the action space's values ("a", "b", "c") that the + // user selected, e.g. 0 -> "a", 1 -> "b", 2 -> "c". + const int choiceIndex = action.choice(0).named_discrete_value_index(); + LOG(INFO) << "Applying action " << choiceIndex; + + if (choiceIndex < 0 || choiceIndex >= numChoices) { return Status(StatusCode::INVALID_ARGUMENT, "Out-of-range"); } + // Here is where we would run the actual action to update the environment's + // state. + return Status::OK; } diff --git a/examples/example_compiler_gym_service/service_py/example_service.py b/examples/example_compiler_gym_service/service_py/example_service.py index 7482247bb..e5536e24a 100755 --- a/examples/example_compiler_gym_service/service_py/example_service.py +++ b/examples/example_compiler_gym_service/service_py/example_service.py @@ -14,6 +14,8 @@ Action, ActionSpace, Benchmark, + ChoiceSpace, + NamedDiscreteSpace, Observation, ObservationSpace, ScalarLimit, @@ -28,16 +30,23 @@ class ExampleCompilationSession(CompilationSession): compiler_version: str = "1.0.0" - # The list of actions that are supported by this service. This example uses - # a static (unchanging) action space, but this could be extended to support - # a dynamic action space. + # The acction spaces supported by this service. Here we will implement a + # single action space, called "default", that represents a command line with + # three options: "a", "b", and "c". action_spaces = [ ActionSpace( name="default", - action=[ - "a", - "b", - "c", + choice=[ + ChoiceSpace( + name="optimization_choice", + named_discrete_space=NamedDiscreteSpace( + value=[ + "a", + "b", + "c", + ], + ), + ) ], ) ] @@ -86,9 +95,22 @@ def __init__( logging.info("Started a compilation session for %s", benchmark.uri) def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: - logging.info("Applied action %d", action.action) - if action.action < 0 or action.action > len(self.action_spaces[0].action): + num_choices = len(self.action_spaces[0].choice[0].named_discrete_space.value) + + if len(action.choice) != 1: + raise ValueError("Missing choice") + + # This is the index into the action space's values ("a", "b", "c") that + # the user selected, e.g. 0 -> "a", 1 -> "b", 2 -> "c". + choice_index = action.choice[0].named_discrete_value_index + logging.info("Applying action %d", choice_index) + + if choice_index < 0 or choice_index >= num_choices: raise ValueError("Out-of-range") + + # Here is where we would run the actual action to update the environment's + # state. + return False, None, False def get_observation(self, observation_space: ObservationSpace) -> Observation: From 42a90f61534a16a4e4c8e188bcba5b30bfea250d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 01:28:52 +0100 Subject: [PATCH 016/254] Make downcast from unsigned to int explicit. --- compiler_gym/third_party/autophase/InstCount.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/third_party/autophase/InstCount.cc b/compiler_gym/third_party/autophase/InstCount.cc index ea9288db3..f6becff9f 100644 --- a/compiler_gym/third_party/autophase/InstCount.cc +++ b/compiler_gym/third_party/autophase/InstCount.cc @@ -85,7 +85,7 @@ void InstCount::visitBasicBlock(BasicBlock& BB) { UncondBranches++; } } - for (int i = 0; i < I.getNumOperands(); i++) { + for (int i = 0; i < static_cast(I.getNumOperands()); i++) { Value* v = I.getOperand(i); // Type* t = v->getType(); if (auto* c = dyn_cast(v)) { From 5ccf38885bada778c23d2dbd4b07cd99bc3c1e30 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 3 Sep 2021 00:50:41 +0100 Subject: [PATCH 017/254] [llvm] Port the LLVM environment to the new action space. This makes the following changes: * Expands the generated specs.py file to include an enum that enumerates the list of command line flags, and a second enum that enumerates the help strings for each command line flag. * Removes the flags.txt and action_descriptions.txt files from the LLVM service. There is now no longer any more import-time file reads. * Split the LLVM action space tests into a separate file. Issue #52. --- compiler_gym/envs/llvm/BUILD | 9 +-- compiler_gym/envs/llvm/llvm_env.py | 38 +------------ compiler_gym/envs/llvm/make_specs.py | 20 ++++++- compiler_gym/envs/llvm/service/ActionSpace.cc | 13 ++++- compiler_gym/envs/llvm/service/BUILD | 2 + compiler_gym/envs/llvm/service/LlvmSession.cc | 5 +- compiler_gym/envs/llvm/service/passes/BUILD | 5 +- .../passes/make_action_space_genfiles.py | 56 ++++--------------- setup.py | 2 - tests/llvm/BUILD | 10 ++++ tests/llvm/action_space_test.py | 30 ++++++++++ tests/llvm/llvm_env_test.py | 17 ------ tests/llvm/service/ActionSpaceTest.cc | 9 ++- tests/pytest_plugins/llvm.py | 6 +- 14 files changed, 100 insertions(+), 122 deletions(-) create mode 100644 tests/llvm/action_space_test.py diff --git a/compiler_gym/envs/llvm/BUILD b/compiler_gym/envs/llvm/BUILD index 353915840..25aca74d2 100644 --- a/compiler_gym/envs/llvm/BUILD +++ b/compiler_gym/envs/llvm/BUILD @@ -44,9 +44,6 @@ py_library( py_library( name = "llvm_env", srcs = ["llvm_env.py"], - data = [ - "//compiler_gym/envs/llvm/service/passes:actions_genfiles", - ], deps = [ ":llvm_benchmark", ":llvm_rewards", @@ -86,5 +83,9 @@ genrule( py_binary( name = "make_specs", srcs = ["make_specs.py"], - deps = [":llvm_env"], + data = ["//compiler_gym/envs/llvm/service/passes:flag_descriptions.txt"], + deps = [ + ":llvm_env", + "//compiler_gym/util", + ], ) diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index f4e1dddd3..1a345a065 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -21,38 +21,11 @@ CostFunctionReward, NormalizedReward, ) -from compiler_gym.spaces import Commandline, CommandlineFlag, Scalar, Sequence +from compiler_gym.spaces import Commandline, Scalar, Sequence from compiler_gym.third_party.autophase import AUTOPHASE_FEATURE_NAMES from compiler_gym.third_party.inst2vec import Inst2vecEncoder from compiler_gym.third_party.llvm import download_llvm_files from compiler_gym.third_party.llvm.instcount import INST_COUNT_FEATURE_NAMES -from compiler_gym.util.runfiles_path import runfiles_path - -_ACTIONS_LIST = Path( - runfiles_path("compiler_gym/envs/llvm/service/passes/actions_list.txt") -) - -_FLAGS_LIST = Path( - runfiles_path("compiler_gym/envs/llvm/service/passes/actions_flags.txt") -) - -_DESCRIPTIONS_LIST = Path( - runfiles_path("compiler_gym/envs/llvm/service/passes/actions_descriptions.txt") -) - - -def _read_list_file(path: Path) -> Iterable[str]: - with open(str(path)) as f: - for action in f: - if action.strip(): - yield action.strip() - - -# TODO(github.com/facebookresearch/CompilerGym/issues/122): Replace text file -# parsing with build-generated python modules and import them. -_ACTIONS = list(_read_list_file(_ACTIONS_LIST)) -_FLAGS = dict(zip(_ACTIONS, _read_list_file(_FLAGS_LIST))) -_DESCRIPTIONS = dict(zip(_ACTIONS, _read_list_file(_DESCRIPTIONS_LIST))) _INST2VEC_ENCODER = Inst2vecEncoder() @@ -413,15 +386,6 @@ def make_benchmark( timeout=timeout, ) - def _make_action_space(self, name: str, entries: List[str]) -> Commandline: - flags = [ - CommandlineFlag( - name=entry, flag=_FLAGS[entry], description=_DESCRIPTIONS[entry] - ) - for entry in entries - ] - return Commandline(items=flags, name=name) - def commandline( # pylint: disable=arguments-differ self, textformat: bool = False ) -> str: diff --git a/compiler_gym/envs/llvm/make_specs.py b/compiler_gym/envs/llvm/make_specs.py index 8f686419b..aaf54e211 100644 --- a/compiler_gym/envs/llvm/make_specs.py +++ b/compiler_gym/envs/llvm/make_specs.py @@ -2,7 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Generate enum declarations for LLVM service capabilities. +"""Generate specifications for the LLVM service capabilities. Usage: make_specs.py . """ @@ -12,6 +12,12 @@ from pathlib import Path from compiler_gym.envs.llvm.llvm_env import LlvmEnv +from compiler_gym.util.runfiles_path import runfiles_path + +with open( + runfiles_path("compiler_gym/envs/llvm/service/passes/flag_descriptions.txt") +) as f: + _FLAG_DESCRIPTIONS = [ln.rstrip() for ln in f.readlines()] def main(argv): @@ -29,6 +35,18 @@ def main(argv): print("class reward_spaces(Enum):", file=f) for name in env.reward.spaces: print(f' {name} = "{name}"', file=f) + print(file=f) + print("class actions(Enum):", file=f) + for name in env.action_space.names: + enum_name = "".join([x.capitalize() for x in name[1:].split("-")]) + print(f' {enum_name} = "{name}"', file=f) + print(file=f) + print("class action_descriptions(Enum):", file=f) + for name, description in zip(env.action_space.names, _FLAG_DESCRIPTIONS): + enum_name = "".join([x.capitalize() for x in name[1:].split("-")]) + sanitized_description = description.replace('" "', "") + sanitized_description = sanitized_description.replace('"', "") + print(f' {enum_name} = "{sanitized_description}"', file=f) if __name__ == "__main__": diff --git a/compiler_gym/envs/llvm/service/ActionSpace.cc b/compiler_gym/envs/llvm/service/ActionSpace.cc index d2f8699d3..2448f3fa9 100644 --- a/compiler_gym/envs/llvm/service/ActionSpace.cc +++ b/compiler_gym/envs/llvm/service/ActionSpace.cc @@ -4,9 +4,12 @@ // LICENSE file in the root directory of this source tree. #include "compiler_gym/envs/llvm/service/ActionSpace.h" +#include + #include #include "compiler_gym/util/EnumUtil.h" +#include "compiler_gym/util/Unreachable.h" namespace compiler_gym::llvm_service { @@ -17,11 +20,15 @@ std::vector getLlvmActionSpaceList() { ActionSpace space; space.set_name(util::enumNameToPascalCase(value)); switch (value) { - case LlvmActionSpace::PASSES_ALL: + case LlvmActionSpace::PASSES_ALL: { + ChoiceSpace* flagChoice = space.add_choice(); + flagChoice->set_name("flag"); + + NamedDiscreteSpace* flagChoiceSpace = flagChoice->mutable_named_discrete_space(); + flagChoiceSpace->set_is_commandline(true); for (const auto& value : magic_enum::enum_values()) { - space.add_action(util::enumNameToPascalCase(value)); + flagChoiceSpace->add_value(util::enumNameToCommandlineFlag(value)); } - flagChoice->mutable_named_discrete_space()->set_is_commandline(true); } break; default: UNREACHABLE(fmt::format("Unknown LLVM action space {}", diff --git a/compiler_gym/envs/llvm/service/BUILD b/compiler_gym/envs/llvm/service/BUILD index c4511586a..a283c1c27 100644 --- a/compiler_gym/envs/llvm/service/BUILD +++ b/compiler_gym/envs/llvm/service/BUILD @@ -80,6 +80,8 @@ cc_library( deps = [ "//compiler_gym/service/proto:compiler_gym_service_cc", "//compiler_gym/util:EnumUtil", + "//compiler_gym/util:Unreachable", + "@fmt", "@magic_enum", ], ) diff --git a/compiler_gym/envs/llvm/service/LlvmSession.cc b/compiler_gym/envs/llvm/service/LlvmSession.cc index af1f0b4d1..6748024dd 100644 --- a/compiler_gym/envs/llvm/service/LlvmSession.cc +++ b/compiler_gym/envs/llvm/service/LlvmSession.cc @@ -122,7 +122,10 @@ Status LlvmSession::applyAction(const Action& action, bool& endOfEpisode, switch (actionSpace()) { case LlvmActionSpace::PASSES_ALL: LlvmAction actionEnum; - RETURN_IF_ERROR(util::intToEnum(action.action(), &actionEnum)); + if (action.choice_size() != 1) { + return Status(StatusCode::INVALID_ARGUMENT, "Missing choice"); + } + RETURN_IF_ERROR(util::intToEnum(action.choice(0).named_discrete_value_index(), &actionEnum)); RETURN_IF_ERROR(applyPassAction(actionEnum, actionHadNoEffect)); } diff --git a/compiler_gym/envs/llvm/service/passes/BUILD b/compiler_gym/envs/llvm/service/passes/BUILD index 654655601..1421a22aa 100644 --- a/compiler_gym/envs/llvm/service/passes/BUILD +++ b/compiler_gym/envs/llvm/service/passes/BUILD @@ -80,9 +80,8 @@ genrule( "ActionEnum.h", "ActionSwitch.h", "ActionHeaders.h", - "actions_list.txt", - "actions_flags.txt", - "actions_descriptions.txt", + "flags.txt", + "flag_descriptions.txt", ], cmd = "$(location :make_action_space_genfiles) $(@D) < $(location :actions_csv)", tools = [":make_action_space_genfiles"], diff --git a/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py b/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py index 1aaac0b7d..1e3a57bbd 100644 --- a/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py +++ b/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py @@ -32,7 +32,8 @@ enum class LlvmAction { ADD_DISCRIMINATORS_PASS, AGGRESSIVE_DCEPASS, - ... } + ... + } This defines an enum that names all of the passes. @@ -48,33 +49,24 @@ case LlvmAction::AGGRESSIVE_DCEPASS: \ handlePass(llvm::createAggressiveDCEPass()); \ break; \ - ... } + ... + } To use the generated switch, call the HANDLE_ACTION() macro using an LlvmAction enum value and a handlePass function which accepts a pass instance as input. -/actions_list.txt +/flags.txt ------------------------- - Example: - - AddDiscriminatorsPass - AggressiveDcepass - ... - - A list of names for each pass. - -/actions_flags.txt --------------------------- Example: -add-discriminators -adce ... - A list of flags for each pass. + A list of names for each pass. -/actions_descriptions.txt +/flag_descriptions.txt --------------------------------- Example: @@ -88,35 +80,18 @@ import logging import sys from pathlib import Path -from typing import List from compiler_gym.envs.llvm.service.passes.common import Pass from compiler_gym.envs.llvm.service.passes.config import EXTRA_LLVM_HEADERS -def camel_case_split(string: str) -> List[str]: - """Split camelCase into a list of words. - - E.g. "thisIsCamelCaps" -> ["this", "Is, "Camel", "Caps"]. - """ - words = [[string[0]]] - - for c in string[1:]: - if words[-1][-1].islower() and c.isupper(): - words.append(list(c)) - else: - words[-1].append(c) - - return ["".join(word) for word in words] - - def process_pass(pass_, headers, enum_f, switch_f): """Extract and process transform passes in header.""" if pass_.header: headers.add(pass_.header) # The name of the pass in UPPER_PASCAL_CASE. - enum_name = "_".join(camel_case_split(pass_.name)).upper() + enum_name = pass_.flag[1:].replace("-", "_").upper() print(f" {enum_name},", file=enum_f) print(f" case LlvmAction::{enum_name}: \\", file=switch_f) print(f" handlePass(llvm::create{pass_.name}()); \\", file=switch_f) @@ -133,9 +108,8 @@ def make_action_sources(pass_iterator, outpath: Path): switch_path = Path(outpath / "ActionSwitch.h") enum_path = Path(outpath / "ActionEnum.h") include_path = Path(outpath / "ActionHeaders.h") - actions_path = Path(outpath / "actions_list.txt") - flags_path = Path(outpath / "actions_flags.txt") - descriptions_path = Path(outpath / "actions_descriptions.txt") + flags_path = Path(outpath / "flags.txt") + descriptions_path = Path(outpath / "flag_descriptions.txt") with open(switch_path, "w") as switch_f, open(enum_path, "w") as enum_f: print("enum class LlvmAction {", file=enum_f) @@ -169,16 +143,6 @@ def make_action_sources(pass_iterator, outpath: Path): ) logging.debug("Generated %s", include_path.name) - with open(actions_path, "w") as f: - print( - "\n".join( - "".join(x.capitalize() for x in camel_case_split(p.name)) - for p in passes - ), - file=f, - ) - logging.debug("Generated %s", actions_path.name) - with open(flags_path, "w") as f: print("\n".join(p.flag for p in passes), file=f) logging.debug("Generated %s", flags_path.name) diff --git a/setup.py b/setup.py index 93cb3d0c5..5a95da963 100644 --- a/setup.py +++ b/setup.py @@ -54,7 +54,6 @@ def get_tag(self): "compiler_gym.envs.gcc.service", "compiler_gym.envs.gcc", "compiler_gym.envs.llvm.datasets", - "compiler_gym.envs.llvm.service.passes", "compiler_gym.envs.llvm.service", "compiler_gym.envs.llvm", "compiler_gym.envs.loop_tool", @@ -86,7 +85,6 @@ def get_tag(self): "envs/loop_tool/service/compiler_gym-loop_tool-service", "envs/llvm/service/libLLVMPolly.so", "envs/llvm/service/compute_observation", - "envs/llvm/service/passes/*.txt", "third_party/cbench/benchmarks.txt", "third_party/cbench/cbench-v*/*", "third_party/csmith/csmith/bin/csmith", diff --git a/tests/llvm/BUILD b/tests/llvm/BUILD index 6a5ca4bd5..3ee0c5fa8 100644 --- a/tests/llvm/BUILD +++ b/tests/llvm/BUILD @@ -4,6 +4,16 @@ # LICENSE file in the root directory of this source tree. load("@rules_python//python:defs.bzl", "py_test") +py_test( + name = "action_space_test", + srcs = ["action_space_test.py"], + deps = [ + "//compiler_gym/envs", + "//tests:test_main", + "//tests/pytest_plugins:llvm", + ], +) + py_test( name = "all_actions_single_step_test", timeout = "long", diff --git a/tests/llvm/action_space_test.py b/tests/llvm/action_space_test.py new file mode 100644 index 000000000..669958052 --- /dev/null +++ b/tests/llvm/action_space_test.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Tests for the LLVM environment action space.""" +from compiler_gym.envs.llvm.llvm_env import LlvmEnv +from tests.test_main import main + +pytest_plugins = ["tests.pytest_plugins.llvm"] + + +def test_commandline_no_actions(env: LlvmEnv): + env.reset(benchmark="cbench-v1/crc32") + assert env.commandline() == "opt input.bc -o output.bc" + assert env.commandline_to_actions(env.commandline()) == [] + + +def test_commandline(env: LlvmEnv): + env.reset(benchmark="cbench-v1/crc32") + env.step(env.action_space.flags.index("-mem2reg")) + env.step(env.action_space.flags.index("-reg2mem")) + assert env.commandline() == "opt -mem2reg -reg2mem input.bc -o output.bc" + assert env.commandline_to_actions(env.commandline()) == [ + env.action_space.flags.index("-mem2reg"), + env.action_space.flags.index("-reg2mem"), + ] + + +if __name__ == "__main__": + main() diff --git a/tests/llvm/llvm_env_test.py b/tests/llvm/llvm_env_test.py index b98a1b016..19feab19a 100644 --- a/tests/llvm/llvm_env_test.py +++ b/tests/llvm/llvm_env_test.py @@ -76,23 +76,6 @@ def test_double_reset(env: LlvmEnv, always_send_benchmark_on_reset: bool): assert env.in_episode -def test_commandline_no_actions(env: LlvmEnv): - env.reset(benchmark="cbench-v1/crc32") - assert env.commandline() == "opt input.bc -o output.bc" - assert env.commandline_to_actions(env.commandline()) == [] - - -def test_commandline(env: LlvmEnv): - env.reset(benchmark="cbench-v1/crc32") - env.step(env.action_space.flags.index("-mem2reg")) - env.step(env.action_space.flags.index("-reg2mem")) - assert env.commandline() == "opt -mem2reg -reg2mem input.bc -o output.bc" - assert env.commandline_to_actions(env.commandline()) == [ - env.action_space.flags.index("-mem2reg"), - env.action_space.flags.index("-reg2mem"), - ] - - def test_connection_dies_default_reward(env: LlvmEnv): env.reward_space = "IrInstructionCount" env.reset(benchmark="cbench-v1/crc32") diff --git a/tests/llvm/service/ActionSpaceTest.cc b/tests/llvm/service/ActionSpaceTest.cc index ec3879884..19ee65296 100644 --- a/tests/llvm/service/ActionSpaceTest.cc +++ b/tests/llvm/service/ActionSpaceTest.cc @@ -16,9 +16,12 @@ namespace { TEST(ActionSpacesTest, getLlvmActionSpace) { const auto spaces = getLlvmActionSpaceList(); - EXPECT_EQ(spaces.size(), 1); - EXPECT_EQ(spaces[0].name(), "PassesAll"); - EXPECT_EQ(spaces[0].action_size(), magic_enum::enum_count()); + ASSERT_EQ(spaces.size(), 1); + ASSERT_EQ(spaces[0].name(), "PassesAll"); + ASSERT_EQ(spaces[0].choice_size(), 1); + ASSERT_TRUE(spaces[0].choice(0).named_discrete_space().is_commandline()); + EXPECT_EQ(spaces[0].choice(0).named_discrete_space().value_size(), + magic_enum::enum_count()); } } // anonymous namespace diff --git a/tests/pytest_plugins/llvm.py b/tests/pytest_plugins/llvm.py index aeeb2de99..3eeccf313 100644 --- a/tests/pytest_plugins/llvm.py +++ b/tests/pytest_plugins/llvm.py @@ -16,10 +16,6 @@ from compiler_gym.third_party import llvm from compiler_gym.util.runfiles_path import runfiles_path -ACTIONS_LIST = Path( - runfiles_path("compiler_gym/envs/llvm/service/passes/actions_flags.txt") -) - BENCHMARKS_LIST = Path(runfiles_path("compiler_gym/third_party/cbench/benchmarks.txt")) @@ -30,7 +26,6 @@ def _read_list_file(path: Path) -> Iterable[str]: yield action.strip() -ACTION_NAMES = list(_read_list_file(ACTIONS_LIST)) BENCHMARK_NAMES = list(_read_list_file(BENCHMARKS_LIST)) # Skip ghostscript on CI as it is just too heavy. @@ -40,6 +35,7 @@ def _read_list_file(path: Path) -> Iterable[str]: ] with gym.make("llvm-v0") as env: + ACTION_NAMES = list(env.action_space.names) OBSERVATION_SPACE_NAMES = sorted(env.observation.spaces.keys()) REWARD_SPACE_NAMES = sorted(env.reward.spaces.keys()) DATASET_NAMES = sorted(d.name for d in env.datasets) From 1d46a0622ab1147f49006b1783a77a0b9c9ff3e7 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 14:11:31 +0100 Subject: [PATCH 018/254] [spaces] Add a `name` attribute to all Space classes. This enforces that all Space subclasses used by CompilerGym have a `.name` attribute. This requires adding additional Space subclasses for Discrete, Dict, and Tuple. Issue #52. --- compiler_gym/envs/llvm/llvm_env.py | 85 +++++++++++++------ compiler_gym/spaces/BUILD | 29 +++++++ compiler_gym/spaces/__init__.py | 8 ++ compiler_gym/spaces/box.py | 40 +++++++++ compiler_gym/spaces/commandline.py | 7 +- compiler_gym/spaces/dict.py | 26 ++++++ compiler_gym/spaces/discrete.py | 22 +++++ compiler_gym/spaces/named_discrete.py | 13 ++- compiler_gym/spaces/reward.py | 3 + compiler_gym/spaces/scalar.py | 11 ++- compiler_gym/spaces/sequence.py | 13 ++- compiler_gym/spaces/tuple.py | 25 ++++++ compiler_gym/views/observation_space_spec.py | 6 +- docs/source/compiler_gym/spaces.rst | 51 ++++++++--- .../example_compiler_gym_service/env_tests.py | 9 +- tests/llvm/observation_spaces_test.py | 4 +- tests/spaces/commandline_test.py | 9 +- tests/spaces/named_discrete_test.py | 12 +-- tests/spaces/scalar_test.py | 22 ++--- tests/spaces/sequence_test.py | 15 ++-- 20 files changed, 326 insertions(+), 84 deletions(-) create mode 100644 compiler_gym/spaces/box.py create mode 100644 compiler_gym/spaces/dict.py create mode 100644 compiler_gym/spaces/discrete.py create mode 100644 compiler_gym/spaces/tuple.py diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index 1a345a065..8bc5a4e6a 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -9,8 +9,6 @@ from typing import Iterable, List, Optional, Union, cast import numpy as np -from gym.spaces import Box -from gym.spaces import Dict as DictSpace from compiler_gym.datasets import Benchmark, BenchmarkInitError, Dataset from compiler_gym.envs.compiler_env import CompilerEnv @@ -21,7 +19,9 @@ CostFunctionReward, NormalizedReward, ) -from compiler_gym.spaces import Commandline, Scalar, Sequence +from compiler_gym.spaces import Box, Commandline +from compiler_gym.spaces import Dict as DictSpace +from compiler_gym.spaces import Scalar, Sequence from compiler_gym.third_party.autophase import AUTOPHASE_FEATURE_NAMES from compiler_gym.third_party.inst2vec import Inst2vecEncoder from compiler_gym.third_party.llvm import download_llvm_files @@ -161,32 +161,59 @@ def __init__( self.observation.spaces["CpuInfo"].space = DictSpace( { - "name": Sequence(size_range=(0, None), dtype=str), - "cores_count": Scalar(min=None, max=None, dtype=int), - "l1i_cache_size": Scalar(min=None, max=None, dtype=int), - "l1i_cache_count": Scalar(min=None, max=None, dtype=int), - "l1d_cache_size": Scalar(min=None, max=None, dtype=int), - "l1d_cache_count": Scalar(min=None, max=None, dtype=int), - "l2_cache_size": Scalar(min=None, max=None, dtype=int), - "l2_cache_count": Scalar(min=None, max=None, dtype=int), - "l3_cache_size": Scalar(min=None, max=None, dtype=int), - "l3_cache_count": Scalar(min=None, max=None, dtype=int), - "l4_cache_size": Scalar(min=None, max=None, dtype=int), - "l4_cache_count": Scalar(min=None, max=None, dtype=int), - } + "name": Sequence(name="name", size_range=(0, None), dtype=str), + "cores_count": Scalar( + name="cores_count", min=None, max=None, dtype=int + ), + "l1i_cache_size": Scalar( + name="l1i_cache_size", min=None, max=None, dtype=int + ), + "l1i_cache_count": Scalar( + name="l1i_cache_count", min=None, max=None, dtype=int + ), + "l1d_cache_size": Scalar( + name="l1d_cache_size", min=None, max=None, dtype=int + ), + "l1d_cache_count": Scalar( + name="l1d_cache_count", min=None, max=None, dtype=int + ), + "l2_cache_size": Scalar( + name="l2_cache_size", min=None, max=None, dtype=int + ), + "l2_cache_count": Scalar( + name="l2_cache_count", min=None, max=None, dtype=int + ), + "l3_cache_size": Scalar( + name="l3_cache_size", min=None, max=None, dtype=int + ), + "l3_cache_count": Scalar( + name="l3_cache_count", min=None, max=None, dtype=int + ), + "l4_cache_size": Scalar( + name="l4_cache_size", min=None, max=None, dtype=int + ), + "l4_cache_count": Scalar( + name="l4_cache_count", min=None, max=None, dtype=int + ), + }, + name="CpuInfo", ) self.observation.add_derived_space( id="Inst2vecPreprocessedText", base_id="Ir", - space=Sequence(size_range=(0, None), dtype=str), + space=Sequence( + name="Inst2vecPreprocessedText", size_range=(0, None), dtype=str + ), translate=self.inst2vec.preprocess, default_value="", ) self.observation.add_derived_space( id="Inst2vecEmbeddingIndices", base_id="Ir", - space=Sequence(size_range=(0, None), dtype=np.int32), + space=Sequence( + name="Inst2vecEmbeddingIndices", size_range=(0, None), dtype=np.int32 + ), translate=lambda base_observation: self.inst2vec.encode( self.inst2vec.preprocess(base_observation) ), @@ -195,7 +222,7 @@ def __init__( self.observation.add_derived_space( id="Inst2vec", base_id="Ir", - space=Sequence(size_range=(0, None), dtype=np.ndarray), + space=Sequence(name="Inst2vec", size_range=(0, None), dtype=np.ndarray), translate=lambda base_observation: self.inst2vec.embed( self.inst2vec.encode(self.inst2vec.preprocess(base_observation)) ), @@ -209,9 +236,12 @@ def __init__( base_id="InstCount", space=DictSpace( { - f"{name}Count": Scalar(min=0, max=None, dtype=int) + f"{name}Count": Scalar( + name=f"{name}Count", min=0, max=None, dtype=int + ) for name in INST_COUNT_FEATURE_NAMES - } + }, + name="InstCountDict", ), translate=lambda base_observation: { f"{name}Count": val @@ -223,6 +253,7 @@ def __init__( id="InstCountNorm", base_id="InstCount", space=Box( + name="InstCountNorm", low=0, high=1, shape=(len(INST_COUNT_FEATURE_NAMES) - 1,), @@ -238,9 +269,12 @@ def __init__( base_id="InstCountNorm", space=DictSpace( { - f"{name}Density": Scalar(min=0, max=None, dtype=int) + f"{name}Density": Scalar( + name=f"{name}Density", min=0, max=None, dtype=int + ) for name in INST_COUNT_FEATURE_NAMES[1:] - } + }, + name="InstCountNormDict", ), translate=lambda base_observation: { f"{name}Density": val @@ -253,9 +287,10 @@ def __init__( base_id="Autophase", space=DictSpace( { - name: Scalar(min=0, max=None, dtype=int) + name: Scalar(name=name, min=0, max=None, dtype=int) for name in AUTOPHASE_FEATURE_NAMES - } + }, + name="AutophaseDict", ), translate=lambda base_observation: { name: val diff --git a/compiler_gym/spaces/BUILD b/compiler_gym/spaces/BUILD index cc13e0f8d..bd42df3a8 100644 --- a/compiler_gym/spaces/BUILD +++ b/compiler_gym/spaces/BUILD @@ -11,14 +11,24 @@ py_library( srcs = ["__init__.py"], visibility = ["//visibility:public"], deps = [ + ":box", ":commandline", + ":dict", + ":discrete", ":named_discrete", ":reward", ":scalar", ":sequence", + ":tuple", ], ) +py_library( + name = "box", + srcs = ["box.py"], + visibility = ["//compiler_gym:__subpackages__"], +) + py_library( name = "commandline", srcs = ["commandline.py"], @@ -28,10 +38,23 @@ py_library( ], ) +py_library( + name = "dict", + srcs = ["dict.py"], + visibility = ["//compiler_gym:__subpackages__"], +) + +py_library( + name = "discrete", + srcs = ["discrete.py"], + visibility = ["//compiler_gym:__subpackages__"], +) + py_library( name = "named_discrete", srcs = ["named_discrete.py"], visibility = ["//compiler_gym:__subpackages__"], + deps = [":discrete"], ) py_library( @@ -57,3 +80,9 @@ py_library( ":scalar", ], ) + +py_library( + name = "tuple", + srcs = ["tuple.py"], + visibility = ["//compiler_gym:__subpackages__"], +) diff --git a/compiler_gym/spaces/__init__.py b/compiler_gym/spaces/__init__.py index 6b06ba1a4..7b9b1a79b 100644 --- a/compiler_gym/spaces/__init__.py +++ b/compiler_gym/spaces/__init__.py @@ -2,18 +2,26 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +from compiler_gym.spaces.box import Box from compiler_gym.spaces.commandline import Commandline, CommandlineFlag +from compiler_gym.spaces.dict import Dict +from compiler_gym.spaces.discrete import Discrete from compiler_gym.spaces.named_discrete import NamedDiscrete from compiler_gym.spaces.reward import DefaultRewardFromObservation, Reward from compiler_gym.spaces.scalar import Scalar from compiler_gym.spaces.sequence import Sequence +from compiler_gym.spaces.tuple import Tuple __all__ = [ + "Box", "Commandline", "CommandlineFlag", "DefaultRewardFromObservation", + "Dict", + "Discrete", "NamedDiscrete", "Reward", "Scalar", "Sequence", + "Tuple", ] diff --git a/compiler_gym/spaces/box.py b/compiler_gym/spaces/box.py new file mode 100644 index 000000000..a8c04d163 --- /dev/null +++ b/compiler_gym/spaces/box.py @@ -0,0 +1,40 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Iterable, Optional + +import numpy as np +from gym.spaces import Box as GymBox + + +class Box(GymBox): + """A (possibly unbounded) box in R^n. Specifically, a Box represents the + Cartesian product of n closed intervals. Each interval has the form of one + of [a, b], (-oo, b], [a, oo), or (-oo, oo). + + Wraps the underlying :code:`gym.spaces.Box` with a name attribute. + """ + + def __init__( + self, + low: float, + high: float, + name: str, + shape: Optional[Iterable[int]] = None, + dtype=np.float32, + ): + """Constructor. + + :param low: The lower bound, inclusive. + + :param high: The upper bound, inclusive. + + :param name: The name of the space. + + :param shape: The shape of the space. + + :param dtype: The dtype of the space. + """ + super().__init__(low=low, high=high, shape=shape, dtype=dtype) + self.name = name diff --git a/compiler_gym/spaces/commandline.py b/compiler_gym/spaces/commandline.py index f9f47eb0a..58a7c2f84 100644 --- a/compiler_gym/spaces/commandline.py +++ b/compiler_gym/spaces/commandline.py @@ -2,7 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -from typing import Iterable, List, NamedTuple, Optional, Union +from typing import Iterable, List, NamedTuple, Union from compiler_gym.spaces.named_discrete import NamedDiscrete @@ -50,16 +50,17 @@ class Commandline(NamedDiscrete): :ivar descriptions: A list of flag descriptions. """ - def __init__(self, items: Iterable[CommandlineFlag], name: Optional[str] = None): + def __init__(self, items: Iterable[CommandlineFlag], name: str): """Constructor. :param items: The commandline flags that comprise the space. + :param name: The name of the space. """ items = list(items) self.flags = [f.flag for f in items] self.descriptions = [f.description for f in items] - super().__init__([f.flag for f in items], name) + super().__init__([f.flag for f in items], name=name) def __repr__(self) -> str: return f"Commandline([{' '.join(self.flags)}])" diff --git a/compiler_gym/spaces/dict.py b/compiler_gym/spaces/dict.py new file mode 100644 index 000000000..84f1178bf --- /dev/null +++ b/compiler_gym/spaces/dict.py @@ -0,0 +1,26 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Dict as DictType +from typing import List, Union + +from gym.spaces import Dict as GymDict +from gym.spaces import Space + + +class Dict(GymDict): + """A dictionary of simpler spaces. + + Wraps the underlying :code:`gym.spaces.Dict` space with a name attribute. + """ + + def __init__(self, spaces: Union[DictType[str, Space], List[Space]], name: str): + """Constructor. + + :param spaces: The composite spaces. + + :param name: The name of the space. + """ + super().__init__(spaces) + self.name = name diff --git a/compiler_gym/spaces/discrete.py b/compiler_gym/spaces/discrete.py new file mode 100644 index 000000000..a6d3df609 --- /dev/null +++ b/compiler_gym/spaces/discrete.py @@ -0,0 +1,22 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from gym.spaces import Discrete as GymDiscrete + + +class Discrete(GymDiscrete): + """A discrete space in :math:`{ 0, 1, \\dots, n-1 }`. + + Wraps the underlying :code:`gym.spaces.Discrete` space with a name attribute. + """ + + def __init__(self, n: int, name: str): + """Constructor. + + :param n: The upper bound. + + :param name: The name of the space. + """ + super().__init__(n) + self.name = name diff --git a/compiler_gym/spaces/named_discrete.py b/compiler_gym/spaces/named_discrete.py index 043bd192a..64419efc4 100644 --- a/compiler_gym/spaces/named_discrete.py +++ b/compiler_gym/spaces/named_discrete.py @@ -2,17 +2,17 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -from typing import Iterable, List, Optional, Union +from typing import Iterable, List, Union -from gym.spaces import Discrete +from compiler_gym.spaces.discrete import Discrete class NamedDiscrete(Discrete): """An extension of the :code:`Discrete` space in which each point in the space has a name. Additionally, the space itself may have a name. - :ivar name: The name of the space. :code:`None` if the space has no name. - :vartype name: Optional[str] + :ivar name: The name of the space. + :vartype name: str :ivar names: A list of names for each element in the space. :vartype names: List[str] @@ -30,15 +30,14 @@ class NamedDiscrete(Discrete): 1 """ - def __init__(self, items: Iterable[str], name: Optional[str] = None): + def __init__(self, items: Iterable[str], name: str): """Constructor. :param items: A list of names for items in the space. :param name: The name of the space. """ - self.name = name self.names = [str(x) for x in items] - super().__init__(n=len(self.names)) + super().__init__(n=len(self.names), name=name) def __getitem__(self, name: str) -> int: """Lookup the numeric value of a point in the space. diff --git a/compiler_gym/spaces/reward.py b/compiler_gym/spaces/reward.py index 5b3653409..fe0f8baa6 100644 --- a/compiler_gym/spaces/reward.py +++ b/compiler_gym/spaces/reward.py @@ -38,6 +38,8 @@ class Reward(Scalar): def __init__( self, + # TODO(cummins): Rename `id` to `name` for consistency with the other + # space classes. id: str, observation_spaces: Optional[List[str]] = None, default_value: RewardType = 0, @@ -77,6 +79,7 @@ def __init__( execution environment of the service. """ super().__init__( + name=id, min=-np.inf if min is None else min, max=np.inf if max is None else max, dtype=np.float64, diff --git a/compiler_gym/spaces/scalar.py b/compiler_gym/spaces/scalar.py index 6b764fef3..61c49ccad 100644 --- a/compiler_gym/spaces/scalar.py +++ b/compiler_gym/spaces/scalar.py @@ -15,19 +15,28 @@ class Scalar(Space): __slots__ = ["min", "max", "dtype"] def __init__( - self, min: Optional[float] = None, max: Optional[float] = None, dtype=np.float64 + self, + name: str, + min: Optional[float] = None, + max: Optional[float] = None, + dtype=np.float64, ): """Constructor. + :param name: The name of the space. + :param min: The lower bound for a value in this space. If None, there is no lower bound. + :param max: The upper bound for a value in this space. If None, there is no upper bound. + :param dtype: The type of this scalar. """ self.min = min self.max = max self.dtype = dtype + self.name = name def sample(self): min = 0 if self.min is None else self.min diff --git a/compiler_gym/spaces/sequence.py b/compiler_gym/spaces/sequence.py index b1881baef..50573f08a 100644 --- a/compiler_gym/spaces/sequence.py +++ b/compiler_gym/spaces/sequence.py @@ -41,6 +41,7 @@ class Sequence(Space): def __init__( self, + name: str, size_range: Tuple[int, Optional[int]] = (0, None), dtype=bytes, opaque_data_format: Optional[str] = None, @@ -48,20 +49,26 @@ def __init__( ): """Constructor. + :param name: The name of the space. + :param size_range: A tuple indicating the `(lower, upper)` bounds for sequence lengths. An upper bound of `None` means no upper bound. All sequences must have a lower bound of length >= 0. + :param dtype: The data type for each element in a sequence. + :param opaque_data_format: An optional string describing an opaque data format, e.g. a data structure that is serialized to a string/binary array for transmission to the client. It is up to the client and service to agree on how to decode observations using this value. For example, an opaque_data_format of `string_json` could be used to indicate that the observation is a string-serialized JSON value. - :param scalar_range: If specified, this denotes the legal range of - each element in the sequence. This is enforced by - :meth:`contains() ` checks. + + :param scalar_range: If specified, this denotes the legal range of each + element in the sequence. This is enforced by :meth:`contains() + ` checks. """ + self.name = name self.size_range = size_range self.dtype = dtype self.opaque_data_format = opaque_data_format diff --git a/compiler_gym/spaces/tuple.py b/compiler_gym/spaces/tuple.py new file mode 100644 index 000000000..7c4c6fb6c --- /dev/null +++ b/compiler_gym/spaces/tuple.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import List + +from gym.spaces import Space +from gym.spaces import Tuple as GymTuple + + +class Tuple(GymTuple): + """A tuple (i.e., product) of simpler spaces. + + Wraps the underlying :code:`gym.spaces.Tuple` space with a name attribute. + """ + + def __init__(self, spaces: List[Space], name: str): + """Constructor. + + :param spaces: The composite spaces. + + :param name: The name of the space. + """ + super().__init__(spaces) + self.name = name diff --git a/compiler_gym/views/observation_space_spec.py b/compiler_gym/views/observation_space_spec.py index 0375c9b95..a321ee5c4 100644 --- a/compiler_gym/views/observation_space_spec.py +++ b/compiler_gym/views/observation_space_spec.py @@ -7,9 +7,10 @@ import networkx as nx import numpy as np -from gym.spaces import Box, Space +from gym.spaces import Space from compiler_gym.service.proto import Observation, ObservationSpace, ScalarRange +from compiler_gym.spaces.box import Box from compiler_gym.spaces.scalar import Scalar from compiler_gym.spaces.sequence import Sequence from compiler_gym.util.gym_type_hints import ObservationType @@ -115,6 +116,7 @@ def from_proto(cls, index: int, proto: ObservationSpace): def make_box(scalar_range_list, dtype, defaults): bounds = [_scalar_range2tuple(r, defaults) for r in scalar_range_list] return Box( + name=proto.name, low=np.array([b[0] for b in bounds], dtype=dtype), high=np.array([b[1] for b in bounds], dtype=dtype), dtype=dtype, @@ -123,6 +125,7 @@ def make_box(scalar_range_list, dtype, defaults): def make_scalar(scalar_range, dtype, defaults): scalar_range_tuple = _scalar_range2tuple(scalar_range, defaults) return Scalar( + name=proto.name, min=dtype(scalar_range_tuple[0]), max=dtype(scalar_range_tuple[1]), dtype=dtype, @@ -130,6 +133,7 @@ def make_scalar(scalar_range, dtype, defaults): def make_seq(size_range, dtype, defaults, scalar_range=None): return Sequence( + name=proto.name, size_range=_scalar_range2tuple(size_range, defaults), dtype=dtype, opaque_data_format=proto.opaque_data_format, diff --git a/docs/source/compiler_gym/spaces.rst b/docs/source/compiler_gym/spaces.rst index df1dd1d1a..21a5a4745 100644 --- a/docs/source/compiler_gym/spaces.rst +++ b/docs/source/compiler_gym/spaces.rst @@ -11,19 +11,31 @@ observation spaces available to compilers. .. currentmodule:: compiler_gym.spaces -Scalar ------- +Commandline +----------- -.. autoclass:: Scalar +.. autoclass:: Commandline :members: .. automethod:: __init__ +.. autoclass:: CommandlineFlag + :members: -Sequence + +Dict +---- + +.. autoclass:: Dict + :members: + + .. automethod:: __init__ + + +Discrete -------- -.. autoclass:: Sequence +.. autoclass:: Discrete :members: .. automethod:: __init__ @@ -40,22 +52,37 @@ NamedDiscrete .. automethod:: __getitem__ -Commandline ------------ +Reward +------ -.. autoclass:: Commandline +.. autoclass:: Reward :members: .. automethod:: __init__ -.. autoclass:: CommandlineFlag + +Scalar +------ + +.. autoclass:: Scalar :members: + .. automethod:: __init__ -Reward ------- -.. autoclass:: Reward +Sequence +-------- + +.. autoclass:: Sequence + :members: + + .. automethod:: __init__ + + +Tuple +----- + +.. autoclass:: Tuple :members: .. automethod:: __init__ diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index 1e6ae7db4..91e9d8d61 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -10,12 +10,11 @@ import gym import numpy as np import pytest -from gym.spaces import Box import examples.example_compiler_gym_service as example from compiler_gym.envs import CompilerEnv from compiler_gym.service import SessionNotFound -from compiler_gym.spaces import NamedDiscrete, Scalar, Sequence +from compiler_gym.spaces import Box, NamedDiscrete, Scalar, Sequence from compiler_gym.util.debug_util import set_debug_level from tests.test_main import main @@ -91,13 +90,13 @@ def test_observation_spaces(env: CompilerEnv): env.reset() assert env.observation.spaces.keys() == {"ir", "features", "runtime"} assert env.observation.spaces["ir"].space == Sequence( - size_range=(0, None), dtype=str, opaque_data_format="" + name="test", size_range=(0, None), dtype=str, opaque_data_format="" ) assert env.observation.spaces["features"].space == Box( - shape=(3,), low=-100, high=100, dtype=int + name="test", shape=(3,), low=-100, high=100, dtype=int ) assert env.observation.spaces["runtime"].space == Scalar( - min=0, max=np.inf, dtype=float + name="test", min=0, max=np.inf, dtype=float ) diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 4e7facf2f..bacda20e7 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -15,6 +15,8 @@ from gym.spaces import Dict as DictSpace from compiler_gym.envs.llvm.llvm_env import LlvmEnv +from compiler_gym.spaces import Box +from compiler_gym.spaces import Dict as DictSpace from compiler_gym.spaces import Scalar, Sequence from tests.test_main import main @@ -1326,7 +1328,7 @@ def test_add_derived_space(env: LlvmEnv): env.observation.add_derived_space( id="IrLen", base_id="Ir", - space=Box(low=0, high=float("inf"), shape=(1,), dtype=int), + space=Box(name="IrLen", low=0, high=float("inf"), shape=(1,), dtype=int), translate=lambda base: [15], ) diff --git a/tests/spaces/commandline_test.py b/tests/spaces/commandline_test.py index e9daad0b1..7d0801720 100644 --- a/tests/spaces/commandline_test.py +++ b/tests/spaces/commandline_test.py @@ -13,7 +13,8 @@ def test_sample(): CommandlineFlag(name="a", flag="-a", description=""), CommandlineFlag(name="b", flag="-b", description=""), CommandlineFlag(name="c", flag="-c", description=""), - ] + ], + name="test", ) assert space.sample() in {0, 1, 2} @@ -24,7 +25,8 @@ def test_contains(): CommandlineFlag(name="a", flag="-a", description=""), CommandlineFlag(name="b", flag="-b", description=""), CommandlineFlag(name="c", flag="-c", description=""), - ] + ], + name="test", ) assert space.contains(0) assert space.contains(1) @@ -40,7 +42,8 @@ def test_commandline(): CommandlineFlag(name="a", flag="-a", description=""), CommandlineFlag(name="b", flag="-b", description=""), CommandlineFlag(name="c", flag="-c", description=""), - ] + ], + name="test", ) assert space.commandline([0, 1, 2]) == "-a -b -c" diff --git a/tests/spaces/named_discrete_test.py b/tests/spaces/named_discrete_test.py index f8f1b7055..c9d49ded2 100644 --- a/tests/spaces/named_discrete_test.py +++ b/tests/spaces/named_discrete_test.py @@ -10,36 +10,36 @@ def test_empty_space(): - space = NamedDiscrete([]) + space = NamedDiscrete([], name="test") assert space.n == 0 assert space.names == [] def test_invalid_name_lookup(): - space = NamedDiscrete(["foo"]) + space = NamedDiscrete(["foo"], name="test") with pytest.raises(ValueError): _ = space["bar"] def test_space_size(): - space = NamedDiscrete(["a", "b", "c"]) + space = NamedDiscrete(["a", "b", "c"], name="test") assert space.n == 3 def test_name_lookup(): - space = NamedDiscrete(["a", "b", "c"]) + space = NamedDiscrete(["a", "b", "c"], name="test") assert space["a"] == 0 assert space["b"] == 1 assert space["c"] == 2 def test_repr(): - space = NamedDiscrete(["foo", "bar"]) + space = NamedDiscrete(["foo", "bar"], name="test") assert str(space) == "NamedDiscrete([foo, bar])" def test_to_string(): - space = NamedDiscrete(["foo", "bar"]) + space = NamedDiscrete(["foo", "bar"], name="test") assert space.to_string(0) == "foo" assert space.to_string([0]) == "foo" assert space.to_string([0, 0, 1]) == "foo foo bar" diff --git a/tests/spaces/scalar_test.py b/tests/spaces/scalar_test.py index 8d54a4c9c..919476cf6 100644 --- a/tests/spaces/scalar_test.py +++ b/tests/spaces/scalar_test.py @@ -8,47 +8,47 @@ def test_sample(): - space = Scalar(min=-10, max=10, dtype=int) + space = Scalar(name="test", min=-10, max=10, dtype=int) x = space.sample() assert isinstance(x, int) assert -10 <= x <= 10 def test_int_contains(): - space = Scalar(min=-10, max=10, dtype=int) + space = Scalar(name="test", min=-10, max=10, dtype=int) assert space.contains(-10) assert not space.contains(-11) assert not space.contains(0.5) def test_int_contains_no_upper_bound(): - space = Scalar(min=0, max=None, dtype=int) + space = Scalar(name="test", min=0, max=None, dtype=int) assert space.contains(0) assert not space.contains(-1) assert space.contains(1000) def test_equality(): - space_a = Scalar(min=0, max=None, dtype=int) - space_b = Scalar(min=0, max=None, dtype=int) + space_a = Scalar(name="test", min=0, max=None, dtype=int) + space_b = Scalar(name="test", min=0, max=None, dtype=int) assert space_a == space_b def test_dtype_inequality(): - space_a = Scalar(min=0, max=None, dtype=int) - space_b = Scalar(min=0, max=None, dtype=float) + space_a = Scalar(name="test", min=0, max=None, dtype=int) + space_b = Scalar(name="test", min=0, max=None, dtype=float) assert space_a != space_b def test_upper_bound_inequality(): - space_a = Scalar(min=0, max=None, dtype=int) - space_b = Scalar(min=0, max=5, dtype=int) + space_a = Scalar(name="test", min=0, max=None, dtype=int) + space_b = Scalar(name="test", min=0, max=5, dtype=int) assert space_a != space_b def test_lower_bound_inequality(): - space_a = Scalar(min=0, max=None, dtype=int) - space_b = Scalar(min=None, max=None, dtype=int) + space_a = Scalar(name="test", min=0, max=None, dtype=int) + space_b = Scalar(name="test", min=None, max=None, dtype=int) assert space_a != space_b diff --git a/tests/spaces/sequence_test.py b/tests/spaces/sequence_test.py index d0f8dd85a..8b29aca93 100644 --- a/tests/spaces/sequence_test.py +++ b/tests/spaces/sequence_test.py @@ -10,34 +10,34 @@ def test_sample(): - space = Sequence(size_range=(0, None), dtype=int) + space = Sequence(name="test", size_range=(0, None), dtype=int) with pytest.raises(NotImplementedError): space.sample() def test_str_contains(): - space = Sequence(size_range=(0, None), dtype=str) + space = Sequence(name="test", size_range=(0, None), dtype=str) assert space.contains("Hello, world!") assert space.contains("") assert not space.contains([1, 2, 3]) def test_str_contains_too_long(): - space = Sequence(size_range=(0, 4), dtype=str) + space = Sequence(name="test", size_range=(0, 4), dtype=str) assert not space.contains("Hello, world!") assert space.contains("") assert not space.contains([1, 2, 3]) def test_str_contains_too_short(): - space = Sequence(size_range=(3, None), dtype=str) + space = Sequence(name="test", size_range=(3, None), dtype=str) assert space.contains("Hello, world!") assert not space.contains("") assert not space.contains([1, 2, 3]) def test_int_contains(): - space = Sequence(size_range=(5, 5), dtype=int) + space = Sequence(name="test", size_range=(5, 5), dtype=int) assert not space.contains(list(range(4))) assert space.contains(list(range(5))) assert not space.contains(list(range(6))) @@ -45,7 +45,10 @@ def test_int_contains(): def test_contains_with_float_scalar_range(): space = Sequence( - size_range=(3, 3), dtype=float, scalar_range=Scalar(min=0, max=1, dtype=float) + name="test", + size_range=(3, 3), + dtype=float, + scalar_range=Scalar(name="test", min=0, max=1, dtype=float), ) assert space.contains([0.0, 0.0, 0.0]) assert space.contains([0.1, 1.0, 0.5]) From 1db4d357f15e0059a7f9a5f0e2b0f1929405bd3f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 14:13:02 +0100 Subject: [PATCH 019/254] [service] Python proto converter tests and improvements. Issue #52. --- compiler_gym/envs/compiler_env.py | 8 +- compiler_gym/service/proto/BUILD | 3 + compiler_gym/service/proto/__init__.py | 4 +- compiler_gym/service/proto/py_converters.py | 165 +++++----- tests/service/proto/BUILD | 16 + tests/service/proto/__init__.py | 7 + tests/service/proto/py_converters_test.py | 328 ++++++++++++++++++++ 7 files changed, 454 insertions(+), 77 deletions(-) create mode 100644 tests/service/proto/BUILD create mode 100644 tests/service/proto/__init__.py create mode 100644 tests/service/proto/py_converters_test.py diff --git a/compiler_gym/envs/compiler_env.py b/compiler_gym/envs/compiler_env.py index f3dfaed28..fc0c20d08 100644 --- a/compiler_gym/envs/compiler_env.py +++ b/compiler_gym/envs/compiler_env.py @@ -44,7 +44,7 @@ StartSessionRequest, StepReply, StepRequest, - action_space_from_proto, + proto_to_action_space, ) from compiler_gym.spaces import DefaultRewardFromObservation, NamedDiscrete, Reward from compiler_gym.util.debug_util import get_logging_level @@ -288,7 +288,7 @@ def __init__( # Process the available action, observation, and reward spaces. action_spaces = [ - action_space_from_proto(space) for space in self.service.action_spaces + proto_to_action_space(space) for space in self.service.action_spaces ] self.action_spaces = [a.space for a in action_spaces] self._make_actions = [a.make_action for a in action_spaces] @@ -835,7 +835,7 @@ def _call_with_error( # If the action space has changed, update it. if reply.HasField("new_action_space"): - self.action_space, self._make_action = action_space_from_proto( + self.action_space, self._make_action = proto_to_action_space( reply.new_action_space ) @@ -955,7 +955,7 @@ def raw_step( # If the action space has changed, update it. if reply.HasField("new_action_space"): - self.action_space, self._make_action = action_space_from_proto( + self.action_space, self._make_action = proto_to_action_space( reply.action_space ) diff --git a/compiler_gym/service/proto/BUILD b/compiler_gym/service/proto/BUILD index a2402cb76..b52c869f5 100644 --- a/compiler_gym/service/proto/BUILD +++ b/compiler_gym/service/proto/BUILD @@ -19,8 +19,11 @@ py_library( ":compiler_gym_service_py", ":compiler_gym_service_py_grpc", "//compiler_gym/spaces:commandline", + "//compiler_gym/spaces:dict", + "//compiler_gym/spaces:discrete", "//compiler_gym/spaces:named_discrete", "//compiler_gym/spaces:scalar", + "//compiler_gym/spaces:tuple", ], ) diff --git a/compiler_gym/service/proto/__init__.py b/compiler_gym/service/proto/__init__.py index 5d8acf2d7..21e7837f6 100644 --- a/compiler_gym/service/proto/__init__.py +++ b/compiler_gym/service/proto/__init__.py @@ -41,10 +41,10 @@ CompilerGymServiceServicer, CompilerGymServiceStub, ) -from compiler_gym.service.proto.py_converters import action_space_from_proto +from compiler_gym.service.proto.py_converters import proto_to_action_space __all__ = [ - "action_space_from_proto", + "proto_to_action_space", "Action", "ActionSpace", "AddBenchmarkReply", diff --git a/compiler_gym/service/proto/py_converters.py b/compiler_gym/service/proto/py_converters.py index 86990de9d..c63657e9d 100644 --- a/compiler_gym/service/proto/py_converters.py +++ b/compiler_gym/service/proto/py_converters.py @@ -2,10 +2,11 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -from typing import Any, Callable, List, NamedTuple +from typing import Any, Callable +from typing import Dict as DictType +from typing import List, NamedTuple import gym -from gym.spaces import Dict, Discrete, Tuple from compiler_gym.service.proto.compiler_gym_service_pb2 import ( Action, @@ -14,8 +15,11 @@ ChoiceSpace, ) from compiler_gym.spaces.commandline import Commandline, CommandlineFlag +from compiler_gym.spaces.dict import Dict +from compiler_gym.spaces.discrete import Discrete from compiler_gym.spaces.named_discrete import NamedDiscrete from compiler_gym.spaces.scalar import Scalar +from compiler_gym.spaces.tuple import Tuple class PyChoiceSpace(NamedTuple): @@ -32,94 +36,113 @@ class PyActionSpace(NamedTuple): make_action: Callable[[Any], Action] -def compose_choices(choices: List[PyChoiceSpace]) -> Callable[[Any], Action]: - """Compose a list of choice spaces into a single make_action() callback.""" +def proto_to_action_space(proto: ActionSpace) -> PyActionSpace: + """Convert a ActionSpace message to a gym.Space and action callback. - def _compose_choices(action: Any) -> Action: - return Action( - choice=[choice.make_choice(a) for a, choice in zip(action, choices)] - ) + :param proto: An ActionSpace message. - return _compose_choices - - -def action_space_from_proto(proto: ActionSpace) -> PyActionSpace: - """Construct an ActionSpace from protocol buffer.""" - - def make_space_from_choice(choice: ChoiceSpace) -> PyChoiceSpace: - choice_type = choice.WhichOneof("space") - if choice_type == "int64_range": - if choice.int64_range.min.value: - return PyChoiceSpace( - space=Scalar( - min=choice.int64_range.min.value, - max=choice.int64_range.max.value, - dtype=int, - ), - make_choice=lambda a: Choice(int64_value=a), - ) - else: - return PyChoiceSpace( - space=Discrete(n=choice.int64_range.max.value), - make_choice=lambda a: Choice(named_discrete_value_index=a), - ) - elif choice_type == "double_range": - return PyChoiceSpace( - space=Scalar( - min=choice.int64_range.min.value, - max=choice.int64_range.max.value, - dtype=float, - ), - make_choice=lambda a: Choice(double_value=a), - ) - elif ( - choice_type == "named_discrete_space" - and choice.named_discrete_space.is_commandline - ): - return PyChoiceSpace( - space=Commandline( - # TODO: Decide whether commandline makes sense ... - items=[ - CommandlineFlag(name=x, flag=x, description="") - for x in choice.named_discrete_space.value - ], - name=choice.name, - ), - make_choice=lambda a: Choice(named_discrete_value_index=a), - ) - elif choice_type == "named_discrete_space": - return PyChoiceSpace( - space=NamedDiscrete( - items=choice.named_discrete_space.value, name=choice.name - ), - make_choice=lambda a: Choice(named_discrete_value_index=a), + :returns: A PyActionSpace tuple, comprising a gym.Space space, and a + callback that formats its input as an Action message. + """ + if proto.named_choices: + # Convert a list of named choices to a dictionary space. + choices = [proto_to_choice_space(choice) for choice in proto.choice] + + def compose_choice_dict(action: DictType[str, Any]): + return Action( + choice=[ + choice.make_choice(action[choice.space.name]) for choice in choices + ] ) - raise ValueError(f"Unknown space for ChoiceSpace: {choice}") - if len(proto.choice) > 1 and proto.named_choices: - choices = [make_space_from_choice(choice) for choice in proto.choice] return PyActionSpace( space=Dict( spaces={ choice.name: space.space for choice, space in zip(proto.choice, choices) - } + }, + name=proto.name, ), - make_action=compose_choices(choices), + make_action=compose_choice_dict, ) - elif len(proto.choice) > 1: - choices = [make_space_from_choice(choice) for choice in proto.choice] + # Convert an unnamed list of choices to a tuple space. + choices = [proto_to_choice_space(choice) for choice in proto.choice] + + def compose_choice_list(action: List[Any]) -> Action: + return Action( + choice=[choice.make_choice(a) for a, choice in zip(action, choices)] + ) return PyActionSpace( - space=Tuple(spaces=[choice.space for choice in choices]), - make_action=compose_choices(choices), + space=Tuple(spaces=[choice.space for choice in choices], name=proto.name), + make_action=compose_choice_list, ) elif proto.choice: - space, make_choice = make_space_from_choice(proto.choice[0]) + # Convert a single choice into an action space. + space, make_choice = proto_to_choice_space(proto.choice[0]) # When there is only a single choice, use the name of the parent space. space.name = proto.name return PyActionSpace( space=space, make_action=lambda a: Action(choice=[make_choice(a)]) ) raise ValueError("No choices set for ActionSpace") + + +def proto_to_choice_space(choice: ChoiceSpace) -> PyChoiceSpace: + """Convert a ChoiceSpace message to a gym.Space and choice callback. + + :param proto: A ChoiceSpace message. + + :returns: A PyChoiceSpace tuple, comprising a gym.Space space, and a + callback that wraps an input in a Choice message. + """ + choice_type = choice.WhichOneof("space") + if choice_type == "int64_range": + if choice.int64_range.min.value: + return PyChoiceSpace( + space=Scalar( + min=choice.int64_range.min.value, + max=choice.int64_range.max.value, + dtype=int, + name=choice.name, + ), + make_choice=lambda a: Choice(int64_value=a), + ) + else: + return PyChoiceSpace( + space=Discrete(n=choice.int64_range.max.value, name=choice.name), + make_choice=lambda a: Choice(int64_value=a), + ) + elif choice_type == "double_range": + return PyChoiceSpace( + space=Scalar( + min=choice.double_range.min.value, + max=choice.double_range.max.value, + dtype=float, + name=choice.name, + ), + make_choice=lambda a: Choice(double_value=a), + ) + elif ( + choice_type == "named_discrete_space" + and choice.named_discrete_space.is_commandline + ): + return PyChoiceSpace( + space=Commandline( + items=[ + CommandlineFlag(name=x, flag=x, description="") + for x in choice.named_discrete_space.value + ], + name=choice.name, + ), + make_choice=lambda a: Choice(named_discrete_value_index=a), + ) + elif choice_type == "named_discrete_space": + return PyChoiceSpace( + space=NamedDiscrete( + items=choice.named_discrete_space.value, name=choice.name + ), + make_choice=lambda a: Choice(named_discrete_value_index=a), + ) + raise ValueError(f"Invalid ChoiceSpace: {choice}") diff --git a/tests/service/proto/BUILD b/tests/service/proto/BUILD new file mode 100644 index 000000000..aaaea5642 --- /dev/null +++ b/tests/service/proto/BUILD @@ -0,0 +1,16 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +load("@rules_python//python:defs.bzl", "py_test") + +py_test( + name = "py_converters_test", + timeout = "short", + srcs = ["py_converters_test.py"], + deps = [ + "//compiler_gym/service/proto", + "//compiler_gym/spaces", + "//tests:test_main", + ], +) diff --git a/tests/service/proto/__init__.py b/tests/service/proto/__init__.py new file mode 100644 index 000000000..768f77b7e --- /dev/null +++ b/tests/service/proto/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the LICENSE file +# in the root directory of this source tree. +# +# tests/**/__init__.py files are needed for pytest Python path resolution. See: +# https://docs.pytest.org/en/latest/explanation/pythonpath.html diff --git a/tests/service/proto/py_converters_test.py b/tests/service/proto/py_converters_test.py new file mode 100644 index 000000000..adb15d6a4 --- /dev/null +++ b/tests/service/proto/py_converters_test.py @@ -0,0 +1,328 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Unit tests for //compiler_gym:validate.""" +import pytest +from gym.spaces import Dict, Tuple + +from compiler_gym.service.proto import ( + ActionSpace, + ChoiceSpace, + NamedDiscreteSpace, + ScalarLimit, + ScalarRange, + py_converters, +) +from compiler_gym.spaces import Commandline, Discrete, NamedDiscrete, Scalar +from tests.test_main import main + + +def test_proto_to_action_space_no_choices(): + with pytest.raises(ValueError, match=r"^No choices set for ActionSpace$"): + py_converters.proto_to_action_space(ActionSpace(name="test", choice=[])) + + +def test_proto_to_action_space_empty_choice(): + with pytest.raises(ValueError, match=r'^Invalid ChoiceSpace: name: "invalid"'): + py_converters.proto_to_action_space( + ActionSpace(name="test", choice=[ChoiceSpace(name="invalid")]) + ) + + +def test_proto_to_action_space_bounded_scalar_int_choice(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="unnamed", + int64_range=ScalarRange( + min=ScalarLimit(value=-1), max=ScalarLimit(value=1) + ), + ) + ], + ) + ) + + assert isinstance(space, Scalar) + assert space.name == "test" + assert space.contains(1) + assert space.contains(0) + assert space.contains(-1) + + assert not space.contains(2) + assert not space.contains(-2) + assert not space.contains("abc") + assert not space.contains(1.5) + + action = to_action(1) + assert len(action.choice) == 1 + assert action.choice[0].int64_value == 1 + + action = to_action(0) + assert len(action.choice) == 1 + assert action.choice[0].int64_value == 0 + + with pytest.raises(TypeError): + to_action(1.5) + + with pytest.raises(TypeError): + to_action("abc") + + +def test_proto_to_action_space_discrete_choice(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="unnamed", + int64_range=ScalarRange(max=ScalarLimit(value=2)), + ) + ], + ) + ) + + assert isinstance(space, Discrete) + assert space.name == "test" + assert space.contains(1) + assert space.contains(0) + + assert not space.contains(2) + assert not space.contains(-2) + assert not space.contains("abc") + assert not space.contains(1.5) + + action = to_action(1) + assert len(action.choice) == 1 + assert action.choice[0].int64_value == 1 + + action = to_action(0) + assert len(action.choice) == 1 + assert action.choice[0].int64_value == 0 + + with pytest.raises(TypeError): + to_action(1.5) + + with pytest.raises(TypeError): + to_action("abc") + + +def test_proto_to_action_space_bounded_scalar_double_choice(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="unnamed", + double_range=ScalarRange( + min=ScalarLimit(value=-1), max=ScalarLimit(value=1) + ), + ) + ], + ) + ) + + assert isinstance(space, Scalar) + assert space.name == "test" + assert space.contains(1.0) + assert space.contains(0.0) + assert space.contains(-1.0) + + assert not space.contains(2.0) + assert not space.contains(-2.0) + assert not space.contains("abc") + assert not space.contains(1) + + action = to_action(1) + assert len(action.choice) == 1 + assert action.choice[0].double_value == 1 + + action = to_action(0.5) + assert len(action.choice) == 1 + assert action.choice[0].double_value == 0.5 + + with pytest.raises(TypeError): + to_action("abc") + + +def test_proto_to_action_space_named_discrete_choice(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="unnamed", + named_discrete_space=NamedDiscreteSpace(value=["a", "b", "c"]), + ) + ], + ) + ) + + assert isinstance(space, NamedDiscrete) + assert space.name == "test" + assert space.contains(0) + assert space.contains(1) + assert space.contains(2) + + assert not space.contains(-1) + assert not space.contains(3) + assert not space.contains("a") + assert not space.contains(1.5) + + action = to_action(1) + assert len(action.choice) == 1 + assert action.choice[0].named_discrete_value_index == 1 + + action = to_action(2) + assert len(action.choice) == 1 + assert action.choice[0].named_discrete_value_index == 2 + + with pytest.raises(TypeError): + to_action(1.5) + + with pytest.raises(TypeError): + to_action("abc") + + +def test_proto_to_action_space_commandline(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="unnamed", + named_discrete_space=NamedDiscreteSpace( + value=["a", "b", "c"], is_commandline=True + ), + ) + ], + ) + ) + + assert isinstance(space, Commandline) + assert space.name == "test" + assert space.contains(0) + assert space.contains(1) + assert space.contains(2) + + assert not space.contains(-1) + assert not space.contains(3) + assert not space.contains("a") + assert not space.contains(1.5) + + action = to_action(1) + assert len(action.choice) == 1 + assert action.choice[0].named_discrete_value_index == 1 + + action = to_action(2) + assert len(action.choice) == 1 + assert action.choice[0].named_discrete_value_index == 2 + + with pytest.raises(TypeError): + to_action(2.5) + + with pytest.raises(TypeError): + to_action("abc") + + +def test_proto_to_action_space_tuple_int_choices(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="a", + int64_range=ScalarRange( + min=ScalarLimit(value=-1), max=ScalarLimit(value=1) + ), + ), + ChoiceSpace( + name="b", + int64_range=ScalarRange( + min=ScalarLimit(value=0), max=ScalarLimit(value=2) + ), + ), + ], + ) + ) + + assert isinstance(space, Tuple) + assert space.name == "test" + + assert len(space.spaces) == 2 + assert isinstance(space.spaces[0], Scalar) + assert isinstance(space.spaces[1], Discrete) + + assert space.contains((1, 0)) + assert space.contains((-1, 1)) + + assert not space.contains((2, 0)) + assert not space.contains((-2, 0)) + assert not space.contains(2) + assert not space.contains("abc") + assert not space.contains(1.5) + + action = to_action((1, 0)) + assert len(action.choice) == 2 + assert action.choice[0].int64_value == 1 + assert action.choice[1].int64_value == 0 + + with pytest.raises(TypeError): + to_action(1) + + with pytest.raises(TypeError): + to_action("abs") + + +def test_proto_to_action_space_dict_int_choices(): + space, to_action = py_converters.proto_to_action_space( + ActionSpace( + name="test", + choice=[ + ChoiceSpace( + name="a", + int64_range=ScalarRange( + min=ScalarLimit(value=-1), max=ScalarLimit(value=1) + ), + ), + ChoiceSpace( + name="b", + int64_range=ScalarRange( + min=ScalarLimit(value=0), max=ScalarLimit(value=2) + ), + ), + ], + named_choices=True, + ) + ) + + assert isinstance(space, Dict) + assert space.name == "test" + + assert len(space.spaces) == 2 + assert isinstance(space.spaces["a"], Scalar) + assert isinstance(space.spaces["b"], Discrete) + + assert space.contains({"a": 1, "b": 0}) + + assert not space.contains({"a": 2, "b": 0}) + assert not space.contains({"a": -2, "b": 0}) + assert not space.contains((1, 0)) + assert not space.contains("ab") + + action = to_action({"a": 1, "b": 0}) + assert len(action.choice) == 2 + assert action.choice[0].int64_value == 1 + assert action.choice[1].int64_value == 0 + + with pytest.raises(TypeError): + to_action(1) + + with pytest.raises(TypeError): + to_action("abs") + + +if __name__ == "__main__": + main() From 9333f938847fc78e91dd32c9dfe7f43aa6dd9c53 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 15:50:41 +0100 Subject: [PATCH 020/254] [docs] Add runtime docs to the sphinx site. --- .../service/runtime/compiler_gym_service.py | 8 ++++ .../cc/compiler_gym/service/runtime.rst | 21 +++++----- docs/source/compiler_gym/service.rst | 4 ++ docs/source/compiler_gym/service/runtime.rst | 39 +++++++++++++++++++ docs/source/index.rst | 1 + docs/source/rpc.rst | 23 +++++------ 6 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 docs/source/compiler_gym/service/runtime.rst diff --git a/compiler_gym/service/runtime/compiler_gym_service.py b/compiler_gym/service/runtime/compiler_gym_service.py index fc58ab184..9fb507b97 100644 --- a/compiler_gym/service/runtime/compiler_gym_service.py +++ b/compiler_gym/service/runtime/compiler_gym_service.py @@ -63,6 +63,14 @@ def handle_exception_as(exception, code): class CompilerGymService(CompilerGymServiceServicerStub): # pragma: no cover def __init__(self, working_directory: Path, compilation_session_type): + """Constructor. + + :param working_directory: The working directory for this service. + + :param compilation_session_type: The :class:`CompilationSession + ` type that this service + implements. + """ self.working_directory = working_directory self.benchmarks = BenchmarkCache() diff --git a/docs/source/cc/compiler_gym/service/runtime.rst b/docs/source/cc/compiler_gym/service/runtime.rst index c032821e0..492b99d25 100644 --- a/docs/source/cc/compiler_gym/service/runtime.rst +++ b/docs/source/cc/compiler_gym/service/runtime.rst @@ -6,7 +6,7 @@ This directory contains the CompilerGym runtime that takes a that can be used by the Python frontend. .. contents:: -:local: + :local: Runtime.h --------- @@ -15,17 +15,18 @@ Runtime.h .. doxygenfile:: compiler_gym/service/runtime/Runtime.h -.. - CompilerGymService.h - -------------------- - :code:`#include "compiler_gym/service/runtime/CompilerGymService.h"` +CompilerGymService.h +-------------------- - .. doxygenfile:: compiler_gym/service/runtime/CompilerGymService.h +:code:`#include "compiler_gym/service/runtime/CompilerGymService.h"` - BenchmarkCache.h - ---------------- +.. doxygenfile:: compiler_gym/service/runtime/CompilerGymService.h - :code:`#include "compiler_gym/service/runtime/BenchmarkCache.h"` - .. doxygenfile:: compiler_gym/service/runtime/BenchmarkCache.h +BenchmarkCache.h +---------------- + +:code:`#include "compiler_gym/service/runtime/BenchmarkCache.h"` + +.. doxygenfile:: compiler_gym/service/runtime/BenchmarkCache.h diff --git a/docs/source/compiler_gym/service.rst b/docs/source/compiler_gym/service.rst index 3c89bc1fb..bdb8635b8 100644 --- a/docs/source/compiler_gym/service.rst +++ b/docs/source/compiler_gym/service.rst @@ -13,6 +13,10 @@ client and service is managed by the :class:`CompilerGymServiceConnection .. contents:: Document contents: :local: + +The CompilationSession Interface +-------------------------------- + .. autoclass:: CompilationSession :members: diff --git a/docs/source/compiler_gym/service/runtime.rst b/docs/source/compiler_gym/service/runtime.rst new file mode 100644 index 000000000..a3d0a30f6 --- /dev/null +++ b/docs/source/compiler_gym/service/runtime.rst @@ -0,0 +1,39 @@ +compiler_gym.service.runtime +============================ + +.. currentmodule:: compiler_gym.service.runtime + +CompilerGym uses a client/server architecture. Services provide an interface for +manipulating compiler behavior. Clients are Python frontend objects that provide +a reinforcement learning abstraction on top of the service. Communication +between the service and client is done :doc:`using RPC `. The connection between the +client and service is managed by the :class:`CompilerGymServiceConnection +` object. + +.. contents:: Document contents: + :local: + + +Common Runtime +-------------- + +.. automodule:: compiler_gym.service.runtime + :members: + + +CompilerGymService +------------------ + +.. autoclass:: compiler_gym.service.runtime.compiler_gym_service.CompilerGymService + :members: + + .. automethod:: __init__ + + +BenchmarkCache +-------------- + +.. autoclass:: compiler_gym.service.runtime.benchmark_cache.BenchmarkCache + :members: + + .. automethod:: __init__ diff --git a/docs/source/index.rst b/docs/source/index.rst index be5b60ca1..3da3ebe9c 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -42,6 +42,7 @@ for applying reinforcement learning to compiler optimizations. llvm/api compiler_gym/leaderboard compiler_gym/service + compiler_gym/service/runtime compiler_gym/spaces compiler_gym/views compiler_gym/wrappers diff --git a/docs/source/rpc.rst b/docs/source/rpc.rst index 0f6c55b51..f86b78940 100644 --- a/docs/source/rpc.rst +++ b/docs/source/rpc.rst @@ -19,21 +19,15 @@ an interactive environment. The service is defined using `gRPC `_, and the individual requests and responses are defined using `protocol buffers `_. The protocol buffer schema is then used to generate bindings in a programming -language of choice. Protocol buffers support a wide range of programming -languages, allowing compiler developers to expose their optimization problems in -whatever language makes sense for them. +language of choice. -To use the service from C++, include the generated protocol buffer header: - -.. code-block:: c++ - - #include "compiler_gym/service/proto/compiler_gym_service.pb.h" - -To use the service from Python, import the generated protocol buffer module: - -.. code-block:: python - - import compiler_gym.service.proto +Protocol buffers support a wide range of programming languages, allowing +compiler developers to expose their optimization problems in whatever language +makes sense for them. For Python and C++ we also provide a common runtime that +offers a higher level of abstraction and takes care of much of the boilerplate +required for RPC communication. For further details check out the :ref:`C++ +` or :class:`Python class +` documentation. CompilerGymService @@ -42,6 +36,7 @@ CompilerGymService .. doxygennamespace:: CompilerGymService + Request and Reply Messages -------------------------- From 8c03b20dde49783cfdf69cdaa2663d09552c821d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 15:51:51 +0100 Subject: [PATCH 021/254] [docs] Small wording change. --- compiler_gym/envs/compiler_env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/envs/compiler_env.py b/compiler_gym/envs/compiler_env.py index fc0c20d08..99bbca777 100644 --- a/compiler_gym/envs/compiler_env.py +++ b/compiler_gym/envs/compiler_env.py @@ -162,7 +162,7 @@ def __init__( service_connection: Optional[CompilerGymServiceConnection] = None, logger: Optional[logging.Logger] = None, ): - """Construct and initialize a CompilerGym service environment. + """Construct and initialize a CompilerGym environment. In normal use you should use :code:`gym.make(...)` rather than calling the constructor directly. From 7c85f3d9535634f6c6d60e5ee5b5c753e19ebdb2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 15:57:36 +0100 Subject: [PATCH 022/254] [docs] Document all protocol buffers. --- .../service/proto/compiler_gym_service.proto | 3 + docs/source/rpc.rst | 61 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/compiler_gym/service/proto/compiler_gym_service.proto b/compiler_gym/service/proto/compiler_gym_service.proto index 0129a0f8d..53cc59a5d 100644 --- a/compiler_gym/service/proto/compiler_gym_service.proto +++ b/compiler_gym/service/proto/compiler_gym_service.proto @@ -359,6 +359,7 @@ message File { // An AddBenchmark() request. message AddBenchmarkRequest { + // A list of benchmarks to add. repeated Benchmark benchmark = 1; } @@ -367,7 +368,9 @@ message AddBenchmarkReply {} // An arbitrary string parameter value for a session. message SessionParameter { + // A string key. string key = 1; + // A string value. string value = 2; } diff --git a/docs/source/rpc.rst b/docs/source/rpc.rst index f86b78940..4877efa98 100644 --- a/docs/source/rpc.rst +++ b/docs/source/rpc.rst @@ -82,5 +82,66 @@ Request and Reply Messages .. doxygenstruct:: AddBenchmarkReply :members: +.. doxygenstruct:: SendSessionParameterRequest + :members: + +.. doxygenstruct:: SendSessionParameterReply + :members: + + +Core Message Types +------------------ + +.. doxygenstruct:: ActionSpace + :members: + +.. doxygenstruct:: Action + :members: + +.. doxygenstruct:: ChoiceSpace + :members: + +.. doxygenstruct:: Choice + :members: + +.. doxygenstruct:: ObservationSpace + :members: + +.. doxygenstruct:: Observation + :members: + +.. doxygenstruct:: NamedDiscreteSpace + :members: + +.. doxygenstruct:: Int64List + :members: + +.. doxygenstruct:: DoubleList + :members: + +.. doxygenstruct:: ScalarRange + :members: + +.. doxygenstruct:: ScalarLimit + :members: + +.. doxygenstruct:: ScalarRangeList + :members: + +.. doxygenstruct:: SequenceSpace + :members: + +.. doxygenstruct:: Benchmark + :members: + +.. doxygenstruct:: File + :members: + +.. doxygenstruct:: BenchmarkDynamicConfig + :members: + .. doxygenstruct:: Command :members: + +.. doxygenstruct:: SessionParameter + :members: From 5abf1b03bd7cd9f767361609a4002fe948ae7548 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 15:59:50 +0100 Subject: [PATCH 023/254] Reference github issue in TODO note. Issue #381. --- compiler_gym/spaces/reward.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler_gym/spaces/reward.py b/compiler_gym/spaces/reward.py index fe0f8baa6..5bc85af96 100644 --- a/compiler_gym/spaces/reward.py +++ b/compiler_gym/spaces/reward.py @@ -38,8 +38,8 @@ class Reward(Scalar): def __init__( self, - # TODO(cummins): Rename `id` to `name` for consistency with the other - # space classes. + # TODO(github.com/facebookresearch/CompilerGym/issues/381): Rename `id` + # to `name` for consistency with the other space classes. id: str, observation_spaces: Optional[List[str]] = None, default_value: RewardType = 0, From 0213882eb930b2eb8df342e92185d1f3213d3567 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 16:00:11 +0100 Subject: [PATCH 024/254] [llvm] Improve error message when invalid choice count received. --- compiler_gym/envs/llvm/service/LlvmSession.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler_gym/envs/llvm/service/LlvmSession.cc b/compiler_gym/envs/llvm/service/LlvmSession.cc index 6748024dd..4bf2778bd 100644 --- a/compiler_gym/envs/llvm/service/LlvmSession.cc +++ b/compiler_gym/envs/llvm/service/LlvmSession.cc @@ -123,7 +123,9 @@ Status LlvmSession::applyAction(const Action& action, bool& endOfEpisode, case LlvmActionSpace::PASSES_ALL: LlvmAction actionEnum; if (action.choice_size() != 1) { - return Status(StatusCode::INVALID_ARGUMENT, "Missing choice"); + return Status( + StatusCode::INVALID_ARGUMENT, + fmt::format("Invalid choice count. Expected 1, received {}", action.choice_size())); } RETURN_IF_ERROR(util::intToEnum(action.choice(0).named_discrete_value_index(), &actionEnum)); RETURN_IF_ERROR(applyPassAction(actionEnum, actionHadNoEffect)); From 849aff2db1112f95bdf84d801629fe74ea2e4397 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 8 Sep 2021 16:09:52 +0100 Subject: [PATCH 025/254] Fix typo in docstrings. --- .../example_compiler_gym_service/service_cc/ExampleService.cc | 2 +- .../example_compiler_gym_service/service_py/example_service.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_compiler_gym_service/service_cc/ExampleService.cc b/examples/example_compiler_gym_service/service_cc/ExampleService.cc index 0e85a922c..a3b028faf 100644 --- a/examples/example_compiler_gym_service/service_cc/ExampleService.cc +++ b/examples/example_compiler_gym_service/service_cc/ExampleService.cc @@ -33,7 +33,7 @@ class ExampleCompilationSession final : public CompilationSession { std::string getCompilerVersion() const final override { return "1.0.0"; } std::vector getActionSpaces() const final override { - // The acction spaces supported by this service. Here we will implement a + // The action spaces supported by this service. Here we will implement a // single action space, called "default", that represents a command line // with three options: "a", "b", and "c". ActionSpace space; diff --git a/examples/example_compiler_gym_service/service_py/example_service.py b/examples/example_compiler_gym_service/service_py/example_service.py index e5536e24a..b56cdcc60 100755 --- a/examples/example_compiler_gym_service/service_py/example_service.py +++ b/examples/example_compiler_gym_service/service_py/example_service.py @@ -30,7 +30,7 @@ class ExampleCompilationSession(CompilationSession): compiler_version: str = "1.0.0" - # The acction spaces supported by this service. Here we will implement a + # The action spaces supported by this service. Here we will implement a # single action space, called "default", that represents a command line with # three options: "a", "b", and "c". action_spaces = [ From 8f1dedcfb1d1abf0742e18251a92e3041c48b37a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 16 Sep 2021 17:55:11 +0100 Subject: [PATCH 026/254] Add a clarifying comment. --- compiler_gym/service/proto/py_converters.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compiler_gym/service/proto/py_converters.py b/compiler_gym/service/proto/py_converters.py index c63657e9d..882f73308 100644 --- a/compiler_gym/service/proto/py_converters.py +++ b/compiler_gym/service/proto/py_converters.py @@ -99,6 +99,10 @@ def proto_to_choice_space(choice: ChoiceSpace) -> PyChoiceSpace: """ choice_type = choice.WhichOneof("space") if choice_type == "int64_range": + # The Discrete class defines a discrete space as integers in the range + # [0,n]. For spaces that aren't zero-based there is a Scalar class. + # Prefer Discrete if possible since it is part of the core gym library, + # else fallback to Scalar. if choice.int64_range.min.value: return PyChoiceSpace( space=Scalar( From ddede47063d4a5917ba6af7b38accd3c88adf2ec Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 16 Sep 2021 20:10:08 +0100 Subject: [PATCH 027/254] Small refactor to remove duplicate strings. --- compiler_gym/envs/llvm/llvm_env.py | 51 +++++++++--------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index 8bc5a4e6a..efb5f8669 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -159,43 +159,22 @@ def __init__( self.inst2vec = _INST2VEC_ENCODER + cpu_info_spaces = [ + Sequence(name="name", size_range=(0, None), dtype=str), + Scalar(name="cores_count", min=None, max=None, dtype=int), + Scalar(name="l1i_cache_size", min=None, max=None, dtype=int), + Scalar(name="l1i_cache_count", min=None, max=None, dtype=int), + Scalar(name="l1d_cache_size", min=None, max=None, dtype=int), + Scalar(name="l1d_cache_count", min=None, max=None, dtype=int), + Scalar(name="l2_cache_size", min=None, max=None, dtype=int), + Scalar(name="l2_cache_count", min=None, max=None, dtype=int), + Scalar(name="l3_cache_size", min=None, max=None, dtype=int), + Scalar(name="l3_cache_count", min=None, max=None, dtype=int), + Scalar(name="l4_cache_size", min=None, max=None, dtype=int), + Scalar(name="l4_cache_count", min=None, max=None, dtype=int), + ] self.observation.spaces["CpuInfo"].space = DictSpace( - { - "name": Sequence(name="name", size_range=(0, None), dtype=str), - "cores_count": Scalar( - name="cores_count", min=None, max=None, dtype=int - ), - "l1i_cache_size": Scalar( - name="l1i_cache_size", min=None, max=None, dtype=int - ), - "l1i_cache_count": Scalar( - name="l1i_cache_count", min=None, max=None, dtype=int - ), - "l1d_cache_size": Scalar( - name="l1d_cache_size", min=None, max=None, dtype=int - ), - "l1d_cache_count": Scalar( - name="l1d_cache_count", min=None, max=None, dtype=int - ), - "l2_cache_size": Scalar( - name="l2_cache_size", min=None, max=None, dtype=int - ), - "l2_cache_count": Scalar( - name="l2_cache_count", min=None, max=None, dtype=int - ), - "l3_cache_size": Scalar( - name="l3_cache_size", min=None, max=None, dtype=int - ), - "l3_cache_count": Scalar( - name="l3_cache_count", min=None, max=None, dtype=int - ), - "l4_cache_size": Scalar( - name="l4_cache_size", min=None, max=None, dtype=int - ), - "l4_cache_count": Scalar( - name="l4_cache_count", min=None, max=None, dtype=int - ), - }, + {space.name: space for space in cpu_info_spaces}, name="CpuInfo", ) From ee5e5fa707ea9170afcb410999e50bc172af81c3 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 17 Sep 2021 10:02:36 +0100 Subject: [PATCH 028/254] [gcc] Update action space to the new schema. Issue #383, #52. --- compiler_gym/envs/gcc/service/BUILD | 1 - compiler_gym/envs/gcc/service/gcc_service.py | 34 ++++++++++++++++---- tests/gcc/gcc_env_test.py | 7 ++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/compiler_gym/envs/gcc/service/BUILD b/compiler_gym/envs/gcc/service/BUILD index 94eefdaf6..78dc0a2b9 100644 --- a/compiler_gym/envs/gcc/service/BUILD +++ b/compiler_gym/envs/gcc/service/BUILD @@ -2,7 +2,6 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") filegroup( name = "service", diff --git a/compiler_gym/envs/gcc/service/gcc_service.py b/compiler_gym/envs/gcc/service/gcc_service.py index 6320a0f20..b4db8ef4d 100755 --- a/compiler_gym/envs/gcc/service/gcc_service.py +++ b/compiler_gym/envs/gcc/service/gcc_service.py @@ -19,10 +19,12 @@ from compiler_gym.envs.gcc import Gcc, Option from compiler_gym.service import CompilationSession -from compiler_gym.service.proto import Action as ProtoAction +from compiler_gym.service.proto import Action as ActionProto from compiler_gym.service.proto import ( ActionSpace, Benchmark, + ChoiceSpace, + NamedDiscreteSpace, Observation, ObservationSpace, ScalarLimit, @@ -64,7 +66,19 @@ def make_gcc_compilation_session(gcc_bin: str): actions.append(IncrAction(option, i, 1000)) actions.append(IncrAction(option, i, -1000)) - action_spaces_ = [ActionSpace(name="default", action=list(map(str, actions)))] + action_spaces_ = [ + ActionSpace( + name="default", + choice=[ + ChoiceSpace( + name="default", + named_discrete_space=NamedDiscreteSpace( + value=[str(a) for a in actions] + ), + ) + ], + ) + ] observation_spaces_ = [ # A string of the source code @@ -215,6 +229,10 @@ def __init__( # initialised lazily self._choices = None + @property + def num_actions(self) -> int: + return len(self.action_spaces[0].choice[0].named_discrete_space.value) + @property def choices(self) -> List[int]: if self._choices is None: @@ -451,16 +469,18 @@ def reset_cached(self): self._asm_hash = None def apply_action( - self, proto_action: ProtoAction + self, action_proto: ActionProto ) -> Tuple[bool, Optional[ActionSpace], bool]: """Apply an action.""" - if proto_action.action < 0 or proto_action.action > len( - self.action_spaces[0].action - ): + if len(action_proto.choice) != 1: + raise ValueError("Invalid choice count") + + choice_index = action_proto.choice[0].named_discrete_value_index + if choice_index < 0 or choice_index >= self.num_actions: raise ValueError("Out-of-range") # Get the action - action = actions[proto_action.action] + action = actions[choice_index] # Apply the action to this session and check if we changed anything old_choices = self.choices.copy() action(self) diff --git a/tests/gcc/gcc_env_test.py b/tests/gcc/gcc_env_test.py index 87a88aba4..3f457565b 100644 --- a/tests/gcc/gcc_env_test.py +++ b/tests/gcc/gcc_env_test.py @@ -53,10 +53,10 @@ def test_observation_spaces(gcc_bin: str): "source", } assert env.observation.spaces["obj_size"].space == Scalar( - min=-1, max=np.iinfo(np.int64).max, dtype=int + name="obj_size", min=-1, max=np.iinfo(np.int64).max, dtype=int ) assert env.observation.spaces["asm"].space == Sequence( - size_range=(0, None), dtype=str, opaque_data_format="" + name="asm", size_range=(0, None), dtype=str, opaque_data_format="" ) @@ -129,7 +129,8 @@ def test_double_reset(gcc_bin: str): assert env.in_episode env.step(env.action_space.sample()) env.reset() - env.step(env.action_space.sample()) + _, _, done, info = env.step(env.action_space.sample()) + assert not done, info assert env.in_episode From ce36e970d95bb3f32611745d28a724a72b48963c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 17 Sep 2021 10:39:43 +0100 Subject: [PATCH 029/254] Clarify error message. --- .../example_compiler_gym_service/service_py/example_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/example_compiler_gym_service/service_py/example_service.py b/examples/example_compiler_gym_service/service_py/example_service.py index b56cdcc60..0558c8e68 100755 --- a/examples/example_compiler_gym_service/service_py/example_service.py +++ b/examples/example_compiler_gym_service/service_py/example_service.py @@ -98,7 +98,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo num_choices = len(self.action_spaces[0].choice[0].named_discrete_space.value) if len(action.choice) != 1: - raise ValueError("Missing choice") + raise ValueError("Invalid choice count") # This is the index into the action space's values ("a", "b", "c") that # the user selected, e.g. 0 -> "a", 1 -> "b", 2 -> "c". From 4f2ff3a2273e9919320e0fdd9a21f955edf08994 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 22:17:57 +0100 Subject: [PATCH 030/254] [loop_tool] Port to the new action space schema. Issue #52. --- .../service/loop_tool_compilation_session.py | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py b/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py index d4066edc1..a794077b6 100644 --- a/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py +++ b/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py @@ -18,7 +18,9 @@ Action, ActionSpace, Benchmark, + ChoiceSpace, Int64List, + NamedDiscreteSpace, Observation, ObservationSpace, ScalarLimit, @@ -37,12 +39,26 @@ class LoopToolCompilationSession(CompilationSession): ActionSpace( # shift around a single pre-split order, changing the size of splits name="simple", - action=["toggle_mode", "up", "down", "toggle_thread"], + choice=[ + ChoiceSpace( + name="controls", + named_discrete_space=NamedDiscreteSpace( + value=["toggle_mode", "up", "down", "toggle_thread"], + ), + ) + ], ), ActionSpace( # potentially define new splits name="split", - action=["toggle_mode", "up", "down", "toggle_thread", "split"], + choice=[ + ChoiceSpace( + name="controls", + named_discrete_space=NamedDiscreteSpace( + value=["toggle_mode", "up", "down", "toggle_thread", "split"], + ), + ) + ], ), ] @@ -87,6 +103,7 @@ def __init__( self, working_directory: Path, action_space: ActionSpace, benchmark: Benchmark ): super().__init__(working_directory, action_space, benchmark) + self.action_space = action_space if "cuda" in benchmark.uri: self.backend = "cuda" lt.set_default_hardware("cuda") @@ -193,10 +210,18 @@ def lam(v, x): ), f"{end_size} != {self.size} ({a}, {b}), ({x}, {y}) -> ({a_}, {b_}), ({x + increment}, 0)" def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: - logging.info("Applied action %d", action.action) - if action.action < 0 or action.action > len(self.action_spaces[0].action): + if len(action.choice) != 1: + raise ValueError("Invalid choice count") + + choice_index = action.choice[0].named_discrete_value_index + if choice_index < 0 or choice_index >= len( + self.action_space.choice[0].named_discrete_space.value + ): raise ValueError("Out-of-range") - act = self.action_spaces[0].action[action.action] + + logging.info("Applied action %d", choice_index) + + act = self.action_space.choice[0].named_discrete_space.value[choice_index] if self.mode not in ["size", "select"]: raise RuntimeError("Invalid mode set: {}".format(self.mode)) if act == "toggle_mode": From 4d9c531df15b1569681203397ba379fa3d40856e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 22:38:31 +0100 Subject: [PATCH 031/254] [ci] Add a CI job to build the nodejs frontend. --- .github/workflows/ci.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4b6a4b556..4ca3263b8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -595,3 +595,26 @@ jobs: ASAN_OPTIONS: detect_leaks=1 CC: clang CXX: clang++ + + www-build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + node: [16] + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: npm + cache-dependency-path: www/frontends/compiler_gym/package-lock.json + + - name: Build web frontend + run: make www-build From 6c0345aa30df4042ae18149513e0138de5bef2c9 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 22:50:51 +0100 Subject: [PATCH 032/254] Remove redundant module imports. --- tests/llvm/observation_spaces_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index bacda20e7..b68998f55 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -11,8 +11,6 @@ import numpy as np import pytest from flaky import flaky -from gym.spaces import Box -from gym.spaces import Dict as DictSpace from compiler_gym.envs.llvm.llvm_env import LlvmEnv from compiler_gym.spaces import Box From 05efdec7caaa729db2f8b7823fb42b99f9d42585 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 30 Sep 2021 12:19:45 +0100 Subject: [PATCH 033/254] [www] Update node package dependencies. --- www/frontends/compiler_gym/package-lock.json | 49786 ++++++++++------- www/frontends/compiler_gym/package.json | 2 +- 2 files changed, 29209 insertions(+), 20579 deletions(-) diff --git a/www/frontends/compiler_gym/package-lock.json b/www/frontends/compiler_gym/package-lock.json index 239ffe822..baa455781 100644 --- a/www/frontends/compiler_gym/package-lock.json +++ b/www/frontends/compiler_gym/package-lock.json @@ -23,7 +23,7 @@ "react-dom": "^17.0.2", "react-highlight": "^0.14.0", "react-router-dom": "^5.2.0", - "react-scripts": "^1.1.5", + "react-scripts": "^4.0.3", "web-vitals": "^1.1.2" } }, @@ -38,4796 +38,5066 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "node_modules/@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==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@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==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "node_modules/@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "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" }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "dependencies": { - "regenerator-runtime": "^0.13.4" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", - "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "node_modules/@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dependencies": { - "core-js-pure": "^3.15.0", - "regenerator-runtime": "^0.13.4" + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bkrem/react-transition-group": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.1.tgz", - "integrity": "sha512-AJBMFURKY6VcenLCb2RTRivIy3Yy/JOUWHt3XjL4lDqCzdOryWxaa4HCIUWlhvn462p/gV9QbEihKmNZfvwDKA==", - "dependencies": { - "chain-function": "^1.0.0", - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.6", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" - } - }, - "node_modules/@bkrem/react-transition-group/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/@bkrem/react-transition-group/node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", "dependencies": { - "loose-envify": "^1.0.0" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/types/node_modules/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==", + "node_modules/@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==", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/types/node_modules/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==" + "node_modules/@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==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@jest/types/node_modules/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==", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@popperjs/core": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", - "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" - }, - "node_modules/@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" - }, - "node_modules/@restart/hooks": { - "version": "0.3.27", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", - "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dependencies": { - "dequal": "^2.0.2" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", - "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dependencies": { - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^4.2.2", - "chalk": "^3.0.0", - "css": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/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==", + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dependencies": { - "color-name": "~1.1.4" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/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==" - }, - "node_modules/@testing-library/jest-dom/node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@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==", "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/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==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", - "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^7.28.1" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "7.31.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", - "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "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": "^26.6.2" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/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==", + "node_modules/@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==", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@testing-library/react/node_modules/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==" - }, - "node_modules/@testing-library/react/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@testing-library/react/node_modules/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==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", "dependencies": { - "@babel/runtime": "^7.12.5" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@testing-library/user-event/node_modules/@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "node_modules/@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==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@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==" - }, - "node_modules/@types/d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" - }, - "node_modules/@types/invariant": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", - "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" - }, - "node_modules/@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==" - }, - "node_modules/@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==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@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==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", "dependencies": { - "@types/istanbul-lib-report": "*" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "node_modules/@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==", "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" - }, - "node_modules/@types/node": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.1.tgz", - "integrity": "sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "node_modules/@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==" - }, - "node_modules/@types/react": { - "version": "17.0.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", - "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==", + "node_modules/@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==", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", + "node_modules/@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==", "dependencies": { - "@types/react": "*" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", - "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", + "node_modules/@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==", "dependencies": { - "@types/jest": "*" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, - "node_modules/@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "node_modules/@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==", "dependencies": { - "@types/yargs-parser": "*" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" - }, - "node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "node_modules/@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==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "node_modules/@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==", "dependencies": { - "acorn": "^4.0.3" - } - }, - "node_modules/acorn-dynamic-import/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "bin": { - "acorn": "bin/acorn" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "node_modules/@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==", "dependencies": { - "acorn": "^4.0.4" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "bin": { - "acorn": "bin/acorn" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "node_modules/@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==", "dependencies": { - "acorn": "^3.0.4" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-jsx/node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "bin": { - "acorn": "bin/acorn" + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==", + "node_modules/@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==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">= 0.12.0" + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@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==", "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" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "@babel/core": "^7.0.0-0" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/@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==", "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/align-text/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/@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==", "dependencies": { - "is-buffer": "^1.1.5" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.4.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "node_modules/@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==", "dependencies": { - "string-width": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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==", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@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==", "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "node_modules/@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==", "dependencies": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "node_modules/@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==", "dependencies": { - "default-require-extensions": "^1.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/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==", + "node_modules/@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==", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@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==", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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==", + "node_modules/@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==", "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "node_modules/@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==", "dependencies": { - "arr-flatten": "^1.0.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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==", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "node_modules/array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/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==", + "node_modules/@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==", "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" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "node_modules/array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "node_modules/@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==", "dependencies": { - "array-uniq": "^1.0.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "node_modules/@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==", "dependencies": { - "safer-buffer": "~2.1.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "node_modules/@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==", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asn1.js/node_modules/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==" - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "node_modules/@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==", "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "node_modules/@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==", "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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=" - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/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==" - }, - "node_modules/async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "engines": { - "node": "*" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">= 4.5.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/autoprefixer": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", - "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", + "node_modules/@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==", "dependencies": { - "browserslist": "^2.5.1", - "caniuse-lite": "^1.0.30000748", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "node_modules/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=", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/axobject-query": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "node_modules/@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==", "dependencies": { - "ast-types-flow": "0.0.7" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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=", + "node_modules/@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==", "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", "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" + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", "dependencies": { - "ansi-regex": "^2.0.0" + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/@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==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "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.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "node_modules/@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==", "dependencies": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/@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==", "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/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "node_modules/@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==", "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "node_modules/@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==", "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "node_modules/@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==", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "node_modules/@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==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "node_modules/@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==", "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "node_modules/@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==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "node_modules/@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==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "node_modules/@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==", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "node_modules/@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==", "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-jest": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", - "dependencies": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^20.0.3" + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "node_modules/@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==", "dependencies": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { - "babel-core": "6 || 7 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0-rc", - "webpack": "2 || 3" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dependencies": { - "babel-runtime": "^6.22.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "node_modules/@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==", "dependencies": { - "babel-runtime": "^6.22.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", - "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", + "node_modules/@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==", "dependencies": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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==", + "node_modules/@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==", "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/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/@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==", "dependencies": { - "locate-path": "^2.0.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/@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==", "dependencies": { - "p-try": "^1.0.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/@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==", "dependencies": { - "p-limit": "^1.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@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.15.6", + "@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.15.4", + "@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.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@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.15.4", + "@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.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@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.15.4", + "@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.6", + "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" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", - "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" - }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "node_modules/babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "node_modules/babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "node_modules/babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "node_modules/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=" - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "node_modules/@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==", "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "node_modules/@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==", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "node_modules/@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", "dependencies": { - "babel-runtime": "^6.22.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "node_modules/@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "dependencies": { - "babel-runtime": "^6.22.0" + "regenerator-runtime": "^0.13.4" } }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "node_modules/@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dependencies": { - "babel-runtime": "^6.22.0" + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "node_modules/@bkrem/react-transition-group": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.1.tgz", + "integrity": "sha512-AJBMFURKY6VcenLCb2RTRivIy3Yy/JOUWHt3XjL4lDqCzdOryWxaa4HCIUWlhvn462p/gV9QbEihKmNZfvwDKA==", "dependencies": { - "babel-runtime": "^6.22.0" + "chain-function": "^1.0.0", + "dom-helpers": "^3.3.1", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.6", + "react-lifecycles-compat": "^3.0.4", + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "node_modules/@bkrem/react-transition-group/node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "@babel/runtime": "^7.1.2" } }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "node_modules/@bkrem/react-transition-group/node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "dependencies": { - "babel-runtime": "^6.22.0" + "loose-envify": "^1.0.0" } }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" } }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "node_modules/@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==", + "engines": { + "node": ">=4.0.0" } }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "node_modules/@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" } }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dependencies": { - "babel-runtime": "^6.22.0" - } + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dependencies": { - "babel-runtime": "^6.22.0" - } + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dependencies": { - "babel-runtime": "^6.22.0" - } + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" } }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "@hapi/hoek": "^8.3.0" } }, - "node_modules/babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dependencies": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/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=", - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" }, - "node_modules/babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dependencies": { - "babel-runtime": "^6.22.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dependencies": { - "babel-runtime": "^6.22.0" + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" } }, - "node_modules/babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dependencies": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dependencies": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "regenerator-transform": "^0.10.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "node_modules/@jest/console/node_modules/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==", "dependencies": { - "babel-runtime": "^6.22.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/@jest/console/node_modules/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==" }, - "node_modules/babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "node_modules/babel-preset-env/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "node_modules/@jest/console/node_modules/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==", "dependencies": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-preset-jest": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", - "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dependencies": { - "babel-plugin-jest-hoist": "^20.0.3" + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz", - "integrity": "sha512-/sh5Qd5T08PYa6t4kuCdKh9tXp6/m/Jwyx7PJTqugsYMfsDUJMlBXOs5EwFODHprzjWrmQ0SydnMZu9FY4MZYg==", - "dependencies": { - "babel-plugin-dynamic-import-node": "1.1.0", - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-react-constant-elements": "6.23.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-plugin-transform-regenerator": "6.26.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-preset-react": "6.24.1" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "babel-runtime": "^6.23.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "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" + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/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=", + "node_modules/@jest/core/node_modules/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==", "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "node_modules/@jest/core/node_modules/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==" }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "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" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/@jest/core/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "bin": { - "babylon": "bin/babylon.js" + "node_modules/@jest/core/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/@jest/core/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "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" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/@jest/core/node_modules/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==", "dependencies": { - "is-descriptor": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/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==", - "dependencies": { - "kind-of": "^6.0.0" - }, + "node_modules/@jest/core/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/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==", + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dependencies": { - "kind-of": "^6.0.0" + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, "engines": { - "node": "*" + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" } }, - "node_modules/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, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/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, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "file-uri-to-path": "1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/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==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "node_modules/@jest/reporters/node_modules/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==", "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.8" + "node": ">=7.0.0" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "node_modules/@jest/reporters/node_modules/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==" + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/@jest/reporters/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "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" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/bootstrap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.2.tgz", - "integrity": "sha512-1Ge963tyEQWJJ+8qtXFU6wgmAVj9gweEjibUdbmcCEYsn38tVwRk8107rk2vzt6cfQcRr3SlZ8aQBqaD8aqf+Q==" - }, - "node_modules/bootstrap-icons": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.5.0.tgz", - "integrity": "sha512-44feMc7DE1Ccpsas/1wioN8ewFJNquvi5FewA06wLnqct7CwMdGDVy41ieHaacogzDqLfG8nADIvMNp9e4bfbA==", + "node_modules/@jest/reporters/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "node_modules/@jest/reporters/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@jest/reporters/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" } }, - "node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "node_modules/@jest/reporters/node_modules/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==", "dependencies": { - "resolve": "1.1.7" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + "node_modules/@jest/reporters/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "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" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/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==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "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" + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/browserify-sign/node_modules/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==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/browserify-sign/node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "pako": "~1.0.5" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "node_modules/@jest/transform/node_modules/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==", "dependencies": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "color-name": "~1.1.4" }, - "bin": { - "browserslist": "cli.js" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } + "node_modules/@jest/transform/node_modules/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==" }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/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==" - }, - "node_modules/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==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/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=" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "node_modules/@jest/transform/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "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" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/cache-base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "node_modules/@jest/types/node_modules/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==", "dependencies": { - "callsites": "^0.2.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/caller-path/node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@jest/types/node_modules/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==" }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "node_modules/@jest/types/node_modules/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==", "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/caniuse-api/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/caniuse-db": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001259.tgz", - "integrity": "sha512-DoMAaVY4zsMKnppJ0D+JBg5eZ30L4SUFKlRemv2xiybzPo1wY0fd4EyGeHUjNxZVcPLAKHz6XXMya3MId9bl5w==" - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", - "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=", + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">4.0" + "node": ">=10" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.x" + }, + "peerDependencies": { + "@types/webpack": "4.x", + "react-refresh": ">=0.8.3 <0.10.0", + "sockjs-client": "^1.4.0", + "type-fest": "^0.13.1", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } } }, - "node_modules/chain-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", - "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@popperjs/core": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", + "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "peerDependencies": { + "react": ">=16.3.2" + } + }, + "node_modules/@restart/hooks": { + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", + "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "dequal": "^2.0.2" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "node_modules/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, + "node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "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" + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 8.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "optional": true, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dependencies": { - "fill-range": "^7.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=8" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/chokidar/node_modules/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, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "type-detect": "4.0.8" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/chokidar/node_modules/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, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "ejs": "^2.6.1", + "magic-string": "^0.25.0" } }, - "node_modules/chokidar/node_modules/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, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/chokidar/node_modules/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, - "dependencies": { - "is-extglob": "^2.1.1" - }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/chokidar/node_modules/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, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/chokidar2": { - "resolved": "node_modules/watchpack/chokidar2", - "link": true - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "node_modules/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==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor." - }, - "node_modules/clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dependencies": { - "chalk": "^1.1.3" - }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/clap/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/clap/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/clap/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "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" + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/clap/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "dependencies": { - "ansi-regex": "^2.0.0" + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/clap/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/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==", + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/class-utils/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } }, - "node_modules/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==", + "node_modules/@testing-library/jest-dom": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", "dependencies": { - "source-map": "~0.6.0" + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" }, "engines": { - "node": ">= 4.0" + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/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=", + "node_modules/@testing-library/jest-dom/node_modules/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==", "dependencies": { - "restore-cursor": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + "node_modules/@testing-library/jest-dom/node_modules/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==" }, - "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "node_modules/@testing-library/jest-dom/node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/cliui/node_modules/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=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "node_modules/@testing-library/jest-dom/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/@testing-library/jest-dom/node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/@testing-library/jest-dom/node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "node_modules/@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=10" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "node_modules/@testing-library/react/node_modules/@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dependencies": { - "q": "^1.1.2" + "regenerator-runtime": "^0.13.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.9.0" } }, - "node_modules/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=", + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "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": "^26.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/@testing-library/react/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "node_modules/@testing-library/react/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dependencies": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "node_modules/@testing-library/react/node_modules/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==", "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/color/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.8" + "node": ">=7.0.0" } }, - "node_modules/colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dependencies": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } + "node_modules/@testing-library/react/node_modules/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==" }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "node_modules/@testing-library/react/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@testing-library/react/node_modules/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==", "dependencies": { - "delayed-stream": "~1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/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==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "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" + "node": ">=10", + "npm": ">=6" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "node_modules/@testing-library/user-event/node_modules/@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "regenerator-runtime": "^0.13.4" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/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==", + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "engines": { - "node": ">=0.8" + "node": ">= 6" } }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/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=" + "node_modules/@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==" }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "node_modules/@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "engines": { - "node": ">=0.10.0" + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/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==", - "engines": { - "node": ">= 0.6" + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dependencies": { + "@babel/types": "^7.3.0" } }, - "node_modules/content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" + "node_modules/@types/d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" }, - "node_modules/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==", + "node_modules/@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dependencies": { - "safe-buffer": "~5.1.1" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, - "node_modules/core-js-pure": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", - "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==" + "node_modules/@types/invariant": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", + "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" }, - "node_modules/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=" + "node_modules/@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==" }, - "node_modules/cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "node_modules/@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==", "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "engines": { - "node": ">=0.12" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/@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==", "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/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==", + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, - "node_modules/create-ecdh/node_modules/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==" + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" + }, + "node_modules/@types/node": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.1.tgz", + "integrity": "sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==" + }, + "node_modules/@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==" + }, + "node_modules/@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==" + }, + "node_modules/@types/react": { + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", + "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==", "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "node_modules/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==", + "node_modules/@types/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "@types/react": "*" } }, - "node_modules/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==", + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "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" + "@types/node": "*" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", + "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@types/jest": "*" } }, - "node_modules/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==", + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", "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" - }, - "engines": { - "node": "*" + "source-map": "^0.6.1" } }, - "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/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=", - "engines": { - "node": "*" + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, + "node_modules/@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" } }, - "node_modules/css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "dependencies": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "engines": { - "node": ">=0.12.0 || >=4.3.0 <5.0.0 || >=5.10" + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" } }, - "node_modules/css-loader/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/css-loader/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/css-loader/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "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" - }, - "engines": { - "node": ">=0.10.0" + "@types/yargs-parser": "*" } }, - "node_modules/css-loader/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, - "node_modules/css-loader/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz", + "integrity": "sha512-+OWTuWRSbWI1KDK8iEyG/6uK2rTm3kpS38wuVifGUTDB6kjEuNrzBI1MUtxnkneuWG/23QehABe2zHHrj+4yuA==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.32.0", + "@typescript-eslint/scope-manager": "4.32.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/css-loader/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.12" + "node": ">=10" } }, - "node_modules/css-loader/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz", + "integrity": "sha512-WLoXcc+cQufxRYjTWr4kFt0DyEv6hDgSaFqYhIzQZ05cF+kXfqXdUh+//kgquPJVUBbL3oQGKQxwPbLxHRqm6A==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.32.0", + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/typescript-estree": "4.32.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" } }, - "node_modules/css-loader/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/@typescript-eslint/parser": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.32.0.tgz", + "integrity": "sha512-lhtYqQ2iEPV5JqV7K+uOVlPePjClj4dOw7K4/Z1F2yvjIUvyr13yJnDzkK6uon4BjHYuHy3EG0c2Z9jEhFk56w==", "dependencies": { - "has-flag": "^1.0.0" + "@typescript-eslint/scope-manager": "4.32.0", + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/typescript-estree": "4.32.0", + "debug": "^4.3.1" }, "engines": { - "node": ">=0.8.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz", + "integrity": "sha512-DK+fMSHdM216C0OM/KR1lHXjP1CNtVIhJ54kQxfOE6x8UGFAjha8cXgDMBEIYS2XCYjjCtvTkjQYwL3uvGOo0w==", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/visitor-keys": "4.32.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/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==", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" + "node_modules/@typescript-eslint/types": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.32.0.tgz", + "integrity": "sha512-LE7Z7BAv0E2UvqzogssGf1x7GPpUalgG07nGCBYb1oK4mFsOiFC/VrSMKbZQzFJdN2JL5XYmsx7C7FX9p9ns0w==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz", + "integrity": "sha512-tRYCgJ3g1UjMw1cGG8Yn1KzOzNlQ6u1h9AmEtPhb5V5a1TmiHWcRyF/Ic+91M4f43QeChyYlVTcf3DvDTZR9vw==", + "dependencies": { + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/visitor-keys": "4.32.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">= 6" + "node": "^10.12.0 || >=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "cssesc": "bin/cssesc" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dependencies": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } - }, - "node_modules/cssnano/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/cssnano/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz", + "integrity": "sha512-e7NE0qz8W+atzv3Cy9qaQ7BTLwWsm084Z0c4nIO2l3Bp6u9WIgdqCgyPyV5oSPDMIW3b20H59OOCmVk3jw3Ptw==", + "dependencies": { + "@typescript-eslint/types": "4.32.0", + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cssnano/node_modules/autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dependencies": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "node_modules/cssnano/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" - } + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, - "node_modules/cssnano/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, - "node_modules/cssnano/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "node_modules/cssnano/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "engines": { - "node": ">=0.10.0" + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" } }, - "node_modules/cssnano/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" + "@webassemblyjs/ast": "1.9.0" } }, - "node_modules/cssnano/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "node_modules/cssnano/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dependencies": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "bin": { - "csso": "bin/csso" - }, - "engines": { - "node": ">=0.10.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, - "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dependencies": { - "cssom": "0.3.x" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, - "node_modules/csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } }, - "node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dependencies": { - "d3-color": "1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, - "node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/d3-shape": { + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dependencies": { - "d3-path": "1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "node_modules/d3-transition/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "dependencies": { - "assert-plus": "^1.0.0" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, "engines": { - "node": ">=0.10" + "node": ">=8.9" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { - "ms": "2.0.0" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { + "node_modules/ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.2" } }, - "node_modules/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=", + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/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==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "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" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", - "engines": { - "node": ">=4.0.0" + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/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=", - "dependencies": { - "strip-bom": "^2.0.0" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "object-keys": "^1.0.12" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dependencies": { - "is-descriptor": "^0.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "node_modules/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==", "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "sprintf-js": "~1.0.2" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/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==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "node_modules/arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/dequal": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", - "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", + "node_modules/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==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/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==", "dependencies": { - "repeating": "^2.0.0" + "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" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-node": { + "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/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==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "engines": { - "node": ">= 4.2.1" + "node": ">=8" } }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "engines": { - "node": ">=0.3.1" + "node": ">=0.10.0" } }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "engines": { - "node": ">= 10.14.2" + "node": ">=0.10.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/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==" }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "object-assign": "^4.1.1", + "util": "0.10.3" } }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dependencies": { - "buffer-indexof": "^1.0.0" + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dependencies": { - "esutils": "^2.0.2" - }, + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "engines": { "node": ">=0.10.0" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", - "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==" + "node_modules/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=" }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" } }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "lodash": "^4.17.14" } }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "node_modules/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==" + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "engines": { + "node": "*" + } + }, + "node_modules/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==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">= 4.5.0" } }, - "node_modules/dom-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", - "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", + "node_modules/autoprefixer": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.7.tgz", + "integrity": "sha512-7Hg99B1eTH5+LgmUBUSmov1Z3bsggQJS7v3IMGo6wcScnbRuvtMc871J9J+4bSbIqa9LSX/zypFXJ8sXHpMJeQ==", "dependencies": { - "urijs": "^1.16.1" + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "nanocolors": "^0.2.8", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" + }, + "node_modules/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=", "engines": { - "node": ">=0.8.0" + "node": "*" } }, - "node_modules/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==", + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/axe-core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz", + "integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==", "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": ">=4" } }, - "node_modules/domelementtype": { + "node_modules/axobject-query": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, - "node_modules/domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", "dependencies": { - "domelementtype": "^2.2.0" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" }, "engines": { - "node": ">= 4" + "node": ">=6" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "eslint": ">= 4.12.1" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "node_modules/babel-eslint/node_modules/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==", + "engines": { + "node": ">=4" } }, - "node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "node_modules/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==", "dependencies": { - "is-obj": "^1.0.0" + "babylon": "^6.18.0" }, "engines": { "node": ">=4" } }, - "node_modules/dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "engines": { - "node": ">=4.6.0" - } - }, - "node_modules/dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/electron-to-chromium": { - "version": "1.3.845", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.845.tgz", - "integrity": "sha512-y0RorqmExFDI4RjLEC6j365bIT5UAXf9WIRcknvSFHVhbC/dRnCgJnPA3DUUW6SCC85QGKEafgqcHJ6uPdEP1Q==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "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" - } - }, - "node_modules/elliptic/node_modules/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==" - }, - "node_modules/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==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "node_modules/babel-jest/node_modules/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==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=7.0.0" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "node_modules/babel-jest/node_modules/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==" }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/babel-jest/node_modules/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==", "dependencies": { - "prr": "~1.0.1" + "has-flag": "^4.0.0" }, - "bin": { - "errno": "cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/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==", + "node_modules/babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dependencies": { - "is-arrayish": "^0.2.1" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" } }, - "node_modules/es-abstract": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", - "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-string": "^1.0.7", - "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" - }, - "engines": { - "node": ">= 0.4" + "minimist": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/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==", + "node_modules/babel-loader/node_modules/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==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0.0" } }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "node_modules/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==", "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "object.assign": "^4.1.0" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" } }, - "node_modules/es6-set/node_modules/es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "node_modules/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==", + "peerDependencies": { + "@babel/core": "^7.1.0" } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/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==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/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=", - "engines": { - "node": ">=0.8.0" + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/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==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "@babel/helper-define-polyfill-provider": "^0.2.2" }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/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=" }, - "node_modules/escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "node_modules/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=", "dependencies": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=0.4.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, - "node_modules/eslint": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", - "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", - "dependencies": { - "ajv": "^5.2.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.0.1", - "doctrine": "^2.0.0", - "eslint-scope": "^3.7.1", - "espree": "^3.5.1", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^9.17.0", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "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", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": ">=4" - } + "node_modules/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==" }, - "node_modules/eslint-config-react-app": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz", - "integrity": "sha512-8QZrKWuHVC57Fmu+SsKAVxnI9LycZl7NFQ4H9L+oeISuCXhYdXqsOOIVSjQFW6JF5MXZLFE+21Syhd7mF1IRZQ==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + }, "peerDependencies": { - "babel-eslint": "^7.2.3", - "eslint": "^4.1.1", - "eslint-plugin-flowtype": "^2.34.1", - "eslint-plugin-import": "^2.6.0", - "eslint-plugin-jsx-a11y": "^5.1.1", - "eslint-plugin-react": "^7.1.0" - } - }, - "node_modules/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==", - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "@babel/core": "^7.0.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dependencies": { - "ms": "^2.1.1" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "node_modules/babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "dependencies": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", - "deprecated": "This loader has been deprecated. Please use eslint-webpack-plugin", + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "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" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { - "eslint": ">=1.6.0 <5.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-loader/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dependencies": { - "glob": "^7.1.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" }, - "bin": { - "rimraf": "bin.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/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==", + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dependencies": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/eslint-plugin-flowtype": { - "version": "2.39.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", - "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "dependencies": { - "lodash": "^4.15.0" - }, - "engines": { - "node": ">=4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" }, "peerDependencies": { - "eslint": ">=2.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "dependencies": { - "builtin-modules": "^1.1.1", - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.1.1", - "has": "^1.0.1", - "lodash.cond": "^4.3.0", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">=4" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { - "eslint": "2.x - 4.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dependencies": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", - "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", + "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", "dependencies": { - "aria-query": "^0.7.0", - "array-includes": "^3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^1.4.0" - }, - "engines": { - "node": ">=4.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" }, "peerDependencies": { - "eslint": "^2.10.2 || ^3 || ^4" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", - "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", - "dependencies": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-plugin-react": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", - "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", + "node_modules/babel-preset-react-app/node_modules/@babel/preset-react/node_modules/@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==", "dependencies": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.5.10" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint-plugin-react/node_modules/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==", + "node_modules/babel-preset-react-app/node_modules/@babel/preset-react/node_modules/@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==", "dependencies": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "node": ">=6.9.0" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/eslint/node_modules/semver": { + "node_modules/babel-preset-react-app/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", @@ -4835,1790 +5105,1886 @@ "semver": "bin/semver" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "node_modules/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=", "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true }, - "node_modules/eslint/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "bin": { - "which": "bin/which" + "babylon": "bin/babylon.js" } }, - "node_modules/eslint/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dependencies": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "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" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dependencies": { - "estraverse": "^5.1.0" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, "engines": { - "node": ">=4.0" + "node": ">= 8.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "node_modules/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, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "node_modules/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, "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "file-uri-to-path": "1.0.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } + "node_modules/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==" }, - "node_modules/eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dependencies": { - "original": ">=0.0.5" + "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" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/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==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/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==", - "dependencies": { - "merge": "^1.2.0" + "node": ">= 0.8" } }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dependencies": { - "cross-spawn": "^5.0.1", - "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" - }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ms": "2.0.0" } }, - "node_modules/execa/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "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" } }, - "node_modules/execa/node_modules/shebang-regex": { + "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" + "node_modules/bootstrap": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.2.tgz", + "integrity": "sha512-1Ge963tyEQWJJ+8qtXFU6wgmAVj9gweEjibUdbmcCEYsn38tVwRk8107rk2vzt6cfQcRr3SlZ8aQBqaD8aqf+Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" }, - "bin": { - "which": "bin/which" + "peerDependencies": { + "@popperjs/core": "^2.9.2" } }, - "node_modules/execa/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dependencies": { - "is-posix-bracket": "^0.1.0" - }, + "node_modules/bootstrap-icons": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.5.0.tgz", + "integrity": "sha512-44feMc7DE1Ccpsas/1wioN8ewFJNquvi5FewA06wLnqct7CwMdGDVy41ieHaacogzDqLfG8nADIvMNp9e4bfbA==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/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=", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "homedir-polyfill": "^1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "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" - }, - "engines": { - "node": ">= 0.10.0" - } + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "node_modules/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==" }, - "node_modules/express/node_modules/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=" + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "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" + } }, - "node_modules/ext": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz", - "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==", + "node_modules/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==", "dependencies": { - "type": "^2.5.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + "node_modules/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==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "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" } }, - "node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/browserify-sign/node_modules/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==", "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.12" + "node": ">= 6" } }, - "node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "node_modules/browserify-sign/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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==", "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "pako": "~1.0.5" } }, - "node_modules/extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "deprecated": "Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin", + "node_modules/browserslist": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "dependencies": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", + "escalade": "^3.1.1", + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">= 4.8 < 5.0.0 || >= 5.10" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" }, - "peerDependencies": { - "webpack": "^3.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } }, - "node_modules/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==" + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } }, - "node_modules/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==" + "node_modules/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==" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "node_modules/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==" }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "engines": { - "node": ">=0.8.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dependencies": { - "bser": "2.1.1" - } + "node_modules/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=" }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/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=", + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/file-loader": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", - "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", - "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" - }, - "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0" - } - }, - "node_modules/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 - }, - "node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dependencies": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "node_modules/filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", + "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" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "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" + "callsites": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "engines": { "node": ">=4" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "caller-callsite": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dependencies": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." - }, - "node_modules/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "engines": { - "node": ">=4.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dependencies": { - "for-in": "^1.0.1" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" + "node_modules/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==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/caniuse-lite": { + "version": "1.0.30001261", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", + "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dependencies": { - "map-cache": "^0.2.2" + "rsvp": "^4.8.4" }, "engines": { - "node": ">=0.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/chain-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", + "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "minipass": "^3.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "node_modules/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, - "os": [ - "darwin" - ], "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "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" }, "engines": { - "node": ">= 4.0" - } + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } }, - "node_modules/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=" + "node_modules/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==", + "engines": { + "node": ">=6.0" + } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/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==", "dependencies": { - "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" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "node_modules/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==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/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=", + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "number-is-nan": "^1.0.0" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/class-utils/node_modules/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=", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "ansi-regex": "^2.0.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "node_modules/class-utils/node_modules/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=", "dependencies": { - "globule": "^1.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 4.0.0" + "node": ">=0.10.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "engines": { "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "node_modules/class-utils/node_modules/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==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, + "node_modules/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==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "source-map": "~0.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4.0" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" } }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "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" - }, - "engines": { - "node": "*" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "is-glob": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ini": "^1.3.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "engines": { - "node": ">=0.10.0" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dependencies": { - "isexe": "^2.0.0" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">= 4.0" } }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "node_modules/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=", "engines": { "node": ">=0.10.0" } }, - "node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "engines": { - "node": ">=4" + "node_modules/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==", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "node_modules/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==", "dependencies": { - "duplexer": "^0.1.1" - }, - "engines": { - "node": ">=0.12.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" - }, - "node_modules/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==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">= 0.8" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "engines": { - "node": ">=6" + "node_modules/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==" + }, + "node_modules/compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dependencies": { + "arity-n": "^1.0.4" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dependencies": { - "function-bind": "^1.1.1" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.6" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { - "ansi-regex": "^2.0.0" + "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" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, + "node_modules/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==" + }, + "node_modules/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==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, - "node_modules/has-value": { + "node_modules/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=" + }, + "node_modules/constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/has-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/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=", + "node_modules/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==", "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.1.1" } }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "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" } }, - "node_modules/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==", + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=4" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/hash-base/node_modules/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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/hash-base/node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/core-js": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.1.tgz", + "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/core-js-compat": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.1.tgz", + "integrity": "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "browserslist": "^4.17.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "bin": { - "he": "bin/he" + "semver": "bin/semver.js" } }, - "node_modules/highcharts": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.1.2.tgz", - "integrity": "sha512-RwCnJnxAUCGG4R/WDG+QP/4VJNtOpkQTkXcuf58DjDvm9ZILplSMdZvrbMRC9Y9ecuJQCjjZsiifvyS5E2IBvQ==" + "node_modules/core-js-pure": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", + "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "node_modules/highcharts-react-official": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.0.0.tgz", - "integrity": "sha512-VefJgDY2hkT9gfppsQGrRF2g5u8d9dtfHGcx2/xqiP+PkZXCqalw9xOeKVCRvJKTOh0coiDFwvVjOvB7KaGl4A==" + "node_modules/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=" }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "node_modules/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==", "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "node_modules/create-ecdh/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "react-is": "^16.7.0" + "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" } }, - "node_modules/hoist-non-react-statics/node_modules/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==" - }, - "node_modules/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=", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "node_modules/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==", "dependencies": { - "parse-passwd": "^1.0.0" + "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" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/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==" + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" } }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "node_modules/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==", - "dependencies": { - "whatwg-encoding": "^1.0.1" - } - }, - "node_modules/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==" - }, - "node_modules/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==", + "node_modules/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==", "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" + "postcss": "^7.0.5" }, "bin": { - "html-minifier": "cli.js" + "css-blank-pseudo": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/html-webpack-plugin": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", - "deprecated": "out of support", - "dependencies": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "node_modules/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=", + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" }, - "peerDependencies": { - "webpack": "1 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3" + "engines": { + "node": ">4" } }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, "engines": { - "node": "*" + "node": ">=6.0.0" } }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "node_modules/css-has-pseudo/node_modules/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==", "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" }, "engines": { - "node": ">= 0.6" + "node": ">=6.0.0" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "node_modules/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==" + "node_modules/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==" }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "mdn-data": "2.0.4", + "source-map": "^0.6.1" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dependencies": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/http-proxy-middleware/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" + "node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "engines": { + "node": ">= 6" }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=4" } }, - "node_modules/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=" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/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=" + "node_modules/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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dependencies": { - "postcss": "^6.0.1" + "node_modules/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=", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/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=", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "node_modules/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==", "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/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==", + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dependencies": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">=4" } }, - "node_modules/indent-string": { + "node_modules/cssnano/node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/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==" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, "engines": { "node": ">=8" } }, - "node_modules/indexes-of": { + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/cyclist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, - "node_modules/inflight": { + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-dispatch": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "d3-dispatch": "1", + "d3-selection": "1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, - "node_modules/inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "d3-path": "1" } }, - "node_modules/internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", "dependencies": { - "meow": "^3.3.0" - }, - "bin": { - "internal-ip": "cli.js" - }, - "engines": { - "node": ">=0.10.0" + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" } }, - "node_modules/internal-ip/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "engines": { - "node": ">=0.10.0" + "node_modules/d3-transition/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, - "node_modules/internal-ip/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/internal-ip/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/internal-ip/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "repeating": "^2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "engines": { "node": ">=0.10.0" } }, - "node_modules/internal-ip/node_modules/load-json-file": { + "node_modules/decamelize-keys": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "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" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/internal-ip/node_modules/map-obj": { + "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", @@ -6626,3304 +6992,3578 @@ "node": ">=0.10.0" } }, - "node_modules/internal-ip/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/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=", "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/internal-ip/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/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==", "dependencies": { - "error-ex": "^1.2.0" + "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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/internal-ip/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/internal-ip/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/internal-ip/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.8" } }, - "node_modules/internal-ip/node_modules/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=", + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "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" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/internal-ip/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "node_modules/default-gateway/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "pump": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/internal-ip/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/internal-ip/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { "node": ">=0.10.0" } }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/default-gateway/node_modules/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=", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "path-key": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/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==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/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=", + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "engines": { "node": ">=0.10.0" } }, - "node_modules/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=", + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "kind-of": "^3.0.2" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "which": "bin/which" } }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/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==", "dependencies": { - "is-buffer": "^1.1.5" + "object-keys": "^1.0.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/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==", + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dependencies": { - "has-bigints": "^1.0.1" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/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, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dependencies": { - "binary-extensions": "^2.0.0" + "array-uniq": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dependencies": { - "builtin-modules": "^1.0.0" - }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "engines": { "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "ci-info": "^1.5.0" + "glob": "^7.1.3" }, "bin": { - "is-ci": "bin.js" + "rimraf": "bin.js" } }, - "node_modules/is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/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=", - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/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==", + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-descriptor/node_modules/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==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/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==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.2.1" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "engines": { - "node": ">=0.10.0" + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/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=", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/diffie-hellman/node_modules/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==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-extglob": { + "node_modules/dns-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "node_modules/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=", - "engines": { - "node": ">=4" + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" } }, - "node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dependencies": { - "is-extglob": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "node_modules/dom-accessibility-api": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", + "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=4" + "utila": "~0.4" } }, - "node_modules/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==", - "engines": { - "node": ">= 0.4" + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">=0.4", + "npm": ">=1.2" } }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dependencies": { - "kind-of": "^3.0.2" + "webidl-conversions": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dependencies": { - "has-tostringtag": "^1.0.0" + "domelementtype": "^2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { - "is-buffer": "^1.1.5" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/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==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { - "is-path-inside": "^1.0.0" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/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=", - "dependencies": { - "path-is-inside": "^1.0.1" - }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/is-plain-object/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/electron-to-chromium": { + "version": "1.3.854", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", + "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==" }, - "node_modules/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==", + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "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" + } + }, + "node_modules/elliptic/node_modules/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==" + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" + "node_modules/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==", + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/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==", "dependencies": { - "has-tostringtag": "^1.0.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "node_modules/enhanced-resolve/node_modules/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==", "dependencies": { - "html-comment-regex": "^1.1.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dependencies": { - "has-symbols": "^1.0.2" + "ansi-colors": "^4.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dependencies": { - "isarray": "1.0.0" + "prr": "~1.0.1" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "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" + "bin": { + "errno": "cli.js" } }, - "node_modules/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==" - }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "append-transform": "^0.4.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/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==", + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", "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" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "stackframe": "^1.1.1" } }, - "node_modules/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==", + "node_modules/es-abstract": { + "version": "1.18.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.7.tgz", + "integrity": "sha512-uFG1gyVX91tZIiDWNmPsL8XNpiCk/6tkB7MZphoSJflS4w+KgWyQ2gjCVDnsPxFAo9WjRXG3eqONNYdfbJjAtw==", "dependencies": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-string": "^1.0.7", + "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" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "dependencies": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dependencies": { - "ms": "^2.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/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==", - "dependencies": { - "handlebars": "^4.0.3" + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" } }, - "node_modules/jest": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", - "dependencies": { - "jest-cli": "^20.0.4" - }, - "bin": { - "jest": "bin/jest.js" - }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/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=", "engines": { - "node": ">= 4" + "node": ">=0.8.0" } }, - "node_modules/jest-changed-files": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", - "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" - }, - "node_modules/jest-cli": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", - "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dependencies": { - "ansi-escapes": "^1.4.0", - "callsites": "^2.0.0", - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^20.0.3", - "jest-config": "^20.0.4", - "jest-docblock": "^20.0.3", - "jest-environment-jsdom": "^20.0.3", - "jest-haste-map": "^20.0.4", - "jest-jasmine2": "^20.0.4", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve-dependencies": "^20.0.3", - "jest-runtime": "^20.0.4", - "jest-snapshot": "^20.0.3", - "jest-util": "^20.0.3", - "micromatch": "^2.3.11", - "node-notifier": "^8.01", - "pify": "^2.3.0", - "slash": "^1.0.0", - "string-length": "^1.0.1", - "throat": "^3.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^7.0.2" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" }, "bin": { - "jest": "bin/jest.js" + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 4" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/jest-cli/node_modules/ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-cli/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-cli/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dependencies": { - "ansi-regex": "^2.0.0" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, "engines": { - "node": ">=0.8.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/jest-cli/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "dependencies": { - "isexe": "^2.0.0" + "confusing-browser-globals": "^1.0.10" }, - "bin": { - "which": "bin/which" + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } } }, - "node_modules/jest-config": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "glob": "^7.1.1", - "jest-environment-jsdom": "^20.0.3", - "jest-environment-node": "^20.0.3", - "jest-jasmine2": "^20.0.4", - "jest-matcher-utils": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-validate": "^20.0.3", - "pretty-format": "^20.0.3" + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, - "node_modules/jest-config/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "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" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/chalk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/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==", + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "ms": "^2.1.1" } }, - "node_modules/jest-config/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/eslint-plugin-flowtype": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", + "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", "dependencies": { - "ansi-regex": "^2.0.0" + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.1.0" } }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { - "color-convert": "^2.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/jest-diff/node_modules/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==", + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dependencies": { - "color-name": "~1.1.4" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/jest-diff/node_modules/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==" + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-diff/node_modules/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==", + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-docblock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" - }, - "node_modules/jest-environment-jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", - "dependencies": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3", - "jsdom": "^9.12.0" + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" } }, - "node_modules/jest-environment-node": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", - "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", - "dependencies": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3" + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" } }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "engines": { - "node": ">= 10.14.2" + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-haste-map": { - "version": "20.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", - "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", + "node_modules/eslint-plugin-jest": { + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.5.0.tgz", + "integrity": "sha512-Cm+XdX7Nms2UXGRnivHFVcM3ZmlKheHvc9VD78iZLO1XcqB59WbVjrMSiesCbHDlToxWjMJDiJMgc1CzFE13Vg==", "dependencies": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^20.0.3", - "micromatch": "^2.3.11", - "sane": "~1.6.0", - "worker-farm": "^1.3.1" + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } } }, - "node_modules/jest-jasmine2": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "dependencies": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-matchers": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-snapshot": "^20.0.3", - "once": "^1.4.0", - "p-map": "^1.1.1" + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" } }, - "node_modules/jest-jasmine2/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/eslint-plugin-react": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz", + "integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" } }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "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" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-jasmine2/node_modules/jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "dependencies": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-jasmine2/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", - "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/jest-jasmine2/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", "dependencies": { - "color-convert": "^1.9.0" + "@typescript-eslint/experimental-utils": "^3.10.1" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^5 || ^6 || ^7" } }, - "node_modules/jest-jasmine2/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" } }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "engines": { - "node": ">=0.8.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/jest-matcher-utils": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dependencies": { - "chalk": "^1.1.3", - "pretty-format": "^20.0.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "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" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/jest-matcher-utils/node_modules/chalk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/eslint-plugin-testing-library/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", - "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "node_modules/eslint-plugin-testing-library/node_modules/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==", + "engines": { + "node": ">=4" } }, - "node_modules/jest-matcher-utils/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "ansi-regex": "^2.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { - "node": ">=0.8.0" + "node": ">=4.0" } }, - "node_modules/jest-matchers": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", - "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dependencies": { - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3" + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/jest-matchers/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/jest-matchers/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", "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" + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0", + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/jest-matchers/node_modules/chalk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/eslint-webpack-plugin/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/jest-matchers/node_modules/jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/jest-matchers/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "@babel/highlight": "^7.10.4" } }, - "node_modules/jest-matchers/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "ansi-regex": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-matchers/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "node_modules/eslint/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "micromatch": "^2.3.11", - "slash": "^1.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/eslint/node_modules/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==" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "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" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/jest-message-util/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/eslint/node_modules/eslint-utils/node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dependencies": { - "ansi-regex": "^2.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/jest-mock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" - }, - "node_modules/jest-regex-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } }, - "node_modules/jest-resolve": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "browser-resolve": "^1.11.2", - "is-builtin-module": "^1.0.0", - "resolve": "^1.3.2" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jest-resolve-dependencies": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", - "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "node_modules/eslint/node_modules/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==", "dependencies": { - "jest-regex-util": "^20.0.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jest-runtime": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", - "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", - "dependencies": { - "babel-core": "^6.0.0", - "babel-jest": "^20.0.3", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^1.1.3", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^20.0.4", - "jest-haste-map": "^20.0.4", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-util": "^20.0.3", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "strip-bom": "3.0.0", - "yargs": "^7.0.2" + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runtime/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/espree/node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dependencies": { - "ansi-regex": "^2.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=4" + "node": ">=4.0" } }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "engines": { - "node": ">=0.8.0" + "node": ">=4.0" } }, - "node_modules/jest-snapshot": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", - "dependencies": { - "chalk": "^1.1.3", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-util": "^20.0.3", - "natural-compare": "^1.4.0", - "pretty-format": "^20.0.3" - } + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, - "node_modules/jest-snapshot/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/jest-snapshot/node_modules/chalk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.x" } }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dependencies": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "node_modules/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==", "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/jest-snapshot/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dependencies": { - "ansi-regex": "^2.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "engines": { - "node": ">=0.8.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dependencies": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-message-util": "^20.0.3", - "jest-mock": "^20.0.3", - "jest-validate": "^20.0.3", - "leven": "^2.1.0", - "mkdirp": "^0.5.1" - } - }, - "node_modules/jest-util/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "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" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-util/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "ansi-regex": "^2.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jest-validate": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "node_modules/expand-brackets/node_modules/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=", "dependencies": { - "chalk": "^1.1.3", - "jest-matcher-utils": "^20.0.3", - "leven": "^2.1.0", - "pretty-format": "^20.0.3" - } - }, - "node_modules/jest-validate/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "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" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/chalk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "ansi-regex": "^2.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + "node_modules/expand-brackets/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/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==", + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "dependencies": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", - "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "bin": { - "acorn": "bin/acorn" + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "bin": { - "jsesc": "bin/jsesc" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/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==" - }, - "node_modules/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=", + "node_modules/expect/node_modules/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==", "dependencies": { - "jsonify": "~0.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/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=" + "node_modules/expect/node_modules/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==" }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "bin": { - "json5": "lib/cli.js" + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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" + }, + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "engines": { - "node": "*" + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express/node_modules/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=" + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "type": "^2.5.0" } }, - "node_modules/jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "engines": { - "node": ">=4.0" - } + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/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==", + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dependencies": { - "package-json": "^4.0.0" + "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" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "invert-kv": "^1.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { "node": ">=0.10.0" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/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==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "node_modules/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==" }, - "node_modules/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=", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" + "reusify": "^1.0.4" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { - "error-ex": "^1.2.0" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" + "node": ">=0.8.0" } }, - "node_modules/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==", + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dependencies": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" + "bser": "2.1.1" } }, - "node_modules/loader-fs-cache/node_modules/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=", + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dependencies": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/loader-fs-cache/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/loader-fs-cache/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "pinkie-promise": "^2.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/loader-fs-cache/node_modules/pkg-dir": { + "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "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 + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/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==", "dependencies": { - "find-up": "^1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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" + }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">= 0.8" } }, - "node_modules/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==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/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==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { - "minimist": "^1.2.0" + "locate-path": "^3.0.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=6" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { + "node_modules/find-cache-dir/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "node_modules/lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "node_modules/find-cache-dir/node_modules/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==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/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==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/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==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dependencies": { - "lodash._reinterpolate": "^3.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.6.0" + "node": ">=4.0" }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "engines": { "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" } }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "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" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "yallist": "^4.0.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "bin": { - "lz-string": "bin/bin.js" + "node": ">=0.10.0" } }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "pify": "^3.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dependencies": { - "object-visit": "^1.0.0" + "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" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/math-expression-evaluator": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.8.tgz", - "integrity": "sha512-9FbRY3i6U+CbHgrdNbAUaisjWTozkm1ZfupYQJiZ87NtYHk2Zh9DvxMgp/fifxVhqTLpd5fCCLossUbpZxGeKw==" + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/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==" + "node_modules/fork-ts-checker-webpack-plugin/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/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==", + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, - "node_modules/mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dependencies": { - "mimic-fn": "^1.0.0" + "map-cache": "^0.2.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/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=", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dependencies": { - "lru-cache": "^6.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "node_modules/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=", "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/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=" + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, + "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" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/gauge/node_modules/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=", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "number-is-nan": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/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==" - }, - "node_modules/meow/node_modules/read-pkg/node_modules/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==", + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "globule": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 4.0.0" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/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==", "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">=10" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "node_modules/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==" }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "engines": { - "node": ">= 0.6" + "node": ">=8.0.0" } }, - "node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "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" - }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "engines": { "node": ">=0.10.0" } }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "is-buffer": "^1.1.5" + "pump": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/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==" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "node": ">=8" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dependencies": { - "mime-db": "1.48.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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==", - "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" + "assert-plus": "^1.0.0" } }, - "node_modules/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==" - }, - "node_modules/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=" - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dependencies": { - "brace-expansion": "^1.1.7" + "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" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dependencies": { - "yallist": "^4.0.0" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "which": "bin/which" } }, - "node_modules/mixin-deep/node_modules/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==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dependencies": { - "is-plain-object": "^2.0.4" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dependencies": { - "minimist": "^1.2.5" + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">= 0.10" } }, - "node_modules/ms": { + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==" + }, + "node_modules/har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">=6" } }, - "node_modules/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=" + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "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" + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/nanomatch/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nanomatch/node_modules/is-accessor-descriptor": { + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dependencies": { - "kind-of": "^6.0.0" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/is-data-descriptor": { + "node_modules/has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dependencies": { - "kind-of": "^6.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/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==", + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "is-plain-object": "^2.0.4" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/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==" - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "node_modules/hash-base/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "node_modules/hash-base/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "lower-case": "^1.1.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/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_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/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==" + }, + "node_modules/highcharts": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.1.2.tgz", + "integrity": "sha512-RwCnJnxAUCGG4R/WDG+QP/4VJNtOpkQTkXcuf58DjDvm9ZILplSMdZvrbMRC9Y9ecuJQCjjZsiifvyS5E2IBvQ==" + }, + "node_modules/highcharts-react-official": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.0.0.tgz", + "integrity": "sha512-VefJgDY2hkT9gfppsQGrRF2g5u8d9dtfHGcx2/xqiP+PkZXCqalw9xOeKVCRvJKTOh0coiDFwvVjOvB7KaGl4A==", + "peerDependencies": { + "highcharts": ">=6.0.0", + "react": ">=16.8.0" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "engines": { - "node": ">= 6.0.0" + "node": "*" } }, - "node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "node_modules/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==", + "node_modules/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==", "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" + "react-is": "^16.7.0" } }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "node_modules/hoist-non-react-statics/node_modules/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==" }, - "node_modules/node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/node-notifier/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/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==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/node-notifier/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dependencies": { - "isexe": "^2.0.0" + "whatwg-encoding": "^1.0.5" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=10" } }, - "node_modules/node-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", - "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "node_modules/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==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "dependencies": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" }, "bin": { - "node-sass": "bin/node-sass" + "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/node-sass/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/node-sass/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/node-sass/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/html-webpack-plugin/node_modules/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==", "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" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/node-sass/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/node-sass/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/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==", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node": ">= 0.6" } }, - "node_modules/normalize-package-data/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } + "node_modules/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==" }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/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==", "dependencies": { - "remove-trailing-separator": "^1.0.1" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "node_modules/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=", + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "path-key": "^2.0.0" + "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" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/npm-run-path/node_modules/path-key": { + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/nth-check": { + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "boolbase": "^1.0.0" + "is-extendable": "^0.1.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "node_modules/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=", "engines": { "node": ">=0.10.0" } }, - "node_modules/nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "node_modules/http-proxy-middleware/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/kind-of": { + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", @@ -9934,3792 +10574,4137 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + }, "engines": { - "node": ">= 0.10.0" + "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/http-proxy-middleware/node_modules/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=", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dependencies": { - "isobject": "^3.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/object-visit/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/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=" }, - "node_modules/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==", + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "engines": { - "node": ">=0.10.0" + "node": ">=8.12.0" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "isobject": "^3.0.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/object.pick/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/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=", "dependencies": { - "ee-first": "1.1.1" + "harmony-reflect": "^1.4.6" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/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==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dependencies": { - "mimic-fn": "^1.0.0" + "import-from": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/opn": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { - "is-wsl": "^1.1.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "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" + "node": ">=6" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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==", - "dependencies": { - "url-parse": "^1.4.3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "node_modules/import-fresh/node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dependencies": { - "lcid": "^1.0.0" + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "engines": { "node": ">=4" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dependencies": { - "p-try": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "p-limit": "^2.2.0" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "engines": { - "node": ">=4" + "node": ">=0.8.19" } }, - "node_modules/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==", + "node_modules/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==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, - "node_modules/package-json/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { - "no-case": "^2.2.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "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" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "engines": { - "node": ">=0.10.0" + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" } }, - "node_modules/parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/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==" - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/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=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/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=", + "node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/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=" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/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==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==" + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dependencies": { - "isarray": "0.0.1" + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "node_modules/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, "dependencies": { - "pify": "^2.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/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==", "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" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/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, + "node_modules/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==", "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" + "node_modules/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=", + "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" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dependencies": { - "pinkie": "^2.0.0" + "has": "^1.0.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "node_modules/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==", "dependencies": { - "find-up": "^2.1.0" + "kind-of": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/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==", "dependencies": { - "locate-path": "^2.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/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==", "dependencies": { - "p-limit": "^1.1.0" + "is-plain-object": "^2.0.4" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/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=", "engines": { "node": ">=4" } }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node": ">=0.10.0" } }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, - "node_modules/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=", + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=4.0.0" + "node": ">=0.12.0" } }, - "node_modules/postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "node_modules/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==", "dependencies": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-calc/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-calc/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postcss-calc/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "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" + "is-path-inside": "^2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postcss-calc/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/postcss-calc/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-calc/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "isobject": "^3.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" } }, - "node_modules/postcss-calc/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-calc/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dependencies": { - "has-flag": "^1.0.0" - }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dependencies": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - } + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, - "node_modules/postcss-colormin/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postcss-colormin/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-colormin/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "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" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-colormin/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-colormin/node_modules/has-flag": { + "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/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==", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-colormin/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-colormin/node_modules/strip-ansi": { + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-colormin/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dependencies": { - "has-flag": "^1.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dependencies": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/postcss-convert-values/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-convert-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-convert-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report/node_modules/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==", "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" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-convert-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-convert-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-convert-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-convert-values/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", "dependencies": { - "ansi-regex": "^2.0.0" + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-convert-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dependencies": { - "has-flag": "^1.0.0" + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "node_modules/jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", "dependencies": { - "postcss": "^5.0.14" - } - }, - "node_modules/postcss-discard-comments/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-comments/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-discard-comments/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-discard-comments/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-circus/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-discard-comments/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-circus/node_modules/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==" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-comments/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-circus/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-discard-comments/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dependencies": { - "ansi-regex": "^2.0.0" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-comments/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "has-flag": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "postcss": "^5.0.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-discard-duplicates/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-cli/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-discard-duplicates/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-cli/node_modules/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==" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-duplicates/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-cli/node_modules/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==", "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" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-discard-duplicates/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } } }, - "node_modules/postcss-discard-duplicates/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-discard-duplicates/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-discard-duplicates/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-config/node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dependencies": { - "postcss": "^5.0.14" - } + "node_modules/jest-config/node_modules/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==" }, - "node_modules/postcss-discard-empty/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-empty/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-empty/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-config/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "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" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-empty/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-config/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-discard-empty/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-config/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-empty/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-config/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-discard-empty/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "node_modules/jest-config/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-empty/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dependencies": { - "has-flag": "^1.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "postcss": "^5.0.16" - } - }, - "node_modules/postcss-discard-overridden/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-discard-overridden/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-discard-overridden/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-diff/node_modules/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==", "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-discard-overridden/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-diff/node_modules/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==" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-discard-overridden/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-diff/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-overridden/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=0.12" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-overridden/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dependencies": { - "ansi-regex": "^2.0.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-overridden/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "has-flag": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-discard-unused/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-each/node_modules/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==", "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-discard-unused/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/jest-each/node_modules/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==" }, - "node_modules/postcss-discard-unused/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-discard-unused/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-each/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-discard-unused/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dependencies": { - "ansi-regex": "^2.0.0" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-discard-unused/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dependencies": { - "has-flag": "^1.0.0" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dependencies": { - "postcss": "^5.0.4" + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" } }, - "node_modules/postcss-filter-plugins/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-filter-plugins/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-filter-plugins/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-filter-plugins/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-jasmine2/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-filter-plugins/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-jasmine2/node_modules/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==" + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-filter-plugins/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-jasmine2/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-filter-plugins/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dependencies": { - "ansi-regex": "^2.0.0" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-filter-plugins/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dependencies": { - "has-flag": "^1.0.0" + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-flexbugs-fixes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", - "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "postcss": "^6.0.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "node_modules/jest-matcher-utils/node_modules/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==", "dependencies": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.12" + "node": ">=7.0.0" } }, - "node_modules/postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dependencies": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - }, + "node_modules/jest-matcher-utils/node_modules/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==" + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", + "node_modules/jest-matcher-utils/node_modules/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==", "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.3.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-idents/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-merge-idents/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-merge-idents/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-message-util/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-merge-idents/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/jest-message-util/node_modules/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==" }, - "node_modules/postcss-merge-idents/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-merge-idents/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-message-util/node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-merge-idents/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dependencies": { - "has-flag": "^1.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dependencies": { - "postcss": "^5.0.4" + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-longhand/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/postcss-merge-longhand/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-longhand/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "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" + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-longhand/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-longhand/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-merge-longhand/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-merge-longhand/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-resolve/node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dependencies": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - } + "node_modules/jest-resolve/node_modules/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==" }, - "node_modules/postcss-merge-rules/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-merge-rules/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-merge-rules/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, - "bin": { - "browserslist": "cli.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-merge-rules/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-merge-rules/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-resolve/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-merge-rules/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-resolve/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-merge-rules/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" }, "engines": { - "node": ">=0.12" + "node": ">= 10.14.2" } }, - "node_modules/postcss-merge-rules/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "ansi-regex": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-merge-rules/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "has-flag": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "node_modules/postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dependencies": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "node_modules/postcss-minify-font-values/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-runner/node_modules/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==", "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-minify-font-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/jest-runner/node_modules/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==" }, - "node_modules/postcss-minify-font-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-font-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.12" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-font-values/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-runner/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-font-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-runner/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "has-flag": "^1.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dependencies": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-minify-gradients/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-runner/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-gradients/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-runner/node_modules/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==", "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" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-gradients/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-runner/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-minify-gradients/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-gradients/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-minify-gradients/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-minify-gradients/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-runtime/node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dependencies": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - } + "node_modules/jest-runtime/node_modules/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==" }, - "node_modules/postcss-minify-params/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-params/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-params/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-runtime/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "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" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-params/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-runtime/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-minify-params/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-runtime/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-params/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-runtime/node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/postcss-minify-params/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "node_modules/jest-runtime/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-params/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dependencies": { - "has-flag": "^1.0.0" + "@types/node": "*", + "graceful-fs": "^4.2.4" }, "engines": { - "node": ">=0.8.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dependencies": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-selectors/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-minify-selectors/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-minify-selectors/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-snapshot/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-minify-selectors/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-snapshot/node_modules/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==" + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-selectors/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-snapshot/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.12" + "node": ">= 10.14.2" } }, - "node_modules/postcss-minify-selectors/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-snapshot/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-minify-selectors/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-snapshot/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "has-flag": "^1.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", - "dependencies": { - "postcss": "^6.0.1" + "node_modules/jest-snapshot/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" } }, - "node_modules/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=", + "node_modules/jest-snapshot/node_modules/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==", "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/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=", - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "node_modules/jest-snapshot/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" } }, - "node_modules/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=", + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "postcss": "^5.0.5" - } - }, - "node_modules/postcss-normalize-charset/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-normalize-charset/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-normalize-charset/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-util/node_modules/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==", "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-normalize-charset/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-util/node_modules/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==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-normalize-charset/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-util/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-normalize-charset/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=0.12" + "node": ">= 10.14.2" } }, - "node_modules/postcss-normalize-charset/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "ansi-regex": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-normalize-charset/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "has-flag": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "node_modules/jest-validate/node_modules/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==", "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/postcss-normalize-url/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-validate/node_modules/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==" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-normalize-url/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-validate/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-normalize-url/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "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" + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "jest": "^26.0.0" } }, - "node_modules/postcss-normalize-url/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-normalize-url/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-normalize-url/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-watch-typeahead/node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dependencies": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "node": ">=7.0.0" } }, - "node_modules/postcss-ordered-values/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/jest-watch-typeahead/node_modules/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==" }, - "node_modules/postcss-ordered-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-watch-typeahead/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-ordered-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "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" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-ordered-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-watch-typeahead/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-ordered-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.14.2" } }, - "node_modules/postcss-ordered-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-ordered-values/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-ordered-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jest-watcher/node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8.0" + "node": ">=7.0.0" } }, - "node_modules/postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dependencies": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } + "node_modules/jest-watcher/node_modules/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==" }, - "node_modules/postcss-reduce-idents/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-reduce-idents/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jest-watcher/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-reduce-idents/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "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" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, - "node_modules/postcss-reduce-idents/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-reduce-idents/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/jest-worker/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postcss-reduce-idents/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=0.12" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/postcss-reduce-idents/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/postcss-reduce-idents/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dependencies": { - "has-flag": "^1.0.0" + "node_modules/jsdom/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.4.0" } }, - "node_modules/postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dependencies": { - "postcss": "^5.0.4" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" } }, - "node_modules/postcss-reduce-initial/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jsdom/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "node_modules/postcss-reduce-initial/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/postcss-reduce-initial/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/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==" }, - "node_modules/postcss-reduce-initial/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/postcss-reduce-initial/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "node_modules/postcss-reduce-initial/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } + "node_modules/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==" }, - "node_modules/postcss-reduce-initial/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postcss-reduce-initial/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "has-flag": "^1.0.0" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=0.8.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "node_modules/postcss-reduce-transforms/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dependencies": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/postcss-reduce-transforms/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, - "node_modules/postcss-reduce-transforms/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - }, + "node_modules/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==", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-reduce-transforms/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/postcss-reduce-transforms/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/postcss-reduce-transforms/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" + "language-subtag-registry": "~0.3.2" } }, - "node_modules/postcss-reduce-transforms/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" - }, + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postcss-reduce-transforms/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dependencies": { - "has-flag": "^1.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8.0" } }, - "node_modules/postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, - "node_modules/postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dependencies": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - } - }, - "node_modules/postcss-svgo/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "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" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "engines": { - "node": ">=0.12" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/postcss-svgo/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dependencies": { - "ansi-regex": "^2.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.9.0" } }, - "node_modules/postcss-svgo/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "has-flag": "^1.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dependencies": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/postcss-unique-selectors/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "node_modules/postcss-unique-selectors/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, - "node_modules/postcss-unique-selectors/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/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==", "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" - }, - "engines": { - "node": ">=0.10.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" } }, - "node_modules/postcss-unique-selectors/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" + "node_modules/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==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" } }, - "node_modules/postcss-unique-selectors/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/postcss-unique-selectors/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/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==", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": ">=0.12" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/postcss-unique-selectors/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dependencies": { - "ansi-regex": "^2.0.0" + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" } }, - "node_modules/postcss-unique-selectors/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/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==", "dependencies": { - "has-flag": "^1.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/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==" + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "tmpl": "1.0.x" } }, - "node_modules/postcss-zindex/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-zindex/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-zindex/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "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" + "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss-zindex/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" + "node_modules/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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/postcss-zindex/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/postcss-zindex/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "node_modules/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=", "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">=0.12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-zindex/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dependencies": { - "ansi-regex": "^2.0.0" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/postcss-zindex/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", "dependencies": { - "has-flag": "^1.0.0" + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/meow/node_modules/read-pkg/node_modules/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==" }, - "node_modules/pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", - "engines": { - "node": ">=4" + "node_modules/meow/node_modules/read-pkg/node_modules/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==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/meow/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dependencies": { - "color-convert": "^2.0.1" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format/node_modules/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==", + "node_modules/meow/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "color-name": "~1.1.4" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/pretty-format/node_modules/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==" - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { - "node": ">= 0.6.0" + "node": ">=10" } }, - "node_modules/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==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "node_modules/promise": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", - "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", - "dependencies": { - "asap": "~2.0.3" - } + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" } }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" } }, - "node_modules/prop-types-extra/node_modules/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==" - }, - "node_modules/prop-types/node_modules/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==" + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, - "node_modules/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==", + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "braces": "^3.0.1", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 0.10" + "node": ">=8.6" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "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" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/public-encrypt/node_modules/bn.js": { + "node_modules/miller-rabin/node_modules/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==" }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": ">=4" } }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", "engines": { - "node": ">=0.6" + "node": ">= 0.6" } }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "mime-db": "1.48.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { - "node": ">=0.4.x" + "node": ">=6" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/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==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", "dependencies": { - "performance-now": "^2.1.0" + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "node_modules/mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/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==", - "engines": { - "node": ">=0.10.0" + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dependencies": { - "safe-buffer": "^5.1.0" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/mini-css-extract-plugin/node_modules/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==", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/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==", + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "node_modules/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==", + "node_modules/mini-css-extract-plugin/node_modules/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==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } + "node_modules/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==" }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/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=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "brace-expansion": "^1.1.7" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": "*" } }, - "node_modules/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==", + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/react-bootstrap": { - "version": "2.0.0-beta.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.0.0-beta.4.tgz", - "integrity": "sha512-ETCvuZV78orCqGg4XA4WrhytXxTcnvshPDveSc3uK2mvnj6IRQue5O5188xsazbD3nnhX52T63uQjM4HjeRBEw==", + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dependencies": { - "@babel/runtime": "^7.14.0", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.26", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": ">=16.14.8", - "@types/react-transition-group": "^4.4.1", - "@types/warning": "^3.0.0", - "classnames": "^2.3.1", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^5.1.1", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/react-bootstrap/node_modules/@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "minipass": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/react-d3-tree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.1.1.tgz", - "integrity": "sha512-PSy1UZG8CQ/fhqtk8ZGigBT/D2NQkS0vTYis/0ZNZxxIqtf0SAEu0VFdT8tvEXsmnuK9+6iAeSRchbqj59WvWg==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dependencies": { - "@bkrem/react-transition-group": "^1.3.1", - "@types/d3-hierarchy": "^1.1.8", - "clone": "^2.1.1", - "d3-hierarchy": "^1.1.9", - "d3-selection": "^1.4.2", - "d3-shape": "^1.3.7", - "d3-zoom": "^1.8.3", - "dequal": "^2.0.2", - "uuid": "^8.3.1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/react-d3-tree/node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/react-dev-utils": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.3.tgz", - "integrity": "sha512-Mvs6ofsc2xTjeZIrMaIfbXfsPVrbdVy/cVqq6SAacnqfMlcBpDuivhWZ1ODGeJ8HgmyWTLH971PYjj/EPCDVAw==", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dependencies": { - "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.2.0", - "react-error-overlay": "^4.0.1", - "recursive-readdir": "2.2.1", - "shell-quote": "1.6.1", - "sockjs-client": "1.1.5", - "strip-ansi": "3.0.1", - "text-table": "0.2.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/react-dev-utils/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "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" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "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" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-dev-utils/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/react-dev-utils/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "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" } }, - "node_modules/react-dev-utils/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "shebang-regex": "^1.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/react-dev-utils/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/react-dev-utils/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dependencies": { - "ansi-regex": "^2.0.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/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=" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "node_modules/nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==" + }, + "node_modules/nanoid": { + "version": "3.1.28", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", + "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=0.8.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/react-dev-utils/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dependencies": { - "isexe": "^2.0.0" + "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" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-dev-utils/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "node_modules/native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "querystring": "^0.2.0" } }, - "node_modules/react-error-overlay": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.1.tgz", - "integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==" + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, - "node_modules/react-highlight": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.14.0.tgz", - "integrity": "sha512-kWE+KXOXidS7SABhVopOgMnowbI3RAfeGZbnrduLNlWrYAED8sycL9l/Fvw3w0PFpIIawB7mRDnyhDcM/cIIGA==", - "dependencies": { - "highlight.js": "^10.5.0" + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/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==" + "node_modules/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==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, - "node_modules/react-overlays": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", - "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.8.6", - "@restart/hooks": "^0.3.26", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - } + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "node_modules/react-overlays/node_modules/@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "node_modules/react-router/node_modules/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==" - }, - "node_modules/react-scripts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.1.5.tgz", - "integrity": "sha512-ZXqnbg+kLRaacAkjuedMFTgKu9lNltMDDsuwn37CTV7X2tuZQmDKi08eI3LYvtpjqh5vm8/6BhwHRHkRtvMyJg==", - "dependencies": { - "autoprefixer": "7.1.6", - "babel-core": "6.26.0", - "babel-eslint": "7.2.3", - "babel-jest": "20.0.3", - "babel-loader": "7.1.2", - "babel-preset-react-app": "^3.1.2", - "babel-runtime": "6.26.0", - "case-sensitive-paths-webpack-plugin": "2.1.1", - "chalk": "1.1.3", - "css-loader": "0.28.7", - "dotenv": "4.0.0", - "dotenv-expand": "4.2.0", - "eslint": "4.10.0", - "eslint-config-react-app": "^2.1.0", - "eslint-loader": "1.9.0", - "eslint-plugin-flowtype": "2.39.1", - "eslint-plugin-import": "2.8.0", - "eslint-plugin-jsx-a11y": "5.1.1", - "eslint-plugin-react": "7.4.0", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.5", - "fs-extra": "3.0.1", - "html-webpack-plugin": "2.29.0", - "jest": "20.0.4", - "object-assign": "4.1.1", - "postcss-flexbugs-fixes": "3.2.0", - "postcss-loader": "2.0.8", - "promise": "8.0.1", - "raf": "3.4.0", - "react-dev-utils": "^5.0.2", - "resolve": "1.6.0", - "style-loader": "0.19.0", - "sw-precache-webpack-plugin": "0.11.4", - "url-loader": "0.6.2", - "webpack": "3.8.1", - "webpack-dev-server": "2.11.3", - "webpack-manifest-plugin": "1.3.2", - "whatwg-fetch": "2.0.3" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" }, "bin": { - "react-scripts": "bin/react-scripts.js" + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "fsevents": "^1.1.3" + "node": ">= 10.12.0" } }, - "node_modules/react-scripts/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, - "node_modules/react-scripts/node_modules/ansi-styles": { + "node_modules/node-libs-browser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "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_modules/react-scripts/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dependencies": { + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-releases": { + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" + }, + "node_modules/node-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", + "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-sass/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", @@ -13730,7 +14715,7 @@ "node": ">=0.10.0" } }, - "node_modules/react-scripts/node_modules/strip-ansi": { + "node_modules/node-sass/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", @@ -13741,7 +14726,7 @@ "node": ">=0.10.0" } }, - "node_modules/react-scripts/node_modules/supports-color": { + "node_modules/node-sass/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", @@ -13749,267 +14734,295 @@ "node": ">=0.8.0" } }, - "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "node_modules/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==", "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/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=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dependencies": { - "locate-path": "^2.0.0" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dependencies": { - "p-limit": "^1.1.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/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=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/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==", - "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" - } + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, - "node_modules/readable-stream/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dependencies": { - "minimatch": "3.0.3" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dependencies": { - "brace-expansion": "^1.0.0" + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/object-copy/node_modules/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=", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "node_modules/object-copy/node_modules/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=", "dependencies": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/reduce-css-calc/node_modules/balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - }, - "node_modules/reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "balanced-match": "^1.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "node_modules/object-copy/node_modules/is-descriptor/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dependencies": { - "is-equal-shallow": "^0.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/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==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regex-not/node_modules/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==", + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "dependencies": { - "is-plain-object": "^2.0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/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==", + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14018,490 +15031,552 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "node_modules/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==", "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "node_modules/object.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dependencies": { - "rc": "^1.0.1" + "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dependencies": { - "jsesc": "~0.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "node_modules/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==", "engines": { - "node": ">= 0.10" + "node": ">= 0.8" } }, - "node_modules/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=" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dependencies": { - "ansi-regex": "^2.0.0" + "is-wsl": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "engines": { - "node": ">=0.10" + "node": ">=4" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "dependencies": { - "is-finite": "^1.0.0" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "webpack": "^4.0.0" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "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" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { - "node": ">= 6" + "node": ">= 0.8.0" } }, - "node_modules/request/node_modules/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==", + "node_modules/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==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" + "url-parse": "^1.4.3" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/resolve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", - "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", - "dependencies": { - "path-parse": "^1.0.5" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "resolve-from": "^3.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "retry": "^0.12.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "node_modules/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==", "dependencies": { - "align-text": "^0.1.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { - "node": ">=0.12.0" + "node": ">= 0.8" } }, - "node_modules/rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "node_modules/rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dependencies": { - "rx-lite": "*" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/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==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/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==" }, - "node_modules/sane": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", - "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dependencies": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" - }, - "bin": { - "sane": "src/cli.js" - }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">=0.6.0" + "node": ">=8" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/sane/node_modules/bser": { + "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", - "dependencies": { - "node-int64": "^0.4.0" + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" } }, - "node_modules/sane/node_modules/fb-watchman": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "node_modules/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==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dependencies": { - "bser": "1.0.2" + "isarray": "0.0.1" } }, - "node_modules/sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" } }, - "node_modules/sass-graph/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "engines": { - "node": ">=6" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sass-graph/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "engines": { "node": ">=6" } }, - "node_modules/sass-graph/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/sass-graph/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/sass-graph/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dependencies": { - "locate-path": "^3.0.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "p-locate": "^3.0.0", + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", "path-exists": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/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==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "p-limit": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/path-exists": { + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", @@ -14509,3649 +15584,9610 @@ "node": ">=4" } }, - "node_modules/sass-graph/node_modules/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==", + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "ansi-regex": "^4.1.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/sass-graph/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" } }, - "node_modules/schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dependencies": { - "ajv": "^5.0.0" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" }, "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" + "node": ">= 0.12.0" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "ms": "^2.1.1" } }, - "node_modules/schema-utils/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "node_modules/postcss": { + "version": "7.0.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.38.tgz", + "integrity": "sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ==", + "dependencies": { + "nanocolors": "^0.2.2", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "node_modules/scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "node_modules/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==", "dependencies": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" } }, - "node_modules/scss-tokenizer/node_modules/source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "node_modules/postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", "dependencies": { - "amdefine": ">=0.0.4" + "postcss": "^7" }, "engines": { - "node": ">=0.8.0" + "node": ">=8.0.0" + }, + "peerDependencies": { + "browserslist": "^4" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "node_modules/selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "node_modules/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==", "dependencies": { - "node-forge": "^0.10.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, - "node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "bin": { - "semver": "bin/semver.js" + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "node_modules/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==", "dependencies": { - "semver": "^5.0.3" + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "node_modules/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==", "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" + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.0.0" } }, - "node_modules/send/node_modules/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==" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "node_modules/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==", "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" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.0.0" } }, - "node_modules/serve-index/node_modules/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=", + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "node_modules/postcss-colormin/node_modules/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==" }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.9.0" } }, - "node_modules/serviceworker-cache-polyfill": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", - "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "node_modules/postcss-convert-values/node_modules/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==" }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "postcss": "^7.0.14" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/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==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/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==", "dependencies": { - "shebang-regex": "^3.0.0" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "node_modules/postcss-custom-selectors/node_modules/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==", "dependencies": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/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==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "node_modules/postcss-dir-pseudo-class/node_modules/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==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { "node": ">=4" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/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==", "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" + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/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==", "dependencies": { - "is-descriptor": "^1.0.0" + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/snapdragon-node/node_modules/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==", + "node_modules/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==", "dependencies": { - "kind-of": "^6.0.0" + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "node_modules/postcss-double-position-gradients": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "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==", "dependencies": { - "kind-of": "^6.0.0" + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/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==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/snapdragon-node/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" + "node_modules/postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "dependencies": { + "postcss": "^7.0.26" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/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==", "dependencies": { - "kind-of": "^3.2.0" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/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==", "dependencies": { - "is-buffer": "^1.1.5" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "node_modules/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==", "dependencies": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "postcss": "^7.0.2" } }, - "node_modules/sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "node_modules/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==", "dependencies": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/sockjs/node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "node_modules/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==", "dependencies": { - "websocket-driver": ">=0.5.1" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0.0" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dependencies": { + "postcss": "^7.0.2" } }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "node_modules/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==", "dependencies": { - "is-plain-obj": "^1.0.0" + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/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==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/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==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/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==", + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "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" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/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==", + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dependencies": { - "source-map": "^0.5.6" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/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==" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/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==" - }, - "node_modules/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==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" - }, - "node_modules/spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "engines": [ - "node >= 0.7.0" - ], + "node_modules/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==", "dependencies": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dependencies": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/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==", + "node_modules/postcss-loader/node_modules/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==", "dependencies": { - "extend-shallow": "^3.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/postcss-loader/node_modules/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==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/split-string/node_modules/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==", + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "dependencies": { - "is-plain-object": "^2.0.4" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "node_modules/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==", "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" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "node_modules/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==", "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dependencies": { - "readable-stream": "^2.0.1" - } + "node_modules/postcss-merge-longhand/node_modules/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==" }, - "node_modules/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==", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "node_modules/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==", + "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" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/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==", + "node_modules/postcss-merge-rules/node_modules/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==", "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" - } - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/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==", "dependencies": { - "safe-buffer": "~5.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/string_decoder/node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/postcss-minify-font-values/node_modules/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==" }, - "node_modules/string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "node_modules/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==", "dependencies": { - "strip-ansi": "^3.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/postcss-minify-gradients/node_modules/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==" + }, + "node_modules/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==", + "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" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/postcss-minify-params/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "ansi-regex": "^2.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/postcss-minify-selectors/node_modules/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==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "postcss": "^7.0.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/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==", + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dependencies": { - "ansi-regex": "^3.0.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { + "node_modules/postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "engines": { - "node": ">=4" + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "dependencies": { - "is-utf8": "^0.2.0" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "node_modules/postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "dependencies": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/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==", + "node_modules/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==", "dependencies": { - "min-indent": "^1.0.0" + "postcss": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", - "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", + "node_modules/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==", "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">= 0.12.0" + "node": ">=6.9.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/postcss-normalize-display-values/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "has-flag": "^3.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "node_modules/postcss-normalize-positions/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "bin": { - "svgo": "bin/svgo" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/svgo/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/postcss-normalize-repeat-style/node_modules/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==" }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "node_modules/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==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/sw-precache": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", - "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", - "deprecated": "Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw", + "node_modules/postcss-normalize-string/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "dom-urls": "^1.1.0", - "es6-promise": "^4.0.5", - "glob": "^7.1.1", - "lodash.defaults": "^4.2.0", - "lodash.template": "^4.4.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "pretty-bytes": "^4.0.2", - "sw-toolbox": "^3.4.0", - "update-notifier": "^2.3.0" - }, - "bin": { - "sw-precache": "cli.js" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache-webpack-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", - "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", + "node_modules/postcss-normalize-timing-functions/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "del": "^2.2.2", - "sw-precache": "^5.1.1", - "uglify-js": "^3.0.13" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=4.0.0" - }, - "peerDependencies": { - "webpack": "^1 || ^2 || ^2.1.0-beta || ^2.2.0-beta || ^3" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/postcss-normalize-unicode/node_modules/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==" }, - "node_modules/sw-precache/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/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==", "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, + "node_modules/postcss-normalize-url/node_modules/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==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/sw-precache/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/postcss-normalize-url/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "repeating": "^2.0.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/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=", + "node_modules/postcss-normalize-whitespace/node_modules/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==" + }, + "node_modules/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==", "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" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/postcss-ordered-values/node_modules/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==" }, - "node_modules/sw-precache/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "node_modules/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==", "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "postcss": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/sw-precache/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/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==", "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" + "postcss": "^7.0.2" } }, - "node_modules/sw-precache/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", "dependencies": { - "pinkie-promise": "^2.0.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/sw-precache/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/sw-precache/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/sw-precache/node_modules/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=", + "node_modules/postcss-pseudo-class-any-link/node_modules/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==", "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/sw-precache/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "node_modules/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==", "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "node_modules/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==", "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/sw-precache/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/postcss-reduce-transforms/node_modules/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==" }, - "node_modules/sw-toolbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", - "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", - "deprecated": "Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw", + "node_modules/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==", "dependencies": { - "path-to-regexp": "^1.0.1", - "serviceworker-cache-polyfill": "^4.0.0" + "postcss": "^7.0.2" } }, - "node_modules/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==" - }, - "node_modules/table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "node_modules/postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", "dependencies": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "postcss": "^8.1.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", - "engines": { - "node": ">=0.6" - } + "node_modules/postcss-safe-parser/node_modules/nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.8.tgz", + "integrity": "sha512-GT5bTjjZnwDifajzczOC+r3FI3Cu+PgPvrsjhQdRqa2kTJ4968/X9CUce9xttIB0xOs5c6xf0TCWZo/y9lF6bA==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "nanocolors": "^0.2.2", + "nanoid": "^3.1.25", + "source-map-js": "^0.6.2" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node": "^10 || ^12 || >=14" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "node_modules/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==", "dependencies": { - "execa": "^0.7.0" - }, - "engines": { - "node": ">=4" + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" } }, - "node_modules/test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "node_modules/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==", "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" + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" } }, - "node_modules/test-exclude/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/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==", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/test-exclude/node_modules/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=", + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "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" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/test-exclude/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/postcss-svgo/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "error-ex": "^1.2.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/test-exclude/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "pinkie-promise": "^2.0.0" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.14.4" } }, - "node_modules/test-exclude/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/postcss/node_modules/nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" }, - "node_modules/test-exclude/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/test-exclude/node_modules/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=", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/test-exclude/node_modules/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=" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "engines": { "node": ">=0.10.0" } }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" + "node": ">=6" }, - "engines": { - "node": ">=0.6.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, - "node_modules/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=", + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dependencies": { - "kind-of": "^3.0.2" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "is-buffer": "^1.1.5" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/pretty-format/node_modules/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==", "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/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, - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/pretty-format/node_modules/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==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "engines": { - "node": ">=8.0" + "node": ">= 0.6.0" } }, - "node_modules/to-regex-range/node_modules/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, + "node_modules/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==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { - "node": ">=0.12.0" + "node": ">=0.4.0" } }, - "node_modules/to-regex/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "asap": "~2.0.6" } }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/to-regex/node_modules/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==", + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, - "node_modules/to-regex/node_modules/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==", + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", "dependencies": { - "kind-of": "^6.0.0" + "react-is": "^16.3.2", + "warning": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": ">=0.14.0" } }, - "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/prop-types-extra/node_modules/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==" + }, + "node_modules/prop-types/node_modules/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==" + }, + "node_modules/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==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/to-regex/node_modules/is-extendable": { + "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, - "node_modules/to-regex/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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" } }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" + "node_modules/public-encrypt/node_modules/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==" }, - "node_modules/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==", + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "engines": { - "node": ">=8" + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dependencies": { - "glob": "^7.1.2" + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" } }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "engines": { - "node": "*" + "node": ">=0.6" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dependencies": { - "prelude-ls": "~1.1.2" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { - "node": ">= 0.6" + "node": ">=0.4.x" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/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==", - "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "engines": { - "node": ">=0.8.0" + "node": ">=0.4.x" } }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "node_modules/uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "hasInstallScript": true, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "dependencies": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - }, - "peerDependencies": { - "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0" + "performance-now": "^2.1.0" } }, - "node_modules/uglifyjs-webpack-plugin/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "engines": { - "node": ">=0.10.0" + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/uglifyjs-webpack-plugin/node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/uglifyjs-webpack-plugin/node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "node_modules/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==", "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" + "node": ">= 0.8" } }, - "node_modules/uglifyjs-webpack-plugin/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "engines": { - "node": ">=0.4.0" + "node": ">= 0.8" } }, - "node_modules/uglifyjs-webpack-plugin/node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "node_modules/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==", "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "node_modules/react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "node_modules/react-bootstrap": { + "version": "2.0.0-beta.4", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.0.0-beta.4.tgz", + "integrity": "sha512-ETCvuZV78orCqGg4XA4WrhytXxTcnvshPDveSc3uK2mvnj6IRQue5O5188xsazbD3nnhX52T63uQjM4HjeRBEw==", "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", + "@babel/runtime": "^7.14.0", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.26", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.14.8", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.1.1", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" } }, - "node_modules/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==", + "node_modules/react-bootstrap/node_modules/@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "regenerator-runtime": "^0.13.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "node_modules/react-d3-tree": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.1.1.tgz", + "integrity": "sha512-PSy1UZG8CQ/fhqtk8ZGigBT/D2NQkS0vTYis/0ZNZxxIqtf0SAEu0VFdT8tvEXsmnuK9+6iAeSRchbqj59WvWg==", + "dependencies": { + "@bkrem/react-transition-group": "^1.3.1", + "@types/d3-hierarchy": "^1.1.8", + "clone": "^2.1.1", + "d3-hierarchy": "^1.1.9", + "d3-selection": "^1.4.2", + "d3-shape": "^1.3.7", + "d3-zoom": "^1.8.3", + "dequal": "^2.0.2", + "uuid": "^8.3.1" + }, + "peerDependencies": { + "react": "16.x || 17.x", + "react-dom": "16.x || 17.x" + } }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + "node_modules/react-d3-tree/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" }, - "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dependencies": { - "crypto-random-string": "^1.0.0" + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">= 4.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "node_modules/react-dev-utils/node_modules/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==", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/react-dev-utils/node_modules/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==", "dependencies": { - "isarray": "1.0.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/unset-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/react-dev-utils/node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=8" } }, - "node_modules/update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": "17.0.2" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/react-highlight": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.14.0.tgz", + "integrity": "sha512-kWE+KXOXidS7SABhVopOgMnowbI3RAfeGZbnrduLNlWrYAED8sycL9l/Fvw3w0PFpIIawB7mRDnyhDcM/cIIGA==", "dependencies": { - "punycode": "^2.1.0" + "highlight.js": "^10.5.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/urijs": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.7.tgz", - "integrity": "sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA==" - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" + "node_modules/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==" }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "node_modules/react-overlays": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", + "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", "dependencies": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.8.6", + "@restart/hooks": "^0.3.26", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" }, "peerDependencies": { - "file-loader": "*" + "react": ">=16.3.0", + "react-dom": ">=16.3.0" } }, - "node_modules/url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "node_modules/react-overlays/node_modules/@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dependencies": { - "prepend-http": "^1.0.1" - }, + "node_modules/react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" } }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "node_modules/react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "dependencies": { - "inherits": "2.0.3" + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } + "node_modules/react-router/node_modules/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==" }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "dependencies": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, "bin": { - "uuid": "dist/bin/uuid" + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.1.3" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/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==", + "node_modules/react-scripts/node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "node": ">=6.9.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/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==" - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "dependencies": { - "makeerror": "1.0.x" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dependencies": { - "loose-envify": "^1.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", - "engines": [ - "node >=0.1.95" - ] - }, - "node_modules/watchpack": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.1.tgz", - "integrity": "sha512-1OeW6LucExk7h6lBuCr1isK5261Tf0PHNRG9tZjg2WKUsSkPwvyv37d7mgAUk1rZjxxaL/6WttSGMUY2hn/20g==", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, - "optionalDependencies": { - "chokidar": "^3.4.0", - "chokidar2": "file:./chokidar2" + "engines": { + "node": ">=4" } }, - "node_modules/watchpack/chokidar2": { - "optional": true - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" - }, - "node_modules/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==" - }, - "node_modules/webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", - "dependencies": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "bin": { - "webpack": "bin/webpack.js" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=4" } }, - "node_modules/webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dependencies": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.6" - }, - "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz", - "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "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.17.4", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "p-try": "^1.0.0" }, "engines": { - "node": ">=4.7" - }, - "peerDependencies": { - "webpack": "^2.2.0 || ^3.0.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "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" + "pify": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/camelcase": { + "node_modules/read-pkg/node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "node_modules/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==", "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" + "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" } }, - "node_modules/webpack-dev-server/node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" + "node_modules/readable-stream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, "dependencies": { - "ms": "^2.1.1" + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "minimatch": "3.0.4" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/del": { + "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "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" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/webpack-dev-server/node_modules/del/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, - "node_modules/webpack-dev-server/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "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" + "regenerate": "^1.4.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dependencies": { - "ms": "2.0.0" + "@babel/runtime": "^7.8.4" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dependencies": { - "is-descriptor": "^0.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/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=", + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/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==", "dependencies": { - "kind-of": "^3.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/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=", + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "dependencies": { - "kind-of": "^3.0.2" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dependencies": { - "is-buffer": "^1.1.5" + "jsesc": "~0.5.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/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==", + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "node_modules/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=" }, - "node_modules/webpack-dev-server/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "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" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" } }, - "node_modules/webpack-dev-server/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, + "node_modules/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==", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/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==" - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" } }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "is-extglob": "^2.1.0" + "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" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/webpack-dev-server/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "node_modules/request/node_modules/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==", "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.12" } }, - "node_modules/webpack-dev-server/node_modules/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==", - "dependencies": { - "kind-of": "^6.0.0" - }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/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=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/is-data-descriptor": { + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "dependencies": { - "kind-of": "^6.0.0" + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/webpack-dev-server/node_modules/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==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "dependencies": { - "is-plain-object": "^2.0.4" + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/webpack-dev-server/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/resolve-url-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/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=", + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dependencies": { - "number-is-nan": "^1.0.0" - }, + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/webpack-dev-server/node_modules/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==", + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dependencies": { - "is-extglob": "^2.1.1" + "minimist": "^1.2.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dependencies": { - "kind-of": "^3.0.2" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dependencies": { - "is-buffer": "^1.1.5" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/webpack-dev-server/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/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=", + "node_modules/resolve-url-loader/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "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" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "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" - }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "engines": { - "node": ">=0.10.0" + "node": ">=0.12" } }, - "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/webpack-dev-server/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "convert-source-map": "^0.3.3", + "css": "^2.0.0" } }, - "node_modules/webpack-dev-server/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" }, - "node_modules/webpack-dev-server/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" }, - "node_modules/webpack-dev-server/node_modules/read-pkg-up": { + "node_modules/rgb-regex": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" }, - "node_modules/webpack-dev-server/node_modules/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=" + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "rollup": "dist/bin/rollup" } }, - "node_modules/webpack-dev-server/node_modules/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=", + "node_modules/rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "node_modules/webpack-dev-server/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "peerDependencies": { + "@babel/core": "7 || ^7.0.0-rc.2", + "rollup": ">=0.60.0 <3" } }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "node_modules/rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", "dependencies": { - "camelcase": "^3.0.0" + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "peerDependencies": { + "rollup": ">=0.66.0 <3" } }, - "node_modules/webpack-manifest-plugin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dependencies": { - "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=0.10" - }, - "peerDependencies": { - "webpack": "1 || 2 || 3" + "node": ">= 6" } }, - "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "randombytes": "^2.1.0" } }, - "node_modules/webpack-manifest-plugin/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dependencies": { - "glob": "^7.1.3" + "has-flag": "^3.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=6" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "estree-walker": "^0.6.1" } }, - "node_modules/webpack-sources/node_modules/source-map": { + "node_modules/rollup-pluginutils/node_modules/estree-walker": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "engines": { - "node": ">=0.10.0" + "node": "6.* || >= 7.*" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "peerDependencies": { - "ajv": "^5.0.0" - } - }, - "node_modules/webpack/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "node_modules/webpack/node_modules/get-caller-file": { + "node_modules/run-queue": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/webpack/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "engines": { - "node": ">=0.10.0" + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" } }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "node_modules/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==" }, - "node_modules/webpack/node_modules/os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dependencies": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "engines": { - "node": ">=4" + "ret": "~0.1.10" } }, - "node_modules/webpack/node_modules/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=" + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/webpack/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dependencies": { - "has-flag": "^2.0.0" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" }, "engines": { - "node": ">=4" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/webpack/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/webpack/node_modules/yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dependencies": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.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", - "yargs-parser": "^7.0.0" - } - }, - "node_modules/webpack/node_modules/yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dependencies": { - "camelcase": "^4.1.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "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" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/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==", - "dependencies": { - "iconv-lite": "0.4.24" + "node": ">=0.10.0" } }, - "node_modules/whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - }, - "node_modules/whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "is-extendable": "^0.1.0" + }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">= 8" + "node": ">=4.8" } }, - "node_modules/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==", + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "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" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "string-width": "^1.0.2 || 2" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/widest-line": { + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "string-width": "^2.1.1" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/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==", + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "node_modules/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==", + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "errno": "~0.1.7" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/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=", + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dependencies": { - "number-is-nan": "^1.0.0" + "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" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "remove-trailing-separator": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/sane/node_modules/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=", "dependencies": { - "ansi-regex": "^2.0.0" + "path-key": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } }, - "node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dependencies": { - "mkdirp": "^0.5.1" + "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/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==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/sane/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, "engines": { - "node": ">=0.4" + "node": ">=0.10.0" } }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "node_modules/sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "node_modules/sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" } }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "node_modules/sass-graph/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/sass-graph/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "engines": { - "node": ">=0.10.0" + "node_modules/sass-graph/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/yargs/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/sass-graph/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/sass-graph/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/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==" - }, - "node_modules/yargs/node_modules/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=", + "node_modules/sass-graph/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "number-is-nan": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/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=", + "node_modules/sass-graph/node_modules/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==", "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" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, + "node_modules/sass-graph/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/yargs/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/sass-graph/node_modules/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==", "dependencies": { - "pinkie-promise": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/sass-graph/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "node_modules/sass-graph/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/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=", + "node_modules/sass-graph/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "node_modules/yargs/node_modules/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=" + "node_modules/sass-graph/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } }, - "node_modules/yargs/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/sass-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "ansi-regex": "^2.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/yargs/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "node_modules/yargs/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - } - }, - "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" + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" } }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" - }, - "@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" + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, - "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "requires": { - "regenerator-runtime": "^0.13.4" + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "@babel/runtime-corejs3": { - "version": "7.14.7", + "node_modules/scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dependencies": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/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==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/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=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/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==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/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==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/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==" + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/spdy-transport/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/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==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/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==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "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" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/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==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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==" + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/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==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dependencies": { + "glob": "^7.1.2" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/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==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/url/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/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==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/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, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "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" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "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" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/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=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "dependencies": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "2 || 3 || 4" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/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==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "node_modules/workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "dependencies": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/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==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/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==" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/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==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "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==" + } + } + }, + "@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "requires": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "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.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@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-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": { + "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.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@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.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@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.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@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" + } + }, + "@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@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.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + } + }, + "@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.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@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.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@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-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "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.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "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.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "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.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "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-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.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@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.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@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.15.6", + "@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.15.4", + "@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.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@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.15.4", + "@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.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@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.15.4", + "@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.6", + "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": { + "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.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", "requires": { - "core-js-pure": "^3.15.0", - "regenerator-runtime": "^0.13.4" + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@bkrem/react-transition-group": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.1.tgz", + "integrity": "sha512-AJBMFURKY6VcenLCb2RTRivIy3Yy/JOUWHt3XjL4lDqCzdOryWxaa4HCIUWlhvn462p/gV9QbEihKmNZfvwDKA==", + "requires": { + "chain-function": "^1.0.0", + "dom-helpers": "^3.3.1", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.6", + "react-lifecycles-compat": "^3.0.4", + "warning": "^3.0.0" + }, + "dependencies": { + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, - "@bkrem/react-transition-group": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.1.tgz", - "integrity": "sha512-AJBMFURKY6VcenLCb2RTRivIy3Yy/JOUWHt3XjL4lDqCzdOryWxaa4HCIUWlhvn462p/gV9QbEihKmNZfvwDKA==", + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "requires": { - "chain-function": "^1.0.0", - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.6", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@babel/runtime": "^7.1.2" + "color-convert": "^2.0.1" } }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "loose-envify": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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" } } } @@ -18213,6 +25249,84 @@ } } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "@popperjs/core": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", @@ -18221,7 +25335,8 @@ "@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "requires": {} }, "@restart/hooks": { "version": "0.3.27", @@ -18231,6 +25346,178 @@ "dequal": "^2.0.2" } }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, "@testing-library/jest-dom": { "version": "5.14.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", @@ -18411,16 +25698,94 @@ } } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, "@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/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/d3-hierarchy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, "@types/invariant": { "version": "2.2.34", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", @@ -18456,6 +25821,21 @@ "pretty-format": "^26.0.0" } }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -18471,11 +25851,26 @@ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==" + }, "@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/react": { "version": "17.0.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", @@ -18494,11 +25889,34 @@ "@types/react": "*" } }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, "@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/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, "@types/testing-library__jest-dom": { "version": "5.14.0", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", @@ -18507,11 +25925,63 @@ "@types/jest": "*" } }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "@types/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, + "@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "@types/yargs": { "version": "15.0.14", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", @@ -18525,10 +25995,273 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, + "@typescript-eslint/eslint-plugin": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz", + "integrity": "sha512-+OWTuWRSbWI1KDK8iEyG/6uK2rTm3kpS38wuVifGUTDB6kjEuNrzBI1MUtxnkneuWG/23QehABe2zHHrj+4yuA==", + "requires": { + "@typescript-eslint/experimental-utils": "4.32.0", + "@typescript-eslint/scope-manager": "4.32.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz", + "integrity": "sha512-WLoXcc+cQufxRYjTWr4kFt0DyEv6hDgSaFqYhIzQZ05cF+kXfqXdUh+//kgquPJVUBbL3oQGKQxwPbLxHRqm6A==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.32.0", + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/typescript-estree": "4.32.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.32.0.tgz", + "integrity": "sha512-lhtYqQ2iEPV5JqV7K+uOVlPePjClj4dOw7K4/Z1F2yvjIUvyr13yJnDzkK6uon4BjHYuHy3EG0c2Z9jEhFk56w==", + "requires": { + "@typescript-eslint/scope-manager": "4.32.0", + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/typescript-estree": "4.32.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz", + "integrity": "sha512-DK+fMSHdM216C0OM/KR1lHXjP1CNtVIhJ54kQxfOE6x8UGFAjha8cXgDMBEIYS2XCYjjCtvTkjQYwL3uvGOo0w==", + "requires": { + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/visitor-keys": "4.32.0" + } + }, + "@typescript-eslint/types": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.32.0.tgz", + "integrity": "sha512-LE7Z7BAv0E2UvqzogssGf1x7GPpUalgG07nGCBYb1oK4mFsOiFC/VrSMKbZQzFJdN2JL5XYmsx7C7FX9p9ns0w==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz", + "integrity": "sha512-tRYCgJ3g1UjMw1cGG8Yn1KzOzNlQ6u1h9AmEtPhb5V5a1TmiHWcRyF/Ic+91M4f43QeChyYlVTcf3DvDTZR9vw==", + "requires": { + "@typescript-eslint/types": "4.32.0", + "@typescript-eslint/visitor-keys": "4.32.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz", + "integrity": "sha512-e7NE0qz8W+atzv3Cy9qaQ7BTLwWsm084Z0c4nIO2l3Bp6u9WIgdqCgyPyV5oSPDMIW3b20H59OOCmVk3jw3Ptw==", + "requires": { + "@typescript-eslint/types": "4.32.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + "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", @@ -18545,59 +26278,60 @@ } }, "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" } }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } + "debug": "4" } }, - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } }, "ajv": { "version": "6.12.6", @@ -18610,32 +26344,18 @@ "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==", + "requires": {} + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.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" - } - } - } - }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -18646,18 +26366,18 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" - } + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "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==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } }, "ansi-html": { "version": "0.0.7", @@ -18665,9 +26385,9 @@ "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==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -18678,20 +26398,12 @@ } }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { - "default-require-extensions": "^1.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "aproba": { @@ -18725,13 +26437,15 @@ "@babel/runtime-corejs3": "^7.10.2" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, "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" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", @@ -18743,21 +26457,6 @@ "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-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -18775,33 +26474,41 @@ "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" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "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=" + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } }, "arrify": { "version": "1.0.1", @@ -18868,713 +26575,320 @@ "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=" - }, - "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-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "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": "7.1.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", - "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", - "requires": { - "browserslist": "^2.5.1", - "caniuse-lite": "^1.0.30000748", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "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": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "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": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "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.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" - } - }, - "babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", - "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.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" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", - "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^20.0.3" - } - }, - "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "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-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", - "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.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" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "babel-plugin-jest-hoist": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", - "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "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-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } + "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=" }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "babel-runtime": "^6.22.0" + "lodash": "^4.17.14" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } + "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==" }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } + "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==" }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "autoprefixer": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.7.tgz", + "integrity": "sha512-7Hg99B1eTH5+LgmUBUSmov1Z3bsggQJS7v3IMGo6wcScnbRuvtMc871J9J+4bSbIqa9LSX/zypFXJ8sXHpMJeQ==", "requires": { - "babel-runtime": "^6.22.0" + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "nanocolors": "^0.2.8", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" + } } }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "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=" }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "axe-core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz", + "integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==" }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "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==" + } } }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "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": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babylon": "^6.18.0" } }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } + } } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "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" + } + }, + "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" + } + } } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "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": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "object.assign": "^4.1.0" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "requires": { - "babel-runtime": "^6.22.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" } }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "babel-runtime": "^6.22.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } } }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } + "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==", + "requires": {} }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "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-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "@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-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" } }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "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-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "@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", @@ -19584,112 +26898,234 @@ "babel-runtime": "^6.26.0" } }, - "babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.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-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "requires": { - "babel-runtime": "^6.22.0" + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + }, + "dependencies": { + "@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" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -19697,69 +27133,6 @@ } } }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-jest": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", - "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", - "requires": { - "babel-plugin-jest-hoist": "^20.0.3" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-preset-react-app": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz", - "integrity": "sha512-/sh5Qd5T08PYa6t4kuCdKh9tXp6/m/Jwyx7PJTqugsYMfsDUJMlBXOs5EwFODHprzjWrmQ0SydnMZu9FY4MZYg==", - "requires": { - "babel-plugin-dynamic-import-node": "1.1.0", - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-react-constant-elements": "6.23.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-plugin-transform-regenerator": "6.26.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-preset-react": "6.24.1" - } - }, - "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" - } - }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -19769,6 +27142,11 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -19776,45 +27154,6 @@ } } }, - "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" - } - }, - "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" - } - }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", @@ -19836,47 +27175,16 @@ "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-descriptor": "^1.0.0" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -19898,6 +27206,17 @@ "tweetnacl": "^0.14.3" } }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -19949,6 +27268,19 @@ "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=" } } }, @@ -19973,27 +27305,14 @@ "bootstrap": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.2.tgz", - "integrity": "sha512-1Ge963tyEQWJJ+8qtXFU6wgmAVj9gweEjibUdbmcCEYsn38tVwRk8107rk2vzt6cfQcRr3SlZ8aQBqaD8aqf+Q==" + "integrity": "sha512-1Ge963tyEQWJJ+8qtXFU6wgmAVj9gweEjibUdbmcCEYsn38tVwRk8107rk2vzt6cfQcRr3SlZ8aQBqaD8aqf+Q==", + "requires": {} }, "bootstrap-icons": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.5.0.tgz", "integrity": "sha512-44feMc7DE1Ccpsas/1wioN8ewFJNquvi5FewA06wLnqct7CwMdGDVy41ieHaacogzDqLfG8nADIvMNp9e4bfbA==" }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -20004,13 +27323,11 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "fill-range": "^7.0.1" } }, "brorand": { @@ -20018,20 +27335,10 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserify-aes": { "version": "1.2.0", @@ -20118,12 +27425,15 @@ } }, "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", + "escalade": "^3.1.1", + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" } }, "bser": { @@ -20160,9 +27470,9 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" }, "builtin-status-codes": { "version": "3.0.0", @@ -20174,6 +27484,38 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -20188,13 +27530,6 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "call-bind": { @@ -20206,39 +27541,47 @@ "get-intrinsic": "^1.0.2" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { - "callsites": "^0.2.0" + "callsites": "^2.0.0" }, "dependencies": { "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" } } }, - "callsites": { + "caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, "camelcase-keys": { "version": "6.2.2", @@ -20258,61 +27601,39 @@ } }, "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "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": "^1.3.6", - "caniuse-db": "^1.0.30000529", + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } } }, - "caniuse-db": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001259.tgz", - "integrity": "sha512-DoMAaVY4zsMKnppJ0D+JBg5eZ30L4SUFKlRemv2xiybzPo1wY0fd4EyGeHUjNxZVcPLAKHz6XXMya3MId9bl5w==" - }, "caniuse-lite": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", - "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==" + "version": "1.0.30001261", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", + "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==" }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chain-function": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", @@ -20328,10 +27649,15 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "chokidar": { "version": "3.5.2", @@ -20347,86 +27673,22 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "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" - } - }, - "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" - } - }, - "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-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" - } - }, - "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 - } } }, - "chokidar2": { - "version": "file:node_modules/watchpack/chokidar2" - }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, + "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==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", @@ -20437,55 +27699,10 @@ "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==" - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "^1.1.3" - }, - "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" - } - }, - "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=" - } - } + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" }, "class-utils": { "version": "0.3.6", @@ -20498,10 +27715,64 @@ "static-extend": "^0.1.1" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "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" + }, + "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-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==" } } }, @@ -20525,63 +27796,47 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "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==" + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "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" - } + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } } } @@ -20597,10 +27852,12 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "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" } }, @@ -20609,6 +27866,11 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -20619,20 +27881,12 @@ } }, "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - } + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -20649,28 +27903,14 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "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": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -20680,9 +27920,14 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "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", @@ -20694,6 +27939,14 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -20714,6 +27967,21 @@ "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": { @@ -20732,18 +28000,10 @@ "typedarray": "^0.0.6" } }, - "configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", - "requires": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } + "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", @@ -20765,11 +28025,6 @@ "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", @@ -20783,11 +28038,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -20806,15 +28056,54 @@ "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" + }, + "dependencies": { + "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" + } + } + } + }, "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==" + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.1.tgz", + "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==" + }, + "core-js-compat": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.1.tgz", + "integrity": "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==", + "requires": { + "browserslist": "^4.17.1", + "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.15.2", @@ -20827,27 +28116,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.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" - } - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "create-ecdh": { @@ -20866,14 +28143,6 @@ } } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -20932,95 +28201,99 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, + "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" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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" + } + }, "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-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "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" + } + }, + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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" - } + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + } + }, + "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" + } + }, "css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -21033,13 +28306,25 @@ "nth-check": "^2.0.0" } }, - "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==", + "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-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": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "css-what": { @@ -21052,155 +28337,170 @@ "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": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" + "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-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=" - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "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" + } + }, + "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" + } + }, + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" } }, - "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" - } + "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==" }, - "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" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { - "cssom": "0.3.x" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } } }, "csstype": { @@ -21208,13 +28508,10 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d": { "version": "1.0.1", @@ -21320,12 +28617,22 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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.0.0" + "ms": "2.1.2" } }, "decamelize": { @@ -21349,11 +28656,21 @@ } } }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, "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=" }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -21367,22 +28684,103 @@ "regexp.prototype.flags": "^1.2.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "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=", + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { - "strip-bom": "^2.0.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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=" + }, + "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" + } + } } }, "define-properties": { @@ -21394,32 +28792,60 @@ } }, "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "^0.1.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, "dependencies": { + "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" + } + }, + "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=" + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -21464,13 +28890,10 @@ "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-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, "detect-node": { "version": "2.1.0", @@ -21484,13 +28907,23 @@ "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": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -21513,6 +28946,14 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -21536,9 +28977,9 @@ } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { "esutils": "^2.0.2" } @@ -21575,14 +29016,6 @@ "entities": "^2.0.0" } }, - "dom-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", - "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", - "requires": { - "urijs": "^1.16.1" - } - }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -21593,6 +29026,21 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, "domhandler": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", @@ -21611,33 +29059,55 @@ "domhandler": "^4.2.0" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { - "is-obj": "^1.0.0" + "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": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "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", @@ -21653,10 +29123,15 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, "electron-to-chromium": { - "version": "1.3.845", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.845.tgz", - "integrity": "sha512-y0RorqmExFDI4RjLEC6j365bIT5UAXf9WIRcknvSFHVhbC/dRnCgJnPA3DUUW6SCC85QGKEafgqcHJ6uPdEP1Q==" + "version": "1.3.854", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", + "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==" }, "elliptic": { "version": "6.5.4", @@ -21679,10 +29154,15 @@ } } }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, "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==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "emojis-list": { "version": "3.0.0", @@ -21694,15 +29174,41 @@ "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": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "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.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "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" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" } }, "entities": { @@ -21731,10 +29237,18 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "es-abstract": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", - "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", + "version": "1.18.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.7.tgz", + "integrity": "sha512-uFG1gyVX91tZIiDWNmPsL8XNpiCk/6tkB7MZphoSJflS4w+KgWyQ2gjCVDnsPxFAo9WjRXG3eqONNYdfbJjAtw==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -21786,47 +29300,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -21836,16 +29309,10 @@ "ext": "^1.1.2" } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } + "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", @@ -21858,171 +29325,213 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "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" + } + }, + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", - "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", - "requires": { - "ajv": "^5.2.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.0.1", - "doctrine": "^2.0.0", - "eslint-scope": "^3.7.1", - "espree": "^3.5.1", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^9.17.0", - "ignore": "^3.3.3", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", + "optionator": "^0.9.1", "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "color-convert": "^2.0.1" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "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": { - "ms": "^2.1.1" + "color-name": "~1.1.4" } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "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==" }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "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==" + } } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "shebang-regex": "^1.0.0" + "ansi-regex": "^5.0.1" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "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": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" } } }, "eslint-config-react-app": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz", - "integrity": "sha512-8QZrKWuHVC57Fmu+SsKAVxnI9LycZl7NFQ4H9L+oeISuCXhYdXqsOOIVSjQFW6JF5MXZLFE+21Syhd7mF1IRZQ==", - "requires": {} + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -22041,11 +29550,6 @@ "ms": "^2.1.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -22057,28 +29561,6 @@ } } }, - "eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", - "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" - }, - "dependencies": { - "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" - } - } - } - }, "eslint-module-utils": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", @@ -22095,113 +29577,329 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "eslint-plugin-flowtype": { - "version": "2.39.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", - "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", + "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", "requires": { - "lodash": "^4.15.0" + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", - "requires": { - "builtin-modules": "^1.1.1", - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.1.1", - "has": "^1.0.1", - "lodash.cond": "^4.3.0", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0" + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.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=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } } } }, + "eslint-plugin-jest": { + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.5.0.tgz", + "integrity": "sha512-Cm+XdX7Nms2UXGRnivHFVcM3ZmlKheHvc9VD78iZLO1XcqB59WbVjrMSiesCbHDlToxWjMJDiJMgc1CzFE13Vg==", + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, "eslint-plugin-jsx-a11y": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", - "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "requires": { - "aria-query": "^0.7.0", - "array-includes": "^3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^1.4.0" + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + } + }, + "eslint-plugin-react": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz", + "integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.5" }, "dependencies": { - "aria-query": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", - "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", + "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" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "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==" } } }, - "eslint-plugin-react": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", - "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "requires": {} + }, + "eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", "requires": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.5.10" + "@typescript-eslint/experimental-utils": "^3.10.1" }, "dependencies": { - "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==", + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "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==" } } }, "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "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==" + } } }, "esprima": { @@ -22215,13 +29913,6 @@ "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": { @@ -22230,19 +29921,17 @@ "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==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, "esutils": { "version": "2.0.3", @@ -22254,15 +29943,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -22274,11 +29954,11 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "requires": { - "original": ">=0.0.5" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -22290,97 +29970,167 @@ "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==", + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "requires": { - "merge": "^1.2.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "cross-spawn": "^5.0.1", - "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" + "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": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ms": "2.0.0" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "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": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "is-descriptor": "^0.1.0" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "shebang-regex": "^1.0.0" + "is-extendable": "^0.1.0" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "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" + } + } + } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "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": { - "isexe": "^2.0.0" + "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" + } + } } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "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" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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=" } } }, - "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" - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "requires": { - "homedir-polyfill": "^1.0.1" + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "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" + } + }, + "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==" + } } }, "express": { @@ -22425,6 +30175,19 @@ "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=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -22433,9 +30196,9 @@ } }, "ext": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz", - "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", "requires": { "type": "^2.5.0" }, @@ -22453,40 +30216,50 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "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" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" } }, "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" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } } }, "extsprintf": { @@ -22499,6 +30272,18 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "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", @@ -22509,10 +30294,13 @@ "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==" + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } }, "faye-websocket": { "version": "0.11.4", @@ -22530,30 +30318,38 @@ "bser": "2.1.1" } }, - "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" - } + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "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=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^3.0.4" } }, "file-loader": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", - "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "file-uri-to-path": { @@ -22562,35 +30358,17 @@ "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.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "to-regex-range": "^5.0.1" } }, "finalhandler": { @@ -22605,16 +30383,71 @@ "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": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "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": "^1.0.0", - "pkg-dir": "^2.0.0" + "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-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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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": { @@ -22627,31 +30460,33 @@ } }, "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "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" - } - } + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + }, "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.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", @@ -22662,19 +30497,142 @@ "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": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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" + } + } + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -22693,14 +30651,24 @@ "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": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs-minipass": { @@ -22711,20 +30679,27 @@ "minipass": "^3.0.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.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" - } + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true }, "function-bind": { "version": "1.1.1", @@ -22792,6 +30767,11 @@ "globule": "^1.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": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -22807,15 +30787,28 @@ "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } }, "get-symbol-description": { "version": "1.0.0", @@ -22852,51 +30845,30 @@ "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" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { - "ini": "^1.3.4" + "is-glob": "^4.0.1" } }, "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "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": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "dependencies": { "which": { @@ -22910,21 +30882,21 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "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": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, "globule": { @@ -22937,24 +30909,6 @@ "minimatch": "~3.0.2" } }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -22963,39 +30917,22 @@ "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true }, "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "requires": { - "duplexer": "^0.1.1" + "duplexer": "^0.1.1", + "pify": "^4.0.1" } }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" - }, - "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" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "har-schema": { "version": "2.0.0", @@ -23016,6 +30953,11 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" }, + "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", @@ -23075,13 +31017,6 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "has-values": { @@ -23162,6 +31097,11 @@ "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==" + }, "highcharts": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.1.2.tgz", @@ -23170,7 +31110,8 @@ "highcharts-react-official": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.0.0.tgz", - "integrity": "sha512-VefJgDY2hkT9gfppsQGrRF2g5u8d9dtfHGcx2/xqiP+PkZXCqalw9xOeKVCRvJKTOh0coiDFwvVjOvB7KaGl4A==" + "integrity": "sha512-VefJgDY2hkT9gfppsQGrRF2g5u8d9dtfHGcx2/xqiP+PkZXCqalw9xOeKVCRvJKTOh0coiDFwvVjOvB7KaGl4A==", + "requires": {} }, "highlight.js": { "version": "10.7.3", @@ -23215,22 +31156,10 @@ } } }, - "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" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } + "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", @@ -23248,17 +31177,22 @@ "wbuf": "^1.1.0" } }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "html-entities": { @@ -23266,52 +31200,57 @@ "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==", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "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" + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" } }, "html-webpack-plugin": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", - "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" }, "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "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": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "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": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -23366,28 +31305,125 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "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" + } + } + } }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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" + } + } + } + }, + "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" + } + }, + "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-extglob": "^2.1.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } @@ -23407,6 +31443,20 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -23415,17 +31465,20 @@ "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=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "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": { - "postcss": "^6.0.1" + "harmony-reflect": "^1.4.6" } }, "ieee754": { @@ -23433,23 +31486,77 @@ "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": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "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": "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" + }, + "dependencies": { + "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==" + } + } }, - "import-lazy": { + "import-from": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } } }, "imurmurhash": { @@ -23467,6 +31574,11 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -23486,167 +31598,13 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "requires": { - "meow": "^3.3.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^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" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^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" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "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" - } - }, - "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" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - } + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, "internal-slot": { @@ -23659,11 +31617,6 @@ "side-channel": "^1.0.4" } }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -23672,42 +31625,32 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "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": "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" - } - } + "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" } }, "is-arguments": { @@ -23755,25 +31698,30 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "^1.0.0" - } - }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "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": { @@ -23785,21 +31733,11 @@ } }, "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=", + "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": "^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": "^6.0.0" } }, "is-date-object": { @@ -23811,20 +31749,13 @@ } }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-directory": { @@ -23832,544 +31763,1200 @@ "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-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, - "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=", + "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-primitive": "^2.0.0" + "is-plain-object": "^2.0.4" } }, - "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==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "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-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "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": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "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-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "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-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": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "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==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "requires": { - "is-extglob": "^1.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.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-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", "requires": { - "kind-of": "^3.0.2" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "is-buffer": "^1.1.5" + "color-convert": "^2.0.1" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" } } } }, - "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==", + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "requires": { - "has-tostringtag": "^1.0.0" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } + } } }, - "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=" + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } }, - "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==", + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "requires": { - "is-path-inside": "^1.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } + } } }, - "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=", + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "requires": { - "path-is-inside": "^1.0.1" + "detect-newline": "^3.0.0" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "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==", + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "requires": { - "isobject": "^3.0.1" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } } } }, - "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-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "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-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" - }, - "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-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "requires": { - "has-symbols": "^1.0.2" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" } }, - "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=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "requires": { - "isarray": "1.0.0" - } - }, - "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" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, - "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==" + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" }, - "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==", + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "requires": { - "append-transform": "^0.4.0" + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, - "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" + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" + } } } }, - "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==", + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "^1.0.0" + "has-flag": "^4.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==", + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "ms": "^2.1.1" + "color-convert": "^2.0.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "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" + } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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": { - "glob": "^7.1.3" + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.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" } } } }, - "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==", + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "requires": { - "handlebars": "^4.0.3" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, - "jest": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", - "requires": { - "jest-cli": "^20.0.4" - } + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, - "jest-changed-files": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", - "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" }, - "jest-cli": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", - "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "requires": { - "ansi-escapes": "^1.4.0", - "callsites": "^2.0.0", - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^20.0.3", - "jest-config": "^20.0.4", - "jest-docblock": "^20.0.3", - "jest-environment-jsdom": "^20.0.3", - "jest-haste-map": "^20.0.4", - "jest-jasmine2": "^20.0.4", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve-dependencies": "^20.0.3", - "jest-runtime": "^20.0.4", - "jest-snapshot": "^20.0.3", - "jest-util": "^20.0.3", - "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", - "pify": "^2.3.0", - "slash": "^1.0.0", - "string-length": "^1.0.1", - "throat": "^3.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^7.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "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" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "color-name": "~1.1.4" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "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==" }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "requires": { - "isexe": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "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" } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, - "jest-config": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "requires": { - "chalk": "^1.1.3", - "glob": "^7.1.1", - "jest-environment-jsdom": "^20.0.3", - "jest-environment-node": "^20.0.3", - "jest-jasmine2": "^20.0.4", - "jest-matcher-utils": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-validate": "^20.0.3", - "pretty-format": "^20.0.3" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.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=" + "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" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" } } }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.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=" + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "requires": { + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" }, "dependencies": { "ansi-styles": { @@ -24381,9 +32968,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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" @@ -24407,6 +32994,49 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24414,579 +33044,403 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, - "jest-docblock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" - }, - "jest-environment-jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", - "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3", - "jsdom": "^9.12.0" - } - }, - "jest-environment-node": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", - "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", - "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" - }, - "jest-haste-map": { - "version": "20.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", - "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^20.0.3", - "micromatch": "^2.3.11", - "sane": "~1.6.0", - "worker-farm": "^1.3.1" + "@types/node": "*", + "graceful-fs": "^4.2.4" } }, - "jest-jasmine2": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-matchers": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-snapshot": "^20.0.3", - "once": "^1.4.0", - "p-map": "^1.1.1" + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.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" - } - }, - "jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "color-convert": "^2.0.1" } }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^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" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "color-name": "~1.1.4" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "jest-matcher-utils": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", - "requires": { - "chalk": "^1.1.3", - "pretty-format": "^20.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - } - } + "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==" }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", - "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "requires": { - "ansi-regex": "^2.0.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "jest-matchers": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", - "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", - "requires": { - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "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" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" } } }, - "jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", - "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" - } - }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", - "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^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": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "jest-message-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", - "requires": { - "chalk": "^1.1.3", - "micromatch": "^2.3.11", - "slash": "^1.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=" - }, - "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=", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "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" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.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=" + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, - "jest-mock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" - }, - "jest-regex-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" - }, - "jest-resolve": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", - "requires": { - "browser-resolve": "^1.11.2", - "is-builtin-module": "^1.0.0", - "resolve": "^1.3.2" - } - }, - "jest-resolve-dependencies": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", - "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "requires": { - "jest-regex-util": "^20.0.3" - } - }, - "jest-runtime": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", - "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^20.0.3", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^1.1.3", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^20.0.4", - "jest-haste-map": "^20.0.4", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-util": "^20.0.3", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "strip-bom": "3.0.0", - "yargs": "^7.0.2" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.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=" + "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" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "color-name": "~1.1.4" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "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" + } } } }, - "jest-snapshot": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", - "requires": { - "chalk": "^1.1.3", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-util": "^20.0.3", - "natural-compare": "^1.4.0", - "pretty-format": "^20.0.3" + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "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" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - } + "color-convert": "^2.0.1" } }, - "jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "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": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "color-name": "~1.1.4" } }, - "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" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "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" + } } } }, - "jest-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-message-util": "^20.0.3", - "jest-mock": "^20.0.3", - "jest-validate": "^20.0.3", - "leven": "^2.1.0", - "mkdirp": "^0.5.1" + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.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=" - }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "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" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "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" + } } } }, - "jest-validate": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "requires": { - "chalk": "^1.1.3", - "jest-matcher-utils": "^20.0.3", - "leven": "^2.1.0", - "pretty-format": "^20.0.3" + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.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=" + "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" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "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" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" } }, - "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "has-flag": "^4.0.0" } + } + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.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=" } } }, @@ -25015,47 +33469,70 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "requires": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", - "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + "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-parse-even-better-errors": { "version": "2.3.1", @@ -25072,13 +33549,10 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "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" - } + "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", @@ -25091,23 +33565,22 @@ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "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": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "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", @@ -25120,9 +33593,13 @@ } }, "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "requires": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + } }, "killable": { "version": "1.0.1", @@ -25134,47 +33611,50 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", "requires": { - "package-json": "^4.0.0" + "language-subtag-registry": "~0.3.2" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "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": { - "invert-kv": "^1.0.0" + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lines-and-columns": { @@ -25183,24 +33663,30 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.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=", + "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.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -25208,75 +33694,19 @@ } } }, - "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "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" - } - } + "json5": "^2.1.2" } }, "locate-path": { @@ -25297,26 +33727,26 @@ "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.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "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.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -25334,6 +33764,11 @@ "lodash._reinterpolate": "^3.0.0" } }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -25344,11 +33779,6 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -25357,25 +33787,14 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "tslib": "^2.0.3" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -25389,18 +33808,27 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -25430,16 +33858,6 @@ "object-visit": "^1.0.0" } }, - "math-expression-evaluator": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.8.tgz", - "integrity": "sha512-9FbRY3i6U+CbHgrdNbAUaisjWTozkm1ZfupYQJiZ87NtYHk2Zh9DvxMgp/fifxVhqTLpd5fCCLossUbpZxGeKw==" - }, - "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", @@ -25450,19 +33868,16 @@ "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": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -25595,49 +34010,38 @@ } } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" - }, "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": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.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=" }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, "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" - }, - "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" - } - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, "miller-rabin": { @@ -25675,9 +34079,9 @@ } }, "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==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "min-indent": { "version": "1.0.1", @@ -25693,6 +34097,47 @@ "tiny-warning": "^1.0.3" } }, + "mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -25734,6 +34179,30 @@ "yallist": "^4.0.0" } }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -25743,6 +34212,23 @@ "yallist": "^4.0.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", @@ -25750,16 +34236,6 @@ "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" - } - } } }, "mkdirp": { @@ -25770,10 +34246,33 @@ "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" + }, + "dependencies": { + "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" + } + } + } + }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "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", @@ -25789,16 +34288,21 @@ "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.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, + "nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==" + }, + "nanoid": { + "version": "3.1.28", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", + "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -25815,75 +34319,14 @@ "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=" - }, - "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" - } - }, - "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" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + } + }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" } }, "natural-compare": { @@ -25906,12 +34349,18 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "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==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node-forge": { @@ -25978,33 +34427,30 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, "node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "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" - } - } + "uuid": "^8.3.0", + "which": "^2.0.2" } }, + "node-releases": { + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" + }, "node-sass": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", @@ -26083,15 +34529,6 @@ "validate-npm-package-license": "^3.0.1" }, "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": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -26100,12 +34537,9 @@ } }, "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" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -26124,18 +34558,11 @@ } }, "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - } + "path-key": "^3.0.0" } }, "npmlog": { @@ -26167,10 +34594,10 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" + "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", @@ -26192,6 +34619,47 @@ "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==" + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -26202,11 +34670,6 @@ } } }, - "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", @@ -26232,13 +34695,6 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "object.assign": { @@ -26252,13 +34708,44 @@ "object-keys": "^1.1.1" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "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.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" } }, "object.pick": { @@ -26267,13 +34754,16 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + } + }, + "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": { @@ -26303,32 +34793,57 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { - "mimic-fn": "^1.0.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, "opn": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "requires": { + "cssnano": "^4.1.10", + "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==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "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" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "original": { @@ -26344,23 +34859,10 @@ "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": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.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=" + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" }, "p-finally": { "version": "1.0.0", @@ -26384,44 +34886,56 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "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=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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": { - "no-case": "^2.2.0" + "callsites": "^3.0.0" } }, "parse-asn1": { @@ -26436,17 +34950,6 @@ "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": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -26458,21 +34961,25 @@ "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -26529,12 +35036,9 @@ } }, "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" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { "version": "3.1.2", @@ -26556,13 +35060,12 @@ "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 + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "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", @@ -26577,2052 +35080,1156 @@ "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" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "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" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "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": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } - } - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } - } - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } - } - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "postcss": "^5.0.14" + "find-up": "^2.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=" - }, - "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=", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "locate-path": "^2.0.0" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "p-locate": "^2.0.0", + "path-exists": "^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=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "ansi-regex": "^2.0.0" + "p-try": "^1.0.0" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "has-flag": "^1.0.0" + "p-limit": "^1.1.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "postcss": "^5.0.4" + "find-up": "^2.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=" - }, - "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=", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "locate-path": "^2.0.0" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "p-locate": "^2.0.0", + "path-exists": "^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=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "ansi-regex": "^2.0.0" + "p-try": "^1.0.0" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "has-flag": "^1.0.0" + "p-limit": "^1.1.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { - "postcss": "^5.0.14" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" }, "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "ansi-regex": "^2.0.0" + "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": "7.0.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.38.tgz", + "integrity": "sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ==", + "requires": { + "nanocolors": "^0.2.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" }, - "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" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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" + } + }, + "postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "requires": { + "postcss": "^7" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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": { + "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-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "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": "^5.0.16" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "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": "^5.0.14", - "uniqs": "^2.0.0" + "postcss": "^7.0.14" + } + }, + "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" + } + }, + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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" - } + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "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": "^5.0.4" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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" - } + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, "postcss-flexbugs-fixes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", - "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.26" } }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "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": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" + "postcss": "^7.0.2" } }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "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": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" + "postcss": "^7.0.2" } }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "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": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" + "postcss": "^7.0.2" } }, - "postcss-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", + "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": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.3.0" + "postcss": "^7.0.2" } }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "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": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } - } + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" } }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "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": "^5.0.4" - }, - "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=", + "postcss": "^7.0.2" + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "caller-path": "^2.0.0", + "resolve-from": "^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=", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "ansi-regex": "^2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "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" - } + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "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": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.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=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "minimist": "^1.2.0" } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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": { - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "has-flag": { + "schema-utils": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "has-flag": "^1.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" + "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" + } }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "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": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "postcss": "^7.0.2" + } + }, + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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-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": { + "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": { - "has-flag": "^1.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "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": { + "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-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "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": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "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.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": { - "has-flag": "^1.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.5" } }, "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=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, "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=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "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" + } + }, + "postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" } }, "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "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" + } + }, + "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": { - "postcss": "^5.0.5" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "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": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "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": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "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": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-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": { + "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-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "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": { - "postcss": "^5.0.4" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "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": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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" - } + "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==" }, - "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" - } + "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-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "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": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "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": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.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=" - }, - "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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "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" - } + "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-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-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" + } }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "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": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "postcss": "^7.0.2" + } + }, + "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" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "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-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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "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": { - "ansi-regex": "^2.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } + } + } + }, + "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" + } + }, + "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": { + "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-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" + } + }, + "postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "requires": { + "postcss": "^8.1.0" + }, + "dependencies": { + "nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.8.tgz", + "integrity": "sha512-GT5bTjjZnwDifajzczOC+r3FI3Cu+PgPvrsjhQdRqa2kTJ4968/X9CUce9xttIB0xOs5c6xf0TCWZo/y9lF6bA==", "requires": { - "has-flag": "^1.0.0" + "nanocolors": "^0.2.2", + "nanoid": "^3.1.25", + "source-map-js": "^0.6.2" } } } }, + "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" + } + }, + "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" + } + }, + "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": { + "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-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" + } + }, + "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==" + }, + "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=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, - "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=" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" }, "pretty-error": { "version": "2.1.2", @@ -28667,11 +36274,6 @@ } } }, - "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", @@ -28688,11 +36290,25 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", - "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "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": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "requires": { - "asap": "~2.0.3" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -28742,11 +36358,6 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -28772,6 +36383,36 @@ } } }, + "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", @@ -28797,9 +36438,9 @@ } }, "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" }, "querystring-es3": { "version": "0.2.1", @@ -28811,36 +36452,24 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" }, "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "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==" - } - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -28881,17 +36510,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -28901,6 +36519,19 @@ "object-assign": "^4.1.1" } }, + "react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "requires": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + } + }, "react-bootstrap": { "version": "2.0.0-beta.4", "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.0.0-beta.4.tgz", @@ -28959,109 +36590,120 @@ } }, "react-dev-utils": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.3.tgz", - "integrity": "sha512-Mvs6ofsc2xTjeZIrMaIfbXfsPVrbdVy/cVqq6SAacnqfMlcBpDuivhWZ1ODGeJ8HgmyWTLH971PYjj/EPCDVAw==", - "requires": { - "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.2.0", - "react-error-overlay": "^4.0.1", - "recursive-readdir": "2.2.1", - "shell-quote": "1.6.1", - "sockjs-client": "1.1.5", - "strip-ansi": "3.0.1", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "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=", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "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" + "@babel/highlight": "^7.10.4" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "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==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "shebang-regex": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.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=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "p-limit": "^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=" + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { - "isexe": "^2.0.0" + "find-up": "^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" + } + } } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } } } }, @@ -29076,9 +36718,9 @@ } }, "react-error-overlay": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.1.tgz", - "integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==" + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, "react-highlight": { "version": "0.14.0", @@ -29123,6 +36765,11 @@ } } }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, "react-router": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", @@ -29162,85 +36809,100 @@ } }, "react-scripts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.1.5.tgz", - "integrity": "sha512-ZXqnbg+kLRaacAkjuedMFTgKu9lNltMDDsuwn37CTV7X2tuZQmDKi08eI3LYvtpjqh5vm8/6BhwHRHkRtvMyJg==", - "requires": { - "autoprefixer": "7.1.6", - "babel-core": "6.26.0", - "babel-eslint": "7.2.3", - "babel-jest": "20.0.3", - "babel-loader": "7.1.2", - "babel-preset-react-app": "^3.1.2", - "babel-runtime": "6.26.0", - "case-sensitive-paths-webpack-plugin": "2.1.1", - "chalk": "1.1.3", - "css-loader": "0.28.7", - "dotenv": "4.0.0", - "dotenv-expand": "4.2.0", - "eslint": "4.10.0", - "eslint-config-react-app": "^2.1.0", - "eslint-loader": "1.9.0", - "eslint-plugin-flowtype": "2.39.1", - "eslint-plugin-import": "2.8.0", - "eslint-plugin-jsx-a11y": "5.1.1", - "eslint-plugin-react": "7.4.0", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.5", - "fs-extra": "3.0.1", - "fsevents": "^1.1.3", - "html-webpack-plugin": "2.29.0", - "jest": "20.0.4", - "object-assign": "4.1.1", - "postcss-flexbugs-fixes": "3.2.0", - "postcss-loader": "2.0.8", - "promise": "8.0.1", - "raf": "3.4.0", - "react-dev-utils": "^5.0.2", - "resolve": "1.6.0", - "style-loader": "0.19.0", - "sw-precache-webpack-plugin": "0.11.4", - "url-loader": "0.6.2", - "webpack": "3.8.1", - "webpack-dev-server": "2.11.3", - "webpack-manifest-plugin": "1.3.2", - "whatwg-fetch": "2.0.3" - }, - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "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/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } } } }, @@ -29256,22 +36918,37 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { @@ -29353,21 +37030,11 @@ } }, "recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", + "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.3" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "requires": { - "brace-expansion": "^1.0.0" - } - } + "minimatch": "3.0.4" } }, "redent": { @@ -29379,57 +37046,30 @@ "strip-indent": "^3.0.0" } }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, "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": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "requires": { + "regenerate": "^1.4.2" + } + }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { - "is-equal-shallow": "^0.1.3" + "@babel/runtime": "^7.8.4" } }, "regex-not": { @@ -29439,27 +37079,13 @@ "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - } } }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, "regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", @@ -29469,42 +37095,33 @@ "define-properties": "^1.1.3" } }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "requires": { - "rc": "^1.0.1" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "requires": { "jsesc": "~0.5.0" }, @@ -29563,14 +37180,6 @@ "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", @@ -29626,65 +37235,41 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", - "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { - "path-parse": "^1.0.5" + "is-core-module": "^2.0.0", + "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" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "resolve-pathname": { "version": "3.0.0", @@ -29696,13 +37281,82 @@ "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=", + "resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "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" + } + }, + "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" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-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" + } + } } }, "ret": { @@ -29710,14 +37364,47 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "requires": { - "align-text": "^0.1.1" + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } } }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "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": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -29735,22 +37422,98 @@ "inherits": "^2.0.1" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-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" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "requires": { - "rx-lite": "*" + "queue-microtask": "^1.2.2" + } + }, + "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" } }, "safe-buffer": { @@ -29772,37 +37535,223 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", - "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "requires": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" + "walker": "~1.0.5" }, "dependencies": { - "bser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "node-int64": "^0.4.0" + "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" + } + } + } + }, + "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" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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=" + }, + "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" } }, - "fb-watchman": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "bser": "1.0.2" + "isexe": "^2.0.0" } } } }, + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, "sass-graph": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", @@ -29925,11 +37874,43 @@ } } }, + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -29940,34 +37921,13 @@ } }, "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "ajv": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - } + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "scss-tokenizer": { @@ -30007,21 +37967,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "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", @@ -30042,6 +37987,21 @@ "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=" + } + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -30049,6 +38009,14 @@ } } }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -30063,6 +38031,14 @@ "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", @@ -30079,6 +38055,11 @@ "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", @@ -30097,11 +38078,6 @@ "send": "0.17.1" } }, - "serviceworker-cache-polyfill": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", - "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -30116,6 +38092,21 @@ "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" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } } }, "setimmediate": { @@ -30151,20 +38142,15 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "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" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true }, "side-channel": { "version": "1.0.4", @@ -30181,17 +38167,67 @@ "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": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "requires": { - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } } }, "snapdragon": { @@ -30207,6 +38243,93 @@ "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" + }, + "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-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" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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=" + } } }, "snapdragon-node": { @@ -30226,37 +38349,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -30279,22 +38371,15 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" }, "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", @@ -30303,16 +38388,26 @@ } }, "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.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" + } + } } }, "sort-keys": { @@ -30333,6 +38428,11 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -30346,11 +38446,19 @@ } }, "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==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "source-map-url": { @@ -30358,6 +38466,11 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -30387,30 +38500,40 @@ "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" } }, "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "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": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "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-string": { @@ -30419,25 +38542,6 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { "extend-shallow": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - } } }, "sprintf-js": { @@ -30461,6 +38565,39 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "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==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -30468,6 +38605,67 @@ "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" + }, + "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-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==" + } } }, "statuses": { @@ -30492,6 +38690,15 @@ "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", @@ -30504,6 +38711,11 @@ "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==" + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -30525,28 +38737,29 @@ } }, "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "requires": { - "strip-ansi": "^3.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.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=" - }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } } } }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -30556,6 +38769,21 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -30574,6 +38802,16 @@ "define-properties": "^1.1.3" } }, + "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", @@ -30590,11 +38828,17 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "requires": { - "is-utf8": "^0.2.0" + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" } }, "strip-eof": { @@ -30602,6 +38846,11 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -30611,249 +38860,217 @@ } }, "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=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", - "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { - "has-flag": "^3.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "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": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "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": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "sw-precache": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", - "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "dom-urls": "^1.1.0", - "es6-promise": "^4.0.5", - "glob": "^7.1.1", - "lodash.defaults": "^4.2.0", - "lodash.template": "^4.4.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "pretty-bytes": "^4.0.2", - "sw-toolbox": "^3.4.0", - "update-notifier": "^2.3.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^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" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^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" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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": { - "error-ex": "^1.2.0" + "has-flag": "^4.0.0" } - }, - "path-exists": { + } + } + }, + "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": { + "css-select": { "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=", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "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" - } + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, - "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=", + "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": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "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==" + } } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "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": { - "get-stdin": "^4.0.1" + "boolbase": "~1.0.0" } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" } } }, - "sw-precache-webpack-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", - "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", - "requires": { - "del": "^2.2.2", - "sw-precache": "^5.1.1", - "uglify-js": "^3.0.13" - } - }, - "sw-toolbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", - "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", - "requires": { - "path-to-regexp": "^1.0.1", - "serviceworker-cache-polyfill": "^4.0.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": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { "version": "6.1.11", @@ -30875,129 +39092,187 @@ } } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "requires": { - "execa": "^0.7.0" + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" } }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "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" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "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" - } + "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==" }, - "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=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "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==" + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "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" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "error-ex": "^1.2.0" + "semver": "^6.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=", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "pinkie-promise": "^2.0.0" + "yocto-queue": "^0.1.0" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "find-up": "^4.0.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "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=", + "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.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } - }, - "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=" } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "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": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "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==" }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -31006,6 +39281,11 @@ "setimmediate": "^1.0.4" } }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, "tiny-invariant": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", @@ -31016,14 +39296,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "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.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -31035,9 +39307,9 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "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=" + "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", @@ -31066,82 +39338,14 @@ "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "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" - }, - "dependencies": { - "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 - } } }, "toidentifier": { @@ -31149,11 +39353,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -31163,27 +39362,81 @@ "punycode": "^2.1.1" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "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==" + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "requires": { - "glob": "^7.1.2" + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "tty-browserify": { @@ -31210,13 +39463,23 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -31231,85 +39494,19 @@ "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==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { - "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==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "is-typedarray": "^1.0.0" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } + "typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "peer": true }, "unbox-primitive": { "version": "1.0.1", @@ -31333,6 +39530,30 @@ "react-lifecycles-compat": "^3.0.4" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -31342,6 +39563,13 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } } }, "uniq": { @@ -31354,6 +39582,22 @@ "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" + } + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -31363,15 +39607,20 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "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", @@ -31405,46 +39654,14 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "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", @@ -31453,11 +39670,6 @@ "punycode": "^2.1.0" } }, - "urijs": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.7.tgz", - "integrity": "sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA==" - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -31476,17 +39688,34 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" } } }, "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "url-parse": { @@ -31498,14 +39727,6 @@ "requires-port": "^1.0.0" } }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -31531,6 +39752,15 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -31546,6 +39776,28 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "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", @@ -31585,6 +39837,22 @@ "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-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -31601,20 +39869,233 @@ "loose-envify": "^1.0.0" } }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" - }, "watchpack": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.1.tgz", - "integrity": "sha512-1OeW6LucExk7h6lBuCr1isK5261Tf0PHNRG9tZjg2WKUsSkPwvyv37d7mgAUk1rZjxxaL/6WttSGMUY2hn/20g==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { - "chokidar": "^3.4.0", - "chokidar2": "file:chokidar2", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "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" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "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=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "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=", + "optional": true, + "requires": { + "is-extendable": "^0.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=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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=", + "optional": true, + "requires": { + "binary-extensions": "^1.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=", + "optional": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "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=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "wbuf": { @@ -31631,178 +40112,336 @@ "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" }, "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==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "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" + } + } } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "requires": {} + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "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==" + "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": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "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" + } + } + } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "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" + } + } } }, - "require-main-filename": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": { - "has-flag": "^2.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + "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" + } }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.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", - "yargs-parser": "^7.0.0" + "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" } }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "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" + } + }, + "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" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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": { - "camelcase": "^4.1.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } } }, "webpack-dev-server": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz", - "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", "requires": { "ansi-html": "0.0.7", - "array-includes": "^3.0.3", "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.17.4", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -31817,18 +40456,18 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "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" + } + } } }, - "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=" - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -31849,12 +40488,22 @@ "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" + } + } } }, "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chokidar": { "version": "2.1.8", @@ -31873,164 +40522,37 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - } - }, - "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" - } - }, - "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": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "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" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.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" - } - }, - "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" - } - } - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "ansi-regex": "^4.1.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==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "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" - } - } - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "fill-range": { "version": "4.0.0", @@ -32041,21 +40563,35 @@ "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" + } + } } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^3.0.0" } }, - "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==" + "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", @@ -32076,25 +40612,19 @@ } } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, "is-binary-path": { "version": "1.0.1", @@ -32104,52 +40634,10 @@ "binary-extensions": "^1.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, "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" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "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" - } - }, - "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" - } + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-number": { "version": "3.0.0", @@ -32169,21 +40657,13 @@ } } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "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=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "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" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "micromatch": { @@ -32204,67 +40684,27 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" - }, - "dependencies": { - "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" - } - } } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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": { - "error-ex": "^1.2.0" + "p-limit": "^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" - } - }, - "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" - } - }, - "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" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, - "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=", + "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": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^3.0.0" } }, "readdirp": { @@ -32277,27 +40717,57 @@ "readable-stream": "^2.0.2" } }, - "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=" + "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" + } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "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": { - "glob": "^7.1.3" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "strip-ansi": { @@ -32308,6 +40778,14 @@ "ansi-regex": "^2.0.0" } }, + "supports-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" + } + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -32317,82 +40795,121 @@ "repeat-string": "^1.6.1" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.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==" + }, + "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" + } + } + } }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { - "camelcase": "^3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.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": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "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": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "requires": { - "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" }, "dependencies": { "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "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": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, - "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" - } + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, @@ -32436,31 +40953,25 @@ } }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "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": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - } + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" } }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -32494,28 +41005,207 @@ "string-width": "^1.0.2 || 2" } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, "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": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "requires": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + } + }, + "workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "requires": { + "workbox-core": "^5.1.4" + } }, "worker-farm": { "version": "1.7.0", @@ -32525,44 +41215,71 @@ "errno": "~0.1.7" } }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.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=" + "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" + } }, - "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=", + "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": { - "number-is-nan": "^1.0.0" + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } } } @@ -32572,33 +41289,32 @@ "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} }, "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + "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==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xtend": { "version": "4.0.2", @@ -32615,165 +41331,79 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.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": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "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" - } - }, - "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==" + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "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" - } - }, - "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" - } - }, - "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" - } - }, - "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=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" } } }, "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/www/frontends/compiler_gym/package.json b/www/frontends/compiler_gym/package.json index 09911f038..a323375c9 100644 --- a/www/frontends/compiler_gym/package.json +++ b/www/frontends/compiler_gym/package.json @@ -19,7 +19,7 @@ "react-dom": "^17.0.2", "react-highlight": "^0.14.0", "react-router-dom": "^5.2.0", - "react-scripts": "^1.1.5", + "react-scripts": "^4.0.3", "web-vitals": "^1.1.2" }, "scripts": { From e78f70ef69963d6db25755ce6d8cf016bf0e471c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 30 Sep 2021 12:20:36 +0100 Subject: [PATCH 034/254] [www] Use `npm ci` instead of `npm install`. Using `npm ci` prevents npm from modifying the package.json and package-lock.json files. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f08fc520b..c12f88b63 100644 --- a/Makefile +++ b/Makefile @@ -227,7 +227,7 @@ www: www-build cd www && $(PYTHON) www.py www-build: - cd www/frontends/compiler_gym && npm install && npm run build + cd www/frontends/compiler_gym && npm ci && npm run build www-image: www-build cd www && docker build -t chriscummins/compiler_gym-www . From 34c0933ba26b385ebd2cd67f5d8edbb046c6bf02 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 30 Sep 2021 13:14:07 +0100 Subject: [PATCH 035/254] Add missing name argument to dataset test. --- tests/spaces/sequence_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spaces/sequence_test.py b/tests/spaces/sequence_test.py index 956762427..1b5777ca2 100644 --- a/tests/spaces/sequence_test.py +++ b/tests/spaces/sequence_test.py @@ -58,7 +58,7 @@ def test_contains_with_float_scalar_range(): def test_bytes_contains(): - space = Sequence(size_range=(0, None), dtype=bytes) + space = Sequence(name="test", size_range=(0, None), dtype=bytes) assert space.contains(b"Hello, world!") assert space.contains(b"") assert not space.contains("Hello, world!") From 67fca8e8610dd50a86cb5d51bd2095b425eecbe5 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 21:28:21 +0100 Subject: [PATCH 036/254] [datasets] Add a weighted implementation of random_benchmark(). By default datasets are selected uniformly randomly in Datasets.random_benchmark(). This means that datasets with a small number of benchmarks will be overrepresented compared to datasets with many benchmarks. To correct for this bias this patch adds a weight_datasets_by_size argument which is equivalent to weighting the dataset choice by the number of benchmarks in each dataset: >>> random.choices(datasets, weights=[len(p) for p in datasets]) Weighting the choice of datasets by their size means that datasets with infinite sizes (such as random program generators) will be excluded from sampling as their size is 0. Fixes #422. --- compiler_gym/datasets/datasets.py | 53 ++++++++++++++++++------------- tests/datasets/datasets_test.py | 12 +++++-- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/compiler_gym/datasets/datasets.py b/compiler_gym/datasets/datasets.py index fd6c285e0..1709b1fc0 100644 --- a/compiler_gym/datasets/datasets.py +++ b/compiler_gym/datasets/datasets.py @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. from collections import deque -from typing import Dict, Iterable, Optional, Set, TypeVar +from typing import Dict, Iterable, List, Optional, Set, TypeVar import numpy as np @@ -254,39 +254,48 @@ def benchmark(self, uri: str) -> Benchmark: return dataset.benchmark(uri) def random_benchmark( - self, random_state: Optional[np.random.Generator] = None + self, + random_state: Optional[np.random.Generator] = None, + weight_datasets_by_size: bool = False, ) -> Benchmark: """Select a benchmark randomly. - First, a dataset is selected uniformly randomly using - :code:`random_state.choice(list(datasets))`. The + First, a dataset is selected randomly using + :code:`random_state.choice(list(datasets))`. Then the :meth:`random_benchmark() - ` method of that dataset - is then called to select a benchmark. - - Note that the distribution of benchmarks selected by this method is not - biased by the size of each dataset, since datasets are selected - uniformly. This means that datasets with a small number of benchmarks - will be overrepresented compared to datasets with many benchmarks. To - correct for this bias, use the number of benchmarks in each dataset as - a weight for the random selection: - - >>> rng = np.random.default_rng() - >>> finite_datasets = [d for d in env.datasets if len(d) != math.inf] - >>> dataset = rng.choice( - finite_datasets, - p=[len(d) for d in finite_datasets] - ) - >>> dataset.random_benchmark(random_state=rng) + ` method of the chosen + dataset is called to select a benchmark. + + By default datasets are selected uniformly randomly. This means that + datasets with a small number of benchmarks will be overrepresented + compared to datasets with many benchmarks. To correct for this bias pass + the argument :code:`weight_datasets_by_size=True`, which is equivalent + to weighting the dataset choice by the number of benchmarks in each + dataset: + + >>> random.choices(datasets, weights=[len(p) for p in datasets]) + + Weighting the choice of datasets by their size means that datasets with + infinite sizes (such as random program generators) will be excluded from + sampling as their size is :code:`0`. :param random_state: A random number generator. If not provided, a default :code:`np.random.default_rng()` is used. + :param weight_datasets_by_size: If set, weight the choice of dataset by + the number of benchmarks in each dataset. + :return: A :class:`Benchmark ` instance. """ random_state = random_state or np.random.default_rng() - dataset = random_state.choice(list(self._visible_datasets)) + datasets: List[str] = list(self._visible_datasets) + + if weight_datasets_by_size: + weights = np.array([self[d].size for d in datasets], dtype=float) + dataset = random_state.choice(datasets, p=weights / weights.sum()) + else: + dataset = random_state.choice(datasets) return self[dataset].random_benchmark(random_state=random_state) @property diff --git a/tests/datasets/datasets_test.py b/tests/datasets/datasets_test.py index 2402eea71..59345977e 100644 --- a/tests/datasets/datasets_test.py +++ b/tests/datasets/datasets_test.py @@ -245,8 +245,10 @@ def test_benchmarks_iter_deprecated(): ] -def test_random_benchmark(mocker): +@pytest.mark.parametrize("weight_datasets_by_size", [False, True]) +def test_random_benchmark(mocker, weight_datasets_by_size: bool): da = MockDataset("benchmark://foo-v0") + da.size = 10 ba = MockBenchmark(uri="benchmark://foo-v0/abc") da.benchmark_values.append(ba) datasets = Datasets([da]) @@ -256,7 +258,13 @@ def test_random_benchmark(mocker): num_benchmarks = 5 rng = np.random.default_rng(0) random_benchmarks = { - b.uri for b in (datasets.random_benchmark(rng) for _ in range(num_benchmarks)) + b.uri + for b in ( + datasets.random_benchmark( + rng, weight_datasets_by_size=weight_datasets_by_size + ) + for _ in range(num_benchmarks) + ) } assert da.random_benchmark.call_count == num_benchmarks From 90cf92f316c7db57396a2ec0d9abaf99aa2894e6 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 30 Sep 2021 13:10:46 +0100 Subject: [PATCH 037/254] [datasets] Allow custom dataset weights to be provided. Issue #442. --- compiler_gym/datasets/datasets.py | 38 ++++++++++++++++++++++--------- tests/datasets/datasets_test.py | 8 +++---- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/compiler_gym/datasets/datasets.py b/compiler_gym/datasets/datasets.py index 1709b1fc0..3d21c00f0 100644 --- a/compiler_gym/datasets/datasets.py +++ b/compiler_gym/datasets/datasets.py @@ -256,7 +256,8 @@ def benchmark(self, uri: str) -> Benchmark: def random_benchmark( self, random_state: Optional[np.random.Generator] = None, - weight_datasets_by_size: bool = False, + weighted: bool = False, + weights: Optional[Dict[str, float]] = None, ) -> Benchmark: """Select a benchmark randomly. @@ -269,31 +270,46 @@ def random_benchmark( By default datasets are selected uniformly randomly. This means that datasets with a small number of benchmarks will be overrepresented compared to datasets with many benchmarks. To correct for this bias pass - the argument :code:`weight_datasets_by_size=True`, which is equivalent - to weighting the dataset choice by the number of benchmarks in each - dataset: + the argument :code:`weighted=True`, which weights the dataset choice by + the number of benchmarks in each dataset, equivalent to: >>> random.choices(datasets, weights=[len(p) for p in datasets]) Weighting the choice of datasets by their size means that datasets with infinite sizes (such as random program generators) will be excluded from - sampling as their size is :code:`0`. + sampling as their size is :code:`0`. To override the weights of datasets + pass a :code:`weights` mapping: + + >>> env.datasets.random_benchmark(weighted=True, weights={ + "benchmark://dataset-v0": 10, + "benchmark://another-dataset-v0": 555, + }) :param random_state: A random number generator. If not provided, a default :code:`np.random.default_rng()` is used. - :param weight_datasets_by_size: If set, weight the choice of dataset by - the number of benchmarks in each dataset. + :param weighted: If set, weight the choice of dataset by the number of + benchmarks in each dataset, or the value specified in the + :code:`weights` mapping. + + :param weights: An optional mapping from dataset URI to the weight to + use when :code:`weighted=True`. This overrides the default value of + using the dataset size. :return: A :class:`Benchmark ` instance. """ random_state = random_state or np.random.default_rng() datasets: List[str] = list(self._visible_datasets) - - if weight_datasets_by_size: - weights = np.array([self[d].size for d in datasets], dtype=float) - dataset = random_state.choice(datasets, p=weights / weights.sum()) + # Assume weighted=True if weights dictionary is specified. + weighted = weighted or weights + + if weighted: + weights: Dict[str, float] = weights or {} + w: List[float] = np.array( + [weights.get(d, self[d].size) for d in datasets], dtype=float + ) + dataset = random_state.choice(datasets, p=w / w.sum()) else: dataset = random_state.choice(datasets) return self[dataset].random_benchmark(random_state=random_state) diff --git a/tests/datasets/datasets_test.py b/tests/datasets/datasets_test.py index 59345977e..cdb41f8da 100644 --- a/tests/datasets/datasets_test.py +++ b/tests/datasets/datasets_test.py @@ -245,8 +245,8 @@ def test_benchmarks_iter_deprecated(): ] -@pytest.mark.parametrize("weight_datasets_by_size", [False, True]) -def test_random_benchmark(mocker, weight_datasets_by_size: bool): +@pytest.mark.parametrize("weighted", [False, True]) +def test_random_benchmark(mocker, weighted: bool): da = MockDataset("benchmark://foo-v0") da.size = 10 ba = MockBenchmark(uri="benchmark://foo-v0/abc") @@ -260,9 +260,7 @@ def test_random_benchmark(mocker, weight_datasets_by_size: bool): random_benchmarks = { b.uri for b in ( - datasets.random_benchmark( - rng, weight_datasets_by_size=weight_datasets_by_size - ) + datasets.random_benchmark(rng, weighted=weighted) for _ in range(num_benchmarks) ) } From bb89052855cead2b055b3dd704c30c11f1fa7fd6 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 11:28:13 +0100 Subject: [PATCH 038/254] Verify that env.fork() permits `with` syntax. This patch adds a test that using fork() in a `with` statement works as expected (i.e. the environment is closed at the end of the scope), and refactors the unit tests to use this syntax. Fixes #362. --- tests/llvm/fork_env_test.py | 97 ++++++++++++++----------------------- 1 file changed, 37 insertions(+), 60 deletions(-) diff --git a/tests/llvm/fork_env_test.py b/tests/llvm/fork_env_test.py index cb52f30fd..b7ac8b012 100644 --- a/tests/llvm/fork_env_test.py +++ b/tests/llvm/fork_env_test.py @@ -17,10 +17,20 @@ EXAMPLE_BITCODE_IR_INSTRUCTION_COUNT = 196 +def test_with_statement(env: LlvmEnv): + """Test that the `with` statement context manager works on forks.""" + env.reset("cbench-v1/crc32") + env.step(0) + with env.fork() as fkd: + assert fkd.in_episode + assert fkd.actions == [0] + assert not fkd.in_episode + assert env.in_episode + + def test_fork_child_process_is_not_orphaned(env: LlvmEnv): env.reset("cbench-v1/crc32") - fkd = env.fork() - try: + with env.fork() as fkd: # Check that both environments share the same service. assert isinstance(env.service.connection.process, subprocess.Popen) assert isinstance(fkd.service.connection.process, subprocess.Popen) @@ -44,8 +54,6 @@ def test_fork_child_process_is_not_orphaned(env: LlvmEnv): # Check that the service has been killed. assert process.poll() is not None - finally: - fkd.close() def test_fork_chain_child_processes_are_not_orphaned(env: LlvmEnv): @@ -89,12 +97,9 @@ def test_fork_chain_child_processes_are_not_orphaned(env: LlvmEnv): def test_fork_before_reset(env: LlvmEnv): """Test that fork() before reset() starts an episode.""" assert not env.in_episode - fkd = env.fork() - try: + with env.fork() as fkd: assert env.in_episode assert fkd.in_episode - finally: - fkd.close() def test_fork_closed_service(env: LlvmEnv): @@ -107,12 +112,9 @@ def test_fork_closed_service(env: LlvmEnv): env.close() assert not env.service - fkd = env.fork() - try: + with env.fork() as fkd: assert env.actions == [0] assert fkd.actions == [0] - finally: - fkd.close() def test_fork_spaces_are_same(env: LlvmEnv): @@ -120,13 +122,10 @@ def test_fork_spaces_are_same(env: LlvmEnv): env.reward_space = "IrInstructionCount" env.reset(benchmark="cbench-v1/crc32") - fkd = env.fork() - try: + with env.fork() as fkd: assert fkd.observation_space == env.observation_space assert fkd.reward_space == env.reward_space assert fkd.benchmark == env.benchmark - finally: - fkd.close() def test_fork_state(env: LlvmEnv): @@ -134,12 +133,9 @@ def test_fork_state(env: LlvmEnv): env.step(0) assert env.actions == [0] - new_env = env.fork() - try: - assert new_env.benchmark == new_env.benchmark - assert new_env.actions == env.actions - finally: - new_env.close() + with env.fork() as fkd: + assert fkd.benchmark == fkd.benchmark + assert fkd.actions == env.actions def test_fork_reset(env: LlvmEnv): @@ -148,18 +144,15 @@ def test_fork_reset(env: LlvmEnv): env.step(1) env.step(2) - new_env = env.fork() - try: - new_env.step(3) + with env.fork() as fkd: + fkd.step(3) assert env.actions == [0, 1, 2] - assert new_env.actions == [0, 1, 2, 3] + assert fkd.actions == [0, 1, 2, 3] - new_env.reset() + fkd.reset() assert env.actions == [0, 1, 2] - assert new_env.actions == [] - finally: - new_env.close() + assert fkd.actions == [] def test_fork_custom_benchmark(env: LlvmEnv): @@ -170,27 +163,20 @@ def ir(env): """Strip the ModuleID line from IR.""" return "\n".join(env.ir.split("\n")[1:]) - new_env = env.fork() - try: - assert ir(env) == ir(new_env) + with env.fork() as fkd: + assert ir(env) == ir(fkd) - new_env.reset() - assert ir(env) == ir(new_env) - finally: - new_env.close() + fkd.reset() + assert ir(env) == ir(fkd) def test_fork_twice_test(env: LlvmEnv): """Test that fork() on a forked environment works.""" env.reset(benchmark="cbench-v1/crc32") - fork_a = env.fork() - fork_b = fork_a.fork() - try: - assert env.state == fork_a.state - assert fork_a.state == fork_b.state - finally: - fork_a.close() - fork_b.close() + with env.fork() as fork_a: + with fork_a.fork() as fork_b: + assert env.state == fork_a.state + assert fork_a.state == fork_b.state def test_fork_modified_ir_is_the_same(env: LlvmEnv): @@ -202,20 +188,17 @@ def test_fork_modified_ir_is_the_same(env: LlvmEnv): assert not done assert not info["action_had_no_effect"] - forked = env.fork() - try: - assert "\n".join(env.ir.split("\n")[1:]) == "\n".join(forked.ir.split("\n")[1:]) + with env.fork() as fkd: + assert "\n".join(env.ir.split("\n")[1:]) == "\n".join(fkd.ir.split("\n")[1:]) # Apply another action. _, _, done, info = env.step(env.action_space.flags.index("-gvn")) - _, _, done, info = forked.step(forked.action_space.flags.index("-gvn")) + _, _, done, info = fkd.step(fkd.action_space.flags.index("-gvn")) assert not done assert not info["action_had_no_effect"] # Check that IRs are still equivalent. - assert "\n".join(env.ir.split("\n")[1:]) == "\n".join(forked.ir.split("\n")[1:]) - finally: - forked.close() + assert "\n".join(env.ir.split("\n")[1:]) == "\n".join(fkd.ir.split("\n")[1:]) def test_fork_rewards(env: LlvmEnv, reward_space: str): @@ -242,13 +225,10 @@ def test_fork_previous_cost_reward_update(env: LlvmEnv): env.reset("cbench-v1/crc32") env.step(env.action_space.flags.index("-mem2reg")) - fkd = env.fork() - try: + with env.fork() as fkd: _, a, _, _ = env.step(env.action_space.flags.index("-mem2reg")) _, b, _, _ = fkd.step(env.action_space.flags.index("-mem2reg")) assert a == b - finally: - fkd.close() def test_fork_previous_cost_lazy_reward_update(env: LlvmEnv): @@ -256,14 +236,11 @@ def test_fork_previous_cost_lazy_reward_update(env: LlvmEnv): env.step(env.action_space.flags.index("-mem2reg")) env.reward["IrInstructionCount"] - fkd = env.fork() - try: + with env.fork() as fkd: env.step(env.action_space.flags.index("-mem2reg")) fkd.step(env.action_space.flags.index("-mem2reg")) assert env.reward["IrInstructionCount"] == fkd.reward["IrInstructionCount"] - finally: - fkd.close() if __name__ == "__main__": From 75cd0f9a23981c034b0dad00168d008bea0f9e55 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 11:50:11 +0100 Subject: [PATCH 039/254] [tests] Add regression tests for env.fork(). This adds a set of tests for combinations of benchmarks and actions that have been found to produce diverging states in forked environments. --- tests/llvm/BUILD | 11 +++++ tests/llvm/fork_regression_test.py | 73 ++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 tests/llvm/fork_regression_test.py diff --git a/tests/llvm/BUILD b/tests/llvm/BUILD index 3ee0c5fa8..51037cc7c 100644 --- a/tests/llvm/BUILD +++ b/tests/llvm/BUILD @@ -126,6 +126,17 @@ py_test( ], ) +py_test( + name = "fork_regression_test", + timeout = "long", + srcs = ["fork_regression_test.py"], + deps = [ + "//compiler_gym/envs", + "//tests:test_main", + "//tests/pytest_plugins:llvm", + ], +) + py_test( name = "fresh_environment_observation_reward_test", timeout = "long", diff --git a/tests/llvm/fork_regression_test.py b/tests/llvm/fork_regression_test.py new file mode 100644 index 000000000..febc8b851 --- /dev/null +++ b/tests/llvm/fork_regression_test.py @@ -0,0 +1,73 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Regression tests for LlvmEnv.fork() identified by hand or through fuzzing.""" + +from typing import NamedTuple + +import pytest +from flaky import flaky + +from compiler_gym.envs import LlvmEnv +from tests.test_main import main + +pytest_plugins = ["tests.pytest_plugins.llvm"] + + +class ForkRegressionTest(NamedTuple): + benchmark: str + pre_fork: str + post_fork: str + reward_space: str = "IrInstructionCount" + + +@flaky +@pytest.mark.parametrize( + "test", + [ + ForkRegressionTest( + benchmark="benchmark://cbench-v1/tiff2bw", + pre_fork="-loop-unswitch -name-anon-globals -attributor -correlated-propagation -loop-unroll-and-jam -reg2mem -break-crit-edges -globalopt -inline", + post_fork="-cross-dso-cfi -gvn-hoist", + ), + ForkRegressionTest( + benchmark="benchmark://cbench-v1/bzip2", + pre_fork="-loop-deletion -argpromotion -callsite-splitting -mergeicmps -deadargelim -instsimplify -mem2reg -instcombine -rewrite-statepoints-for-gc -insert-gcov-profiling", + post_fork="-partially-inline-libcalls -loop-guard-widening", + ), + ForkRegressionTest( + benchmark="benchmark://cbench-v1/jpeg-d", + pre_fork="-bdce -loop-guard-widening -loop-reduce -globaldce -sroa -partially-inline-libcalls -loop-deletion -forceattrs -flattencfg -simple-loop-unswitch", + post_fork="-mergefunc -dse -load-store-vectorizer -sroa -mldst-motion -hotcoldsplit -loop-versioning-licm -loop-rotate", + ), + ], +) +def test_fork_regression_test(env: LlvmEnv, test: ForkRegressionTest): + """Run the fork regression test: + + 1. Initialize an environment. + 2. Apply a "pre_fork" sequence of actions. + 3. Create a fork of the environment. + 4. Apply a "post_fork" sequence of actions in both the fork and parent. + 5. Verify that the environment states have gone out of sync. + """ + env.reward_space = test.reward_space + env.reset(test.benchmark) + pre_fork = [env.action_space[f] for f in test.pre_fork.split()] + post_fork = [env.action_space[f] for f in test.post_fork.split()] + + _, _, done, info = env.step(pre_fork) + assert not done, info + + with env.fork() as fkd: + assert env.state == fkd.state # Sanity check + + env.step(post_fork) + fkd.step(post_fork) + # Verify that the environment states no longer line up. + assert env.state != fkd.state + + +if __name__ == "__main__": + main() From 76b1accb91745cbda0cf59e841dbd3843ba0a240 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 12:58:19 +0100 Subject: [PATCH 040/254] [util] Move create_logs_dir() to runfiles_path. This moves the create_logs_dir() function into the runfile_path module so that all of the functions for generating filesystem paths are in the same module. This also improves the implementation by enabling thread safe logging directory generation, and renames the function to create_user_logs_dir() to better communicate the type of logs. --- compiler_gym/util/logs.py | 38 +++++------------ compiler_gym/util/runfiles_path.py | 48 +++++++++++++++++++++ tests/util/BUILD | 10 +++++ tests/util/runfiles_path_test.py | 67 ++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 tests/util/runfiles_path_test.py diff --git a/compiler_gym/util/logs.py b/compiler_gym/util/logs.py index e4f6599c5..0340fc744 100644 --- a/compiler_gym/util/logs.py +++ b/compiler_gym/util/logs.py @@ -2,11 +2,13 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -import os -from datetime import datetime from pathlib import Path from typing import NamedTuple +from deprecated import deprecated + +from compiler_gym.util.runfiles_path import create_user_logs_dir + # File names of generated logs. METADATA_NAME = "random_search.json" PROGRESS_LOG_NAME = "random_search_progress.csv" @@ -16,34 +18,16 @@ BEST_ACTIONS_PROGRESS_NAME = "random_search_best_actions_progress.csv" +@deprecated( + version="0.2.1", + reason="Use compiler_gym.util.create_user_logs_dir() instead", +) def create_logging_dir(name: str) -> Path: - """Create a directory for writing logs to. - - Defaults to ~/logs/compiler_gym base directory, set - $COMPILER_GYM_LOGS=/path/to/dir to override this. - - Usage: - >>> create_logging_dir("my_script") - Path("~/logs/compiler_gym/my_script/2020-11-03T11:00:00") + """Deprecated function to create a directory for writing logs to. - :param name: The grouping name for the logs. - :return: The path of a logging directory. + Use :code:`compiler_gym.util.runfiles_path.create_user_logs_dir()` instead. """ - logging_base_dir = os.environ.get("COMPILER_GYM_LOGS", "~/logs/compiler_gym") - logging_base_dir = Path(logging_base_dir).expanduser() - logging_base_dir = logging_base_dir / name - - timestamp = datetime.now().isoformat() - - logging_dir = logging_base_dir / timestamp - logging_dir.mkdir(parents=True) - - # Create a symlink to the "latest" logs results. - if (logging_base_dir / "latest").exists(): - os.unlink(logging_base_dir / "latest") - os.symlink(timestamp, logging_base_dir / "latest") - - return logging_dir + return create_user_logs_dir(name) class ProgressLogEntry(NamedTuple): diff --git a/compiler_gym/util/runfiles_path.py b/compiler_gym/util/runfiles_path.py index 50145c0d3..ce74bf3b2 100644 --- a/compiler_gym/util/runfiles_path.py +++ b/compiler_gym/util/runfiles_path.py @@ -4,14 +4,20 @@ # LICENSE file in the root directory of this source tree. """Module for resolving a runfiles path.""" import os +from datetime import datetime from getpass import getuser from pathlib import Path +from threading import Lock +from time import sleep +from typing import Optional # NOTE(cummins): Moving this file may require updating this relative path. _PACKAGE_ROOT = Path(os.path.join(os.path.dirname(__file__), "../../")).resolve( strict=True ) +_CREATE_LOGGING_DIR_LOCK = Lock() + def runfiles_path(relpath: str) -> Path: """Resolve the path to a runfiles data path. @@ -124,3 +130,45 @@ def transient_cache_path(relpath: str) -> Path: else: # Fallback to using the regular cache. return cache_path(relpath) + + +def create_user_logs_dir(name: str, dir: Optional[Path] = None) -> Path: + """Create a directory for writing logs to. + + Defaults to ~/logs/compiler_gym base directory, set the + :code:`COMPILER_GYM_LOGS` environment variable to override this. + + Example use: + + >>> create_user_logs_dir("my_experiment") + Path("~/logs/compiler_gym/my_experiment/2020-11-03T11:00:00") + + :param name: The grouping name for the logs. + + :return: A unique timestamped directory for logging. This directory exists. + """ + base_dir = Path( + os.environ.get("COMPILER_GYM_LOGS", dir or "~/logs/compiler_gym") + ).expanduser() + group_dir = base_dir / name + + with _CREATE_LOGGING_DIR_LOCK: + # Require that logging directory timestamps are unique by waiting until + # a unique timestamp is generated. + while True: + now = datetime.now() + subdirs = now.strftime("%Y-%m-%d/%H-%M-%S") + + logs_dir = group_dir / subdirs + if logs_dir.is_dir(): + sleep(0.3) + continue + + logs_dir.mkdir(parents=True, exist_ok=False) + + # Create a symlink to the "latest" logs results. + if (group_dir / "latest").exists(): + os.unlink(group_dir / "latest") + os.symlink(subdirs, group_dir / "latest") + + return logs_dir diff --git a/tests/util/BUILD b/tests/util/BUILD index dbdb5b5af..d92b1ad08 100644 --- a/tests/util/BUILD +++ b/tests/util/BUILD @@ -75,6 +75,16 @@ py_test( ], ) +py_test( + name = "runfiles_path_test", + srcs = ["runfiles_path_test.py"], + deps = [ + "//compiler_gym/util", + "//tests:test_main", + "//tests/pytest_plugins:common", + ], +) + py_test( name = "statistics_test", timeout = "short", diff --git a/tests/util/runfiles_path_test.py b/tests/util/runfiles_path_test.py new file mode 100644 index 000000000..8105fa609 --- /dev/null +++ b/tests/util/runfiles_path_test.py @@ -0,0 +1,67 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Unit tests for compiler_gym/util/locks.py""" +from datetime import datetime +from pathlib import Path +from threading import Thread + +from flaky import flaky + +from compiler_gym.util.runfiles_path import create_user_logs_dir +from tests.test_main import main + +pytest_plugins = ["tests.pytest_plugins.common"] + + +@flaky # Unlikely event that timestamps change +def test_create_user_logs_dir(temporary_environ, tmpdir): + tmpdir = Path(tmpdir) + temporary_environ["COMPILER_GYM_LOGS"] = str(tmpdir) + + dir = create_user_logs_dir("foo") + now = datetime.now() + + assert dir.parent.parent == tmpdir / "foo" + + year, month, day = dir.parent.name.split("-") + assert int(year) == now.year + assert int(month) == now.month + assert int(day) == now.day + + hour, minute, second = dir.name.split("-") + assert int(hour) == now.hour + assert int(minute) == now.minute + assert int(second) == now.second + + +def test_create_user_logs_dir_multithreaded(temporary_environ, tmpdir): + tmpdir = Path(tmpdir) + temporary_environ["COMPILER_GYM_LOGS"] = str(tmpdir) + + class MakeDir(Thread): + def __init__(self): + super().__init__() + self.dir = None + + def run(self): + self.dir = create_user_logs_dir("foo") + + def join(self): + super().join() + return self.dir + + threads = [MakeDir() for _ in range(5)] + for t in threads: + t.start() + + dirs = [t.join() for t in threads] + + # Every directory should be unique. + print(dirs) + assert len(set(dirs)) == len(dirs) + + +if __name__ == "__main__": + main() From 4591d8196c1b173f4c7ce1a2ee015ec75355dc1b Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 13:17:06 +0100 Subject: [PATCH 041/254] Refactor and merge random search utils into random_search module. This aggregates the random search utility classes and functions into the random_search module. This effectively deprecates the compiler_gym.random_replay and compiler_gym.util.logs modules. --- compiler_gym/BUILD | 3 +- compiler_gym/bin/BUILD | 3 +- compiler_gym/bin/random_eval.py | 3 +- compiler_gym/bin/random_replay.py | 2 +- compiler_gym/random_replay.py | 81 ++++----------------- compiler_gym/random_search.py | 113 +++++++++++++++++++++++++++++- compiler_gym/util/logs.py | 41 +---------- tests/random_search_test.py | 3 +- 8 files changed, 133 insertions(+), 116 deletions(-) diff --git a/compiler_gym/BUILD b/compiler_gym/BUILD index 1a4626ba0..b12e5bb2f 100644 --- a/compiler_gym/BUILD +++ b/compiler_gym/BUILD @@ -12,6 +12,7 @@ py_library( srcs = ["__init__.py"], visibility = ["//visibility:public"], deps = [ + ":random_replay", ":random_search", ":validate", "//compiler_gym/bin", @@ -41,6 +42,7 @@ py_library( srcs = ["random_replay.py"], visibility = ["//visibility:public"], deps = [ + ":random_search", "//compiler_gym/envs", "//compiler_gym/util", ], @@ -52,7 +54,6 @@ py_library( data = ["//compiler_gym/envs/llvm/service"], visibility = ["//visibility:public"], deps = [ - ":random_replay", "//compiler_gym/envs", "//compiler_gym/service:connection", "//compiler_gym/util", diff --git a/compiler_gym/bin/BUILD b/compiler_gym/bin/BUILD index 090908051..27e05e66f 100644 --- a/compiler_gym/bin/BUILD +++ b/compiler_gym/bin/BUILD @@ -45,6 +45,7 @@ py_binary( name = "random_eval", srcs = ["random_eval.py"], deps = [ + "//compiler_gym:random_search", "//compiler_gym/util", "//compiler_gym/util/flags", ], @@ -65,7 +66,7 @@ py_binary( srcs = ["random_replay.py"], visibility = ["//visibility:public"], deps = [ - "//compiler_gym:random_replay", + "//compiler_gym:random_search", "//compiler_gym/util", "//compiler_gym/util/flags", ], diff --git a/compiler_gym/bin/random_eval.py b/compiler_gym/bin/random_eval.py index 93031f947..65b41dd8d 100644 --- a/compiler_gym/bin/random_eval.py +++ b/compiler_gym/bin/random_eval.py @@ -11,6 +11,7 @@ from absl import app, flags import compiler_gym.util.flags.output_dir # noqa Flag definition. +from compiler_gym.random_search import RandomSearchProgressLogEntry from compiler_gym.util import logs from compiler_gym.util.statistics import geometric_mean from compiler_gym.util.tabulate import tabulate @@ -46,7 +47,7 @@ def eval_logs(outdir: Path) -> None: with open(str(progress_path)) as f: final_line = f.readlines()[-1] - best = logs.ProgressLogEntry.from_csv(final_line) + best = RandomSearchProgressLogEntry.from_csv(final_line) totals["instructions"] += meta["num_instructions"] totals["init_reward"].append(meta["init_reward"]) diff --git a/compiler_gym/bin/random_replay.py b/compiler_gym/bin/random_replay.py index c5079246f..f6e0f171d 100644 --- a/compiler_gym/bin/random_replay.py +++ b/compiler_gym/bin/random_replay.py @@ -17,7 +17,7 @@ from absl import app, flags import compiler_gym.util.flags.output_dir # noqa Flag definition. -from compiler_gym.random_replay import replay_actions_from_logs +from compiler_gym.random_search import replay_actions_from_logs from compiler_gym.util import logs from compiler_gym.util.flags.benchmark_from_flags import benchmark_from_flags from compiler_gym.util.flags.env_from_flags import env_from_flags diff --git a/compiler_gym/random_replay.py b/compiler_gym/random_replay.py index f00cc63f6..063ec9ee9 100644 --- a/compiler_gym/random_replay.py +++ b/compiler_gym/random_replay.py @@ -3,79 +3,26 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Replay the sequence of actions that produced the best reward.""" -import json from pathlib import Path -from time import time from typing import List -from compiler_gym.envs import CompilerEnv, LlvmEnv -from compiler_gym.util import logs -from compiler_gym.util.tabulate import tabulate +from deprecated import deprecated +from compiler_gym.envs.compiler_env import CompilerEnv +from compiler_gym.random_search import replay_actions as replay_actions_ +from compiler_gym.random_search import ( + replay_actions_from_logs as replay_actions_from_logs_, +) -def replay_actions(env: CompilerEnv, action_names: List[str], outdir: Path): - logs_path = outdir / logs.BEST_ACTIONS_PROGRESS_NAME - start_time = time() - - if isinstance(env, LlvmEnv): - env.write_bitcode(outdir / "unoptimized.bc") - with open(str(logs_path), "w") as f: - ep_reward = 0 - for i, action in enumerate(action_names, start=1): - _, reward, done, _ = env.step(env.action_space.names.index(action)) - assert not done - ep_reward += reward - print( - f"Step [{i:03d} / {len(action_names):03d}]: reward={reward:.4f} \t" - f"episode={ep_reward:.4f} \taction={action}" - ) - progress = logs.ProgressLogEntry( - runtime_seconds=time() - start_time, - total_episode_count=1, - total_step_count=i, - num_passes=i, - reward=reward, - ) - print(progress.to_csv(), action, file=f, sep=",") - - if isinstance(env, LlvmEnv): - env.write_bitcode(outdir / "optimized.bc") - print( - tabulate( - [ - ( - "IR instruction count", - env.observation["IrInstructionCountO0"], - env.observation["IrInstructionCountOz"], - env.observation["IrInstructionCount"], - ), - ( - "Object .text size (bytes)", - env.observation["ObjectTextSizeO0"], - env.observation["ObjectTextSizeOz"], - env.observation["ObjectTextSizeBytes"], - ), - ], - headers=("", "-O0", "-Oz", "final"), - ) - ) +@deprecated(version="0.2.1", reason="Use env.step(actions) instead") +def replay_actions(env: CompilerEnv, action_names: List[str], outdir: Path): + return replay_actions_(env, action_names, outdir) +@deprecated( + version="0.2.1", + reason="Use compiler_gym.random_search.replay_actions_from_logs() instead", +) def replay_actions_from_logs(env: CompilerEnv, logdir: Path, benchmark=None) -> None: - best_actions_path = logdir / logs.BEST_ACTIONS_NAME - meta_path = logdir / logs.METADATA_NAME - - assert best_actions_path.is_file(), f"File not found: {best_actions_path}" - assert meta_path.is_file(), f"File not found: {meta_path}" - - with open(meta_path, "rb") as f: - meta = json.load(f) - - with open(best_actions_path) as f: - actions = [ln.strip() for ln in f.readlines() if ln.strip()] - - benchmark = benchmark or meta["benchmark"] - env.reward_space = meta["reward"] - env.reset(benchmark=benchmark) - replay_actions(env, actions, logdir) + return replay_actions_from_logs_(env, logdir, benchmark) diff --git a/compiler_gym/random_search.py b/compiler_gym/random_search.py index d1aae0296..f80983cb6 100644 --- a/compiler_gym/random_search.py +++ b/compiler_gym/random_search.py @@ -8,15 +8,54 @@ from pathlib import Path from threading import Thread from time import sleep, time -from typing import Callable, List, Optional, Union +from typing import Callable, List, NamedTuple, Optional, Union import humanize from compiler_gym.envs import CompilerEnv -from compiler_gym.random_replay import replay_actions +from compiler_gym.envs.llvm import LlvmEnv from compiler_gym.service.connection import ServiceError from compiler_gym.util import logs from compiler_gym.util.logs import create_logging_dir +from compiler_gym.util.tabulate import tabulate + + +class RandomSearchProgressLogEntry(NamedTuple): + """A snapshot of incremental search progress.""" + + runtime_seconds: float + total_episode_count: int + total_step_count: int + num_passes: int + reward: float + + def to_csv(self) -> str: + return ",".join( + [ + f"{self.runtime_seconds:.3f}", + str(self.total_episode_count), + str(self.total_step_count), + str(self.num_passes), + str(self.reward), + ] + ) + + @classmethod + def from_csv(cls, line: str) -> "RandomSearchProgressLogEntry": + ( + runtime_seconds, + total_episode_count, + total_step_count, + num_passes, + reward, + ) = line.split(",") + return RandomSearchProgressLogEntry( + float(runtime_seconds), + int(total_episode_count), + int(total_step_count), + int(num_passes), + float(reward), + ) class RandomAgentWorker(Thread): @@ -213,7 +252,7 @@ def random_search( # Log the incremental progress improvements. if best_returns > last_best_returns: - entry = logs.ProgressLogEntry( + entry = RandomSearchProgressLogEntry( runtime_seconds=runtime, total_episode_count=total_episode_count, total_step_count=total_step_count, @@ -252,3 +291,71 @@ def random_search( replay_actions(env, best_action_names, outdir) return env + + +def replay_actions(env: CompilerEnv, action_names: List[str], outdir: Path): + logs_path = outdir / logs.BEST_ACTIONS_PROGRESS_NAME + start_time = time() + + if isinstance(env, LlvmEnv): + env.write_bitcode(outdir / "unoptimized.bc") + + with open(str(logs_path), "w") as f: + ep_reward = 0 + for i, action in enumerate(action_names, start=1): + _, reward, done, _ = env.step(env.action_space.names.index(action)) + assert not done + ep_reward += reward + print( + f"Step [{i:03d} / {len(action_names):03d}]: reward={reward:.4f} \t" + f"episode={ep_reward:.4f} \taction={action}" + ) + progress = RandomSearchProgressLogEntry( + runtime_seconds=time() - start_time, + total_episode_count=1, + total_step_count=i, + num_passes=i, + reward=reward, + ) + print(progress.to_csv(), action, file=f, sep=",") + + if isinstance(env, LlvmEnv): + env.write_bitcode(outdir / "optimized.bc") + print( + tabulate( + [ + ( + "IR instruction count", + env.observation["IrInstructionCountO0"], + env.observation["IrInstructionCountOz"], + env.observation["IrInstructionCount"], + ), + ( + "Object .text size (bytes)", + env.observation["ObjectTextSizeO0"], + env.observation["ObjectTextSizeOz"], + env.observation["ObjectTextSizeBytes"], + ), + ], + headers=("", "-O0", "-Oz", "final"), + ) + ) + + +def replay_actions_from_logs(env: CompilerEnv, logdir: Path, benchmark=None) -> None: + best_actions_path = logdir / logs.BEST_ACTIONS_NAME + meta_path = logdir / logs.METADATA_NAME + + assert best_actions_path.is_file(), f"File not found: {best_actions_path}" + assert meta_path.is_file(), f"File not found: {meta_path}" + + with open(meta_path, "rb") as f: + meta = json.load(f) + + with open(best_actions_path) as f: + actions = [ln.strip() for ln in f.readlines() if ln.strip()] + + benchmark = benchmark or meta["benchmark"] + env.reward_space = meta["reward"] + env.reset(benchmark=benchmark) + replay_actions(env, actions, logdir) diff --git a/compiler_gym/util/logs.py b/compiler_gym/util/logs.py index 0340fc744..6dfbda7b8 100644 --- a/compiler_gym/util/logs.py +++ b/compiler_gym/util/logs.py @@ -3,9 +3,8 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. from pathlib import Path -from typing import NamedTuple -from deprecated import deprecated +from deprecated.sphinx import deprecated from compiler_gym.util.runfiles_path import create_user_logs_dir @@ -28,41 +27,3 @@ def create_logging_dir(name: str) -> Path: Use :code:`compiler_gym.util.runfiles_path.create_user_logs_dir()` instead. """ return create_user_logs_dir(name) - - -class ProgressLogEntry(NamedTuple): - """A snapshot of incremental search progress.""" - - runtime_seconds: float - total_episode_count: int - total_step_count: int - num_passes: int - reward: float - - def to_csv(self) -> str: - return ",".join( - [ - f"{self.runtime_seconds:.3f}", - str(self.total_episode_count), - str(self.total_step_count), - str(self.num_passes), - str(self.reward), - ] - ) - - @classmethod - def from_csv(cls, line: str) -> "ProgressLogEntry": - ( - runtime_seconds, - total_episode_count, - total_step_count, - num_passes, - reward, - ) = line.split(",") - return ProgressLogEntry( - float(runtime_seconds), - int(total_episode_count), - int(total_step_count), - int(num_passes), - float(reward), - ) diff --git a/tests/random_search_test.py b/tests/random_search_test.py index 4680d6416..24c532872 100644 --- a/tests/random_search_test.py +++ b/tests/random_search_test.py @@ -8,8 +8,7 @@ import gym -from compiler_gym.random_replay import replay_actions_from_logs -from compiler_gym.random_search import random_search +from compiler_gym.random_search import random_search, replay_actions_from_logs from tests.pytest_plugins.common import set_command_line_flags from tests.test_main import main From 6275b06e281936acd211253101d0ff5ee66185e0 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 13:23:11 +0100 Subject: [PATCH 042/254] [tests] Refactor `e_ctx` pattern to use regex error matchers. --- tests/datasets/benchmark_test.py | 5 +---- tests/datasets/dataset_test.py | 13 +++++++------ tests/datasets/datasets_test.py | 6 ++---- tests/datasets/files_dataset_test.py | 8 +++----- tests/llvm/invalid_ir_test.py | 4 +--- tests/validation_result_test.py | 3 +-- 6 files changed, 15 insertions(+), 24 deletions(-) diff --git a/tests/datasets/benchmark_test.py b/tests/datasets/benchmark_test.py index a18c4d5f9..6392d5528 100644 --- a/tests/datasets/benchmark_test.py +++ b/tests/datasets/benchmark_test.py @@ -294,12 +294,9 @@ def test_benchmark_from_file(tmpwd: Path): def test_benchmark_from_file_not_found(tmpwd: Path): path = tmpwd / "foo.txt" - with pytest.raises(FileNotFoundError) as e_ctx: + with pytest.raises(FileNotFoundError, match=str(path)): Benchmark.from_file("benchmark://example-v0/foo", path) - # Use endswith() because macOS can add a /private prefix to paths. - assert str(e_ctx.value).endswith(str(path)) - def test_dataset_equality_and_sorting(): """Test comparison operators between datasets.""" diff --git a/tests/datasets/dataset_test.py b/tests/datasets/dataset_test.py index 979752e72..fccb3385d 100644 --- a/tests/datasets/dataset_test.py +++ b/tests/datasets/dataset_test.py @@ -21,7 +21,13 @@ def test_dataset__invalid_name(invalid_name: str): """Test that invalid dataset names raise an error on init.""" - with pytest.raises(ValueError) as e_ctx: + with pytest.raises( + ValueError, + match=( + f"Invalid dataset name: '{invalid_name}'. " + "Dataset name must be in the form: '{{protocol}}://{{name}}-v{{version}}'" + ), + ): Dataset( name=invalid_name, description="A test dataset", @@ -29,11 +35,6 @@ def test_dataset__invalid_name(invalid_name: str): site_data_base="test", ) - assert str(e_ctx.value) == ( - f"Invalid dataset name: '{invalid_name}'. " - "Dataset name must be in the form: '{{protocol}}://{{name}}-v{{version}}'" - ) - def test_dataset_properties(): """Test the dataset property values.""" diff --git a/tests/datasets/datasets_test.py b/tests/datasets/datasets_test.py index 2402eea71..4a38ac7b8 100644 --- a/tests/datasets/datasets_test.py +++ b/tests/datasets/datasets_test.py @@ -147,13 +147,11 @@ def test_datasets_get_item_lookup_miss(): da = MockDataset("benchmark://foo-v0") datasets = Datasets([da]) - with pytest.raises(LookupError) as e_ctx: + with pytest.raises(LookupError, match=r"^Dataset not found: benchmark://bar-v0$"): datasets.dataset("benchmark://bar-v0") - assert str(e_ctx.value) == "Dataset not found: benchmark://bar-v0" - with pytest.raises(LookupError) as e_ctx: + with pytest.raises(LookupError, match=r"^Dataset not found: benchmark://bar-v0$"): _ = datasets["benchmark://bar-v0"] - assert str(e_ctx.value) == "Dataset not found: benchmark://bar-v0" def test_benchmark_lookup_by_uri(): diff --git a/tests/datasets/files_dataset_test.py b/tests/datasets/files_dataset_test.py index f81716d72..93a545dff 100644 --- a/tests/datasets/files_dataset_test.py +++ b/tests/datasets/files_dataset_test.py @@ -96,13 +96,11 @@ def test_populated_dataset_first_file(populated_dataset: FilesDataset): def test_populated_dataset_benchmark_lookup_not_found(populated_dataset: FilesDataset): - with pytest.raises(LookupError) as e_ctx: + with pytest.raises( + LookupError, match=r"^Benchmark not found: benchmark://test-v0/not/a/file" + ): populated_dataset.benchmark("benchmark://test-v0/not/a/file") - assert str(e_ctx.value).startswith( - "Benchmark not found: benchmark://test-v0/not/a/file" - ) - def test_populated_dataset_with_file_extension_filter(populated_dataset: FilesDataset): populated_dataset.benchmark_file_suffix = ".jpg" diff --git a/tests/llvm/invalid_ir_test.py b/tests/llvm/invalid_ir_test.py index 1fc7c8123..62fe9bb07 100644 --- a/tests/llvm/invalid_ir_test.py +++ b/tests/llvm/invalid_ir_test.py @@ -22,11 +22,9 @@ def test_reset_invalid_ir(env: LlvmEnv): """Test that setting the $CXX to an invalid binary raises an error.""" benchmark = llvm.make_benchmark(INVALID_IR_PATH) - with pytest.raises(BenchmarkInitError) as e_ctx: + with pytest.raises(BenchmarkInitError, match="Failed to compute .text size cost"): env.reset(benchmark=benchmark) - assert "Failed to compute .text size cost" in str(e_ctx.value) - if __name__ == "__main__": main() diff --git a/tests/validation_result_test.py b/tests/validation_result_test.py index 44473dbf7..da0105fd8 100644 --- a/tests/validation_result_test.py +++ b/tests/validation_result_test.py @@ -144,9 +144,8 @@ def test_validation_result_equality_different_errors_order(): def test_validation_result_join_no_inputs(): - with pytest.raises(ValueError) as e_ctx: + with pytest.raises(ValueError, match=r"^No states to join$"): ValidationResult.join([]) - assert str(e_ctx.value) == "No states to join" def test_validation_result_join_one_input(): From 5e833bf8f43456cd5af1dde21ab6a6f2b5b91c7a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 14:31:31 +0100 Subject: [PATCH 043/254] Replace owned logging instances with module-level loggers. This replaces the per-object instances of loggers with a shared per-module logger, accessed using logging.getLogger(__name__). The idea is to improve the consistency of logging. --- compiler_gym/datasets/dataset.py | 27 ++++---- compiler_gym/datasets/tar_dataset.py | 15 ++--- compiler_gym/envs/compiler_env.py | 61 +++++++++++-------- compiler_gym/envs/gcc/datasets/csmith.py | 8 ++- compiler_gym/envs/gcc/gcc.py | 24 ++++---- compiler_gym/envs/gcc/service/gcc_service.py | 10 +-- compiler_gym/envs/llvm/datasets/cbench.py | 9 +-- compiler_gym/envs/llvm/datasets/clgen.py | 7 ++- compiler_gym/envs/llvm/datasets/csmith.py | 8 ++- compiler_gym/envs/llvm/datasets/poj104.py | 5 +- compiler_gym/envs/llvm/llvm_benchmark.py | 4 +- .../extract_passes_from_llvm_source_tree.py | 8 ++- .../service/passes/filter_action_space.py | 4 +- .../passes/make_action_space_genfiles.py | 14 +++-- .../service/loop_tool_compilation_session.py | 6 +- compiler_gym/leaderboard/llvm_instcount.py | 1 - compiler_gym/service/connection.py | 32 +++++----- .../service/runtime/benchmark_cache.py | 12 ++-- .../service/runtime/compiler_gym_service.py | 12 ++-- compiler_gym/util/debug_util.py | 15 +++++ compiler_gym/util/download.py | 10 +-- compiler_gym/util/minimize_trajectory.py | 34 ++++++----- .../example_compiler_gym_service/env_tests.py | 10 --- tests/compiler_env_test.py | 13 ++-- tests/datasets/dataset_test.py | 6 ++ tests/llvm/llvm_env_test.py | 5 -- tests/service/runtime/benchmark_cache_test.py | 12 ++-- 27 files changed, 206 insertions(+), 166 deletions(-) diff --git a/compiler_gym/datasets/dataset.py b/compiler_gym/datasets/dataset.py index 3ee7bb71e..1ecc1a184 100644 --- a/compiler_gym/datasets/dataset.py +++ b/compiler_gym/datasets/dataset.py @@ -10,11 +10,18 @@ from typing import Dict, Iterable, Optional, Union import numpy as np +from deprecated.sphinx import deprecated from deprecated.sphinx import deprecated as mark_deprecated from compiler_gym.datasets.benchmark import Benchmark from compiler_gym.datasets.uri import DATASET_NAME_RE -from compiler_gym.util.debug_util import get_logging_level + +logger = logging.getLogger(__name__) + +# NOTE(cummins): This is only required to prevent a name conflict with the now +# deprecated Dataset.logger attribute. This can be removed once the logger +# attribute is removed, scheduled for release 0.2.3. +_logger = logger class Dataset: @@ -43,7 +50,6 @@ def __init__( references: Optional[Dict[str, str]] = None, deprecated: Optional[str] = None, sort_order: int = 0, - logger: Optional[logging.Logger] = None, validatable: str = "No", ): """Constructor. @@ -100,7 +106,6 @@ def __init__( self._deprecation_message = deprecated self._validatable = validatable - self._logger = logger self.sort_order = sort_order self.benchmark_class = benchmark_class @@ -112,19 +117,19 @@ def __repr__(self): return self.name @property + @deprecated( + version="0.2.1", + reason=( + "The `Dataset.logger` attribute is deprecated. All Dataset " + "instances share a logger named compiler_gym.datasets" + ), + ) def logger(self) -> logging.Logger: """The logger for this dataset. :type: logging.Logger """ - # NOTE(cummins): Default logger instantiation is deferred since in - # Python 3.6 the Logger instance contains an un-pickle-able Rlock() - # which can prevent gym.make() from working. This is a workaround that - # can be removed once Python 3.6 support is dropped. - if self._logger is None: - self._logger = logging.getLogger("compiler_gym.datasets") - self._logger.setLevel(get_logging_level()) - return self._logger + return _logger @property def name(self) -> str: diff --git a/compiler_gym/datasets/tar_dataset.py b/compiler_gym/datasets/tar_dataset.py index 4059a0d90..b6b8ab80e 100644 --- a/compiler_gym/datasets/tar_dataset.py +++ b/compiler_gym/datasets/tar_dataset.py @@ -5,6 +5,7 @@ import bz2 import gzip import io +import logging import shutil import tarfile from threading import Lock @@ -17,6 +18,8 @@ from compiler_gym.util.download import download from compiler_gym.util.filesystem import atomic_file_write +logger = logging.getLogger(__name__) + # Module-level locks that ensures exclusive access to install routines across # threads. Note that these lock are shared across all TarDataset instances. We # don't use per-dataset locks as locks cannot be pickled. @@ -89,9 +92,9 @@ def install(self) -> None: # Remove any partially-completed prior extraction. shutil.rmtree(self.site_data_path / "contents", ignore_errors=True) - self.logger.info("Downloading %s dataset", self.name) + logger.info("Downloading %s dataset", self.name) tar_data = io.BytesIO(download(self.tar_urls, self.tar_sha256)) - self.logger.info("Unpacking %s dataset", self.name) + logger.info("Unpacking %s dataset", self.name) with tarfile.open( fileobj=tar_data, mode=f"r:{self.tar_compression}" ) as arc: @@ -165,7 +168,7 @@ def _read_manifest_file(self) -> List[str]: """ with open(self._manifest_path, encoding="utf-8") as f: uris = self._read_manifest(f.read()) - self.logger.debug("Read %s manifest, %d entries", self.name, len(uris)) + logger.debug("Read %s manifest, %d entries", self.name, len(uris)) return uris @memoized_property @@ -192,7 +195,7 @@ def _benchmark_uris(self) -> List[str]: ) # Decompress the manifest data. - self.logger.debug("Downloading %s manifest", self.name) + logger.debug("Downloading %s manifest", self.name) manifest_data = io.BytesIO( download(self.manifest_urls, self.manifest_sha256) ) @@ -206,9 +209,7 @@ def _benchmark_uris(self) -> List[str]: f.write(manifest_data) uris = self._read_manifest(manifest_data.decode("utf-8")) - self.logger.debug( - "Downloaded %s manifest, %d entries", self.name, len(uris) - ) + logger.debug("Downloaded %s manifest, %d entries", self.name, len(uris)) return uris @memoized_property diff --git a/compiler_gym/envs/compiler_env.py b/compiler_gym/envs/compiler_env.py index 99bbca777..a6325dd32 100644 --- a/compiler_gym/envs/compiler_env.py +++ b/compiler_gym/envs/compiler_env.py @@ -47,7 +47,6 @@ proto_to_action_space, ) from compiler_gym.spaces import DefaultRewardFromObservation, NamedDiscrete, Reward -from compiler_gym.util.debug_util import get_logging_level from compiler_gym.util.gym_type_hints import ( ActionType, ObservationType, @@ -60,6 +59,13 @@ from compiler_gym.validation_result import ValidationResult from compiler_gym.views import ObservationSpaceSpec, ObservationView, RewardView +logger = logging.getLogger(__name__) + +# NOTE(cummins): This is only required to prevent a name conflict with the now +# deprecated CompilerEnv.logger attribute. This can be removed once the logger +# attribute is removed, scheduled for release 0.2.3. +_logger = logger + def _wrapped_step( service: CompilerGymServiceConnection, request: StepRequest @@ -113,11 +119,6 @@ class CompilerEnv(gym.Env): :vartype service: compiler_gym.service.CompilerGymServiceConnection - :ivar logger: A Logger instance used by the environment for communicating - info and warnings. - - :vartype logger: logging.Logger - :ivar action_spaces: A list of supported action space names. :vartype action_spaces: List[str] @@ -210,23 +211,23 @@ def __init__( :param service_connection: An existing compiler gym service connection to use. - :param logger: The logger to use for this environment. If not provided, - a :code:`compiler_gym.envs` logger is used and assigned the - verbosity returned by :func:`get_logging_level() - `. - :raises FileNotFoundError: If service is a path to a file that is not found. :raises TimeoutError: If the compiler service fails to initialize within the parameters provided in :code:`connection_settings`. """ - self.metadata = {"render.modes": ["human", "ansi"]} + # NOTE(cummins): Logger argument deprecated and scheduled to be removed + # in release 0.2.3. + if logger: + warnings.warn( + "The `logger` argument is deprecated on CompilerEnv.__init__() " + "and will be removed in a future release. All CompilerEnv " + "instances share a logger named compiler_gym.envs.compiler_env", + DeprecationWarning, + ) - if logger is None: - logger = logging.getLogger("compiler_gym.envs") - logger.setLevel(get_logging_level()) - self.logger = logger + self.metadata = {"render.modes": ["human", "ansi"]} # A compiler service supports multiple simultaneous environments. This # session ID is used to identify this environment. @@ -238,7 +239,6 @@ def __init__( self.service = service_connection or CompilerGymServiceConnection( endpoint=self._service_endpoint, opts=self._connection_settings, - logger=self.logger, ) self.datasets = Datasets(datasets or []) @@ -330,6 +330,17 @@ def available_datasets(self) -> Dict[str, Dataset]: """A dictionary of datasets.""" return {d.name: d for d in self.datasets} + @property + @deprecated( + version="0.2.1", + reason=( + "The `CompilerEnv.logger` attribute is deprecated. All CompilerEnv " + "instances share a logger named compiler_gym.envs.compiler_env" + ), + ) + def logger(self): + return _logger + @property def versions(self) -> GetVersionReply: """Get the version numbers from the compiler service.""" @@ -447,10 +458,10 @@ def benchmark(self, benchmark: Union[str, Benchmark]): ) if isinstance(benchmark, str): benchmark_object = self.datasets.benchmark(benchmark) - self.logger.debug("Setting benchmark by name: %s", benchmark_object) + logger.debug("Setting benchmark by name: %s", benchmark_object) self._next_benchmark = benchmark_object elif isinstance(benchmark, Benchmark): - self.logger.debug("Setting benchmark: %s", benchmark.uri) + logger.debug("Setting benchmark: %s", benchmark.uri) self._next_benchmark = benchmark else: raise TypeError( @@ -573,9 +584,7 @@ def fork(self) -> "CompilerEnv": actions = self.actions.copy() self.reset() if actions: - self.logger.warning( - "Parent service of fork() has died, replaying state" - ) + logger.warning("Parent service of fork() has died, replaying state") _, _, done, _ = self.step(actions) assert not done, "Failed to replay action sequence" @@ -668,7 +677,7 @@ def close(self): if reply.remaining_sessions: close_service = False except Exception as e: - self.logger.warning( + logger.warning( "Failed to end active compiler session on close(): %s (%s)", e, type(e).__name__, @@ -720,7 +729,7 @@ def reset( # pylint: disable=arguments-differ def _retry(error) -> Optional[ObservationType]: """Abort and retry on error.""" - self.logger.warning("%s during reset(): %s", type(error).__name__, error) + logger.warning("%s during reset(): %s", type(error).__name__, error) if self.service: self.service.close() self.service = None @@ -763,13 +772,13 @@ def _call_with_error( # Stop an existing episode. if self.in_episode: - self.logger.debug("Ending session %d", self._session_id) + logger.debug("Ending session %d", self._session_id) error, _ = _call_with_error( self.service.stub.EndSession, EndSessionRequest(session_id=self._session_id), ) if error: - self.logger.warning( + logger.warning( "Failed to stop session %d with %s: %s", self._session_id, type(error).__name__, diff --git a/compiler_gym/envs/gcc/datasets/csmith.py b/compiler_gym/envs/gcc/datasets/csmith.py index 460899f19..2041e4d60 100644 --- a/compiler_gym/envs/gcc/datasets/csmith.py +++ b/compiler_gym/envs/gcc/datasets/csmith.py @@ -21,6 +21,8 @@ from compiler_gym.util.shell_format import plural from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + # The maximum value for the --seed argument to csmith. UINT_MAX = (2 ** 32) - 1 @@ -194,7 +196,7 @@ def benchmark_from_seed( # Run csmith with the given seed and pipe the output to clang to # assemble a bitcode. - self.logger.debug("Exec csmith --seed %d", seed) + logger.debug("Exec csmith --seed %d", seed) csmith = subprocess.Popen( [str(self.csmith_bin_path), "--seed", str(seed)], stdout=subprocess.PIPE, @@ -208,11 +210,11 @@ def benchmark_from_seed( stderr = "\n".join( truncate(stderr.decode("utf-8"), max_line_len=200, max_lines=20) ) - logging.warning("Csmith failed with seed %d: %s", seed, stderr) + logger.warning("Csmith failed with seed %d: %s", seed, stderr) except UnicodeDecodeError: # Failed to interpret the stderr output, generate a generic # error message. - logging.warning("Csmith failed with seed %d", seed) + logger.warning("Csmith failed with seed %d", seed) return self.benchmark_from_seed( seed, max_retries=max_retries, retry_count=retry_count + 1 ) diff --git a/compiler_gym/envs/gcc/gcc.py b/compiler_gym/envs/gcc/gcc.py index 41f875426..e4561611f 100755 --- a/compiler_gym/envs/gcc/gcc.py +++ b/compiler_gym/envs/gcc/gcc.py @@ -32,6 +32,8 @@ from compiler_gym.util.filesystem import atomic_file_write from compiler_gym.util.runfiles_path import site_data_path +logger = logging.getLogger(__name__) + class Option: """An Option is either a command line optimization setting or a parameter. @@ -156,7 +158,7 @@ class GccFlagAlignOption(Option): """Alignment flags. These take several forms. See the GCC documentation.""" def __init__(self, name: str): - logging.warning("Alignment options not properly handled %s", name) + logger.warning("Alignment options not properly handled %s", name) self.name = name def __len__(self): @@ -390,7 +392,7 @@ def size(self) -> int: def _gcc_parse_optimize(gcc: Gcc) -> List[Option]: """Parse the optimization help string from the GCC binary to find options.""" - logging.debug("Parsing GCC optimization space") + logger.debug("Parsing GCC optimization space") # Call 'gcc --help=optimize -Q' result = gcc("--help=optimize", "-Q", timeout=60) @@ -519,7 +521,7 @@ def parse_line(line: str): add_gcc_flag_int(name, min, max) return - logging.warning("Unknown GCC optimization flag spec, '%s'", line) + logger.warning("Unknown GCC optimization flag spec, '%s'", line) # Parse all the lines for line in out: @@ -533,7 +535,7 @@ def _gcc_parse_params(gcc: Gcc) -> List[Option]: """Parse the param help string from the GCC binary to find options.""" # Pretty much identical to _gcc_parse_optimize - logging.debug("Parsing GCC param space") + logger.debug("Parsing GCC param space") result = gcc("--help=param", "-Q", timeout=60) out = result.split("\n")[1:] @@ -622,7 +624,7 @@ def parse_line(line: str): add_gcc_param_int(name, min, max) return - logging.warning("Unknown GCC param flag spec, '%s'", line) + logger.warning("Unknown GCC param flag spec, '%s'", line) # breakpoint() for line in out: @@ -682,13 +684,13 @@ def keep(option: Option) -> bool: def _gcc_get_version(gcc: Gcc) -> str: """Get the version string""" - logging.debug("Getting GCC version for %s", gcc.bin) + logger.debug("Getting GCC version for %s", gcc.bin) try: result = gcc("--version", timeout=60) except ServiceError as e: raise EnvironmentNotSupported(f"Failed to run GCC binary: {gcc.bin}") from e version = result.split("\n")[0] - logging.debug("GCC version is %s", version) + logger.debug("GCC version is %s", version) if "gcc" not in version: raise ServiceInitError(f"Invalid GCC version string: {version}") return version @@ -724,9 +726,9 @@ def _get_spec(gcc: Gcc, cache_dir: Path) -> Optional[GccSpec]: with open(spec_path, "rb") as f: spec = pickle.load(f) spec = GccSpec(gcc=gcc, version=spec.version, options=spec.options) - logging.debug("GccSpec for version '%s' read from %s", version, spec_path) + logger.debug("GccSpec for version '%s' read from %s", version, spec_path) except (pickle.UnpicklingError, EOFError) as e: - logging.warning("Unable to read spec from '%s': %s", spec_path, e) + logger.warning("Unable to read spec from '%s': %s", spec_path, e) if spec is None: # Pickle doesn't exist, parse @@ -741,8 +743,8 @@ def _get_spec(gcc: Gcc, cache_dir: Path) -> Optional[GccSpec]: spec_path.parent.mkdir(exist_ok=True, parents=True) with atomic_file_write(spec_path, fileobj=True) as f: pickle.dump(spec, f) - logging.debug("GccSpec for %s written to %s", version, spec_path) + logger.debug("GccSpec for %s written to %s", version, spec_path) - logging.debug("GccSpec size is approximately 10^%.0f", round(math.log(spec.size))) + logger.debug("GccSpec size is approximately 10^%.0f", round(math.log(spec.size))) return spec diff --git a/compiler_gym/envs/gcc/service/gcc_service.py b/compiler_gym/envs/gcc/service/gcc_service.py index b4db8ef4d..df78f866d 100755 --- a/compiler_gym/envs/gcc/service/gcc_service.py +++ b/compiler_gym/envs/gcc/service/gcc_service.py @@ -32,6 +32,8 @@ ScalarRangeList, ) +logger = logging.getLogger(__name__) + def make_gcc_compilation_session(gcc_bin: str): """Create a class to represent a GCC compilation service. @@ -402,7 +404,7 @@ def compile(self) -> Optional[str]: """Compile the benchmark""" if not self._obj: self.prepare_files() - logging.debug( + logger.debug( "Compiling: %s", " ".join(map(str, self.obj_command_line())) ) gcc( @@ -420,7 +422,7 @@ def assemble(self) -> Optional[str]: """Assemble the benchmark""" if not self._asm: self.prepare_files() - logging.debug( + logger.debug( "Assembling: %s", " ".join(map(str, self.asm_command_line())) ) gcc( @@ -439,7 +441,7 @@ def dump_rtl(self) -> Optional[str]: """Dump the RTL (and assemble the benchmark)""" if not self._rtl: self.prepare_files() - logging.debug( + logger.debug( "Dumping RTL: %s", " ".join(map(str, self.rtl_command_line())) ) gcc( @@ -484,7 +486,7 @@ def apply_action( # Apply the action to this session and check if we changed anything old_choices = self.choices.copy() action(self) - logging.debug("Applied action %s", action) + logger.debug("Applied action %s", action) # Reset the internal variables if this action has caused a change in the # choices diff --git a/compiler_gym/envs/llvm/datasets/cbench.py b/compiler_gym/envs/llvm/datasets/cbench.py index 3aad537f3..6a7fcf595 100644 --- a/compiler_gym/envs/llvm/datasets/cbench.py +++ b/compiler_gym/envs/llvm/datasets/cbench.py @@ -27,6 +27,8 @@ from compiler_gym.util.timer import Timer from compiler_gym.validation_result import ValidationError +logger = logging.getLogger(__name__) + _CBENCH_TARS = { "macos": ( "https://dl.fbaipublicfiles.com/compiler_gym/llvm_bitcodes-10.0.0-cBench-v1-macos.tar.bz2", @@ -94,7 +96,6 @@ def _compile_and_run_bitcode_file( linkopts: List[str], env: Dict[str, str], num_runs: int, - logger: logging.Logger, sanitizer: Optional[LlvmSanitizer] = None, timeout_seconds: float = 300, compilation_timeout_seconds: float = 60, @@ -317,7 +318,6 @@ def validator_cb(env: "LlvmEnv") -> Optional[ValidationError]: # noqa: F821 linkopts=linkopts + ["-O2"], # Always assume safe. sanitizer=None, - logger=env.logger, env=os_env, ) if gold_standard.error: @@ -354,7 +354,6 @@ def validator_cb(env: "LlvmEnv") -> Optional[ValidationError]: # noqa: F821 num_runs=num_runs, linkopts=linkopts, sanitizer=sanitizer, - logger=env.logger, env=os_env, ) @@ -409,9 +408,7 @@ def flaky_wrapped_cb(env: "LlvmEnv") -> Optional[ValidationError]: # noqa: F821 # Timeout errors can be raised by the environment in case of a # slow step / observation, and should be retried. pass - env.logger.warning( - "Validation callback failed, attempt=%d/%d", j, flakiness - ) + logger.warning("Validation callback failed, attempt=%d/%d", j, flakiness) return error return flaky_wrapped_cb diff --git a/compiler_gym/envs/llvm/datasets/clgen.py b/compiler_gym/envs/llvm/datasets/clgen.py index 006d56c24..6283c90fe 100644 --- a/compiler_gym/envs/llvm/datasets/clgen.py +++ b/compiler_gym/envs/llvm/datasets/clgen.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import io +import logging import shutil import subprocess import tarfile @@ -19,6 +20,8 @@ from compiler_gym.util.filesystem import atomic_file_write from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + _CLGEN_INSTALL_LOCK = Lock() @@ -93,7 +96,7 @@ def install(self): # Download the libclc headers. shutil.rmtree(self.libclc_dir, ignore_errors=True) - self.logger.info("Downloading OpenCL headers") + logger.info("Downloading OpenCL headers") tar_data = io.BytesIO( download( "https://dl.fbaipublicfiles.com/compiler_gym/libclc-v0.tar.bz2", @@ -148,7 +151,7 @@ def benchmark(self, uri: str) -> Benchmark: "-w", # No warnings. ], ).command(outpath=tmp_bc_path) - self.logger.debug("Exec %s", compile_command) + logger.debug("Exec %s", compile_command) clang = subprocess.Popen( compile_command, stdin=subprocess.PIPE, diff --git a/compiler_gym/envs/llvm/datasets/csmith.py b/compiler_gym/envs/llvm/datasets/csmith.py index 6050d85bc..c7adb5220 100644 --- a/compiler_gym/envs/llvm/datasets/csmith.py +++ b/compiler_gym/envs/llvm/datasets/csmith.py @@ -18,6 +18,8 @@ from compiler_gym.util.shell_format import plural from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + # The maximum value for the --seed argument to csmith. UINT_MAX = (2 ** 32) - 1 @@ -178,7 +180,7 @@ def benchmark_from_seed( # Run csmith with the given seed and pipe the output to clang to # assemble a bitcode. - self.logger.debug("Exec csmith --seed %d", seed) + logger.debug("Exec csmith --seed %d", seed) csmith = subprocess.Popen( [str(self.csmith_bin_path), "--seed", str(seed)], stdout=subprocess.PIPE, @@ -192,11 +194,11 @@ def benchmark_from_seed( stderr = "\n".join( truncate(stderr.decode("utf-8"), max_line_len=200, max_lines=20) ) - logging.warning("Csmith failed with seed %d: %s", seed, stderr) + logger.warning("Csmith failed with seed %d: %s", seed, stderr) except UnicodeDecodeError: # Failed to interpret the stderr output, generate a generic # error message. - logging.warning("Csmith failed with seed %d", seed) + logger.warning("Csmith failed with seed %d", seed) return self.benchmark_from_seed( seed, max_retries=max_retries, retry_count=retry_count + 1 ) diff --git a/compiler_gym/envs/llvm/datasets/poj104.py b/compiler_gym/envs/llvm/datasets/poj104.py index 39fc8e9c1..140d73174 100644 --- a/compiler_gym/envs/llvm/datasets/poj104.py +++ b/compiler_gym/envs/llvm/datasets/poj104.py @@ -2,6 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +import logging import subprocess import sys from concurrent.futures import as_completed @@ -16,6 +17,8 @@ from compiler_gym.util.filesystem import atomic_file_write from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + class POJ104Dataset(TarDatasetWithManifest): """The POJ-104 dataset contains 52000 C++ programs implementing 104 @@ -101,7 +104,7 @@ def benchmark(self, uri: Optional[str] = None) -> Benchmark: "-std=c++11", ], ).command(outpath=tmp_bitcode_path) - self.logger.debug("Exec %s", compile_cmd) + logger.debug("Exec %s", compile_cmd) clang = subprocess.Popen( compile_cmd, stdin=subprocess.PIPE, diff --git a/compiler_gym/envs/llvm/llvm_benchmark.py b/compiler_gym/envs/llvm/llvm_benchmark.py index 4a58361a8..5a36dbf4d 100644 --- a/compiler_gym/envs/llvm/llvm_benchmark.py +++ b/compiler_gym/envs/llvm/llvm_benchmark.py @@ -20,6 +20,8 @@ from compiler_gym.util.runfiles_path import transient_cache_path from compiler_gym.util.thread_pool import get_thread_pool_executor +logger = logging.getLogger(__name__) + def _communicate(process, input=None, timeout=None): """subprocess.communicate() which kills subprocess on timeout.""" @@ -115,7 +117,7 @@ def get_system_includes() -> List[Path]: try: _SYSTEM_INCLUDES = list(get_compiler_includes(system_compiler)) except OSError as e: - logging.warning("%s", e) + logger.warning("%s", e) _SYSTEM_INCLUDES = [] return _SYSTEM_INCLUDES diff --git a/compiler_gym/envs/llvm/service/passes/extract_passes_from_llvm_source_tree.py b/compiler_gym/envs/llvm/service/passes/extract_passes_from_llvm_source_tree.py index e03aab0cd..f75136528 100644 --- a/compiler_gym/envs/llvm/service/passes/extract_passes_from_llvm_source_tree.py +++ b/compiler_gym/envs/llvm/service/passes/extract_passes_from_llvm_source_tree.py @@ -36,6 +36,8 @@ from compiler_gym.envs.llvm.service.passes.common import Pass from compiler_gym.envs.llvm.service.passes.config import CREATE_PASS_NAME_MAP +logger = logging.getLogger(__name__) + # A regular expression to match the start of an invocation of one of the # InitializePass helper macros. INITIALIZE_PASS_RE = r"(INITIALIZE_PASS|INITIALIZE_PASS_BEGIN|INITIALIZE_PASS_WITH_OPTIONS|INITIALIZE_PASS_WITH_OPTIONS_BEGIN)\(" @@ -221,11 +223,11 @@ def handle_file(source_path: Path) -> Tuple[Path, List[Pass]]: sys.exit(1) if passes: - logging.debug( + logger.debug( f"Extracted {len(passes)} {'passes' if len(passes) - 1 else 'pass'} from {source_path}", ) else: - logging.debug(f"Found no passes in {source_path}") + logger.debug(f"Found no passes in {source_path}") return passes @@ -245,7 +247,7 @@ def main(argv): universal_newlines=True, ) matching_paths += grep.strip().split("\n") - logging.debug("Processing %s files ...", len(matching_paths)) + logger.debug("Processing %s files ...", len(matching_paths)) paths = [Path(path) for path in matching_paths] # Build a list of pass entries. diff --git a/compiler_gym/envs/llvm/service/passes/filter_action_space.py b/compiler_gym/envs/llvm/service/passes/filter_action_space.py index d5126ac84..9204e6ad4 100644 --- a/compiler_gym/envs/llvm/service/passes/filter_action_space.py +++ b/compiler_gym/envs/llvm/service/passes/filter_action_space.py @@ -15,6 +15,8 @@ from compiler_gym.envs.llvm.service.passes import config from compiler_gym.envs.llvm.service.passes.common import Pass +logger = logging.getLogger(__name__) + def filter_passes(pass_iterator: Iterable[Pass]) -> Iterable[Pass]: """Apply config.include_pass() to an input sequence of passes. @@ -29,7 +31,7 @@ def filter_passes(pass_iterator: Iterable[Pass]) -> Iterable[Pass]: total_count += 1 if config.include_pass(pass_): selected_count += 1 - logging.debug( + logger.debug( f"Selected {pass_.name} pass ({pass_.flag}) from {pass_.source}", ) yield pass_ diff --git a/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py b/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py index 1e3a57bbd..58d5e800e 100644 --- a/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py +++ b/compiler_gym/envs/llvm/service/passes/make_action_space_genfiles.py @@ -84,6 +84,8 @@ from compiler_gym.envs.llvm.service.passes.common import Pass from compiler_gym.envs.llvm.service.passes.config import EXTRA_LLVM_HEADERS +logger = logging.getLogger(__name__) + def process_pass(pass_, headers, enum_f, switch_f): """Extract and process transform passes in header.""" @@ -121,8 +123,8 @@ def make_action_sources(pass_iterator, outpath: Path): print("};", file=enum_f) print(" }", file=switch_f) - logging.debug("Generated %s", switch_path.name) - logging.debug("Generated %s", enum_path.name) + logger.debug("Generated %s", switch_path.name) + logger.debug("Generated %s", enum_path.name) with open(include_path, "w") as f: print("#pragma once", file=f) @@ -141,17 +143,17 @@ def make_action_sources(pass_iterator, outpath: Path): """, file=f, ) - logging.debug("Generated %s", include_path.name) + logger.debug("Generated %s", include_path.name) with open(flags_path, "w") as f: print("\n".join(p.flag for p in passes), file=f) - logging.debug("Generated %s", flags_path.name) + logger.debug("Generated %s", flags_path.name) with open(descriptions_path, "w") as f: print("\n".join(p.description for p in passes), file=f) - logging.debug("Generated %s", descriptions_path.name) + logger.debug("Generated %s", descriptions_path.name) - logging.debug("Created genfiles for %s pass actions", total_passes) + logger.debug("Created genfiles for %s pass actions", total_passes) def main(argv): diff --git a/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py b/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py index a794077b6..dfb64b265 100644 --- a/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py +++ b/compiler_gym/envs/loop_tool/service/loop_tool_compilation_session.py @@ -28,6 +28,8 @@ ScalarRangeList, ) +logger = logging.getLogger(__name__) + class LoopToolCompilationSession(CompilationSession): """Represents an instance of an interactive loop_tool session.""" @@ -128,7 +130,7 @@ def __init__( self.thread = [1, 0, 0] self.cursor = 0 self.mode = "size" - logging.info("Started a compilation session for %s", benchmark.uri) + logger.info("Started a compilation session for %s", benchmark.uri) def resize(self, increment): """ @@ -219,7 +221,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo ): raise ValueError("Out-of-range") - logging.info("Applied action %d", choice_index) + logger.info("Applied action %d", choice_index) act = self.action_space.choice[0].named_discrete_space.value[choice_index] if self.mode not in ["size", "select"]: diff --git a/compiler_gym/leaderboard/llvm_instcount.py b/compiler_gym/leaderboard/llvm_instcount.py index f071b3c1e..26e3c0ad0 100644 --- a/compiler_gym/leaderboard/llvm_instcount.py +++ b/compiler_gym/leaderboard/llvm_instcount.py @@ -230,7 +230,6 @@ def main(argv): # Stream verbose CompilerGym logs to file. logger = logging.getLogger("compiler_gym") logger.setLevel(logging.DEBUG) - env.logger.setLevel(logging.DEBUG) log_handler = logging.FileHandler(FLAGS.leaderboard_logfile) logger.addHandler(log_handler) logger.propagate = False diff --git a/compiler_gym/service/connection.py b/compiler_gym/service/connection.py index 8ac52f52a..033cb4571 100644 --- a/compiler_gym/service/connection.py +++ b/compiler_gym/service/connection.py @@ -25,7 +25,7 @@ GetSpacesRequest, ObservationSpace, ) -from compiler_gym.util.debug_util import get_debug_level +from compiler_gym.util.debug_util import get_debug_level, logging_level_to_debug_level from compiler_gym.util.runfiles_path import ( runfiles_path, site_data_path, @@ -42,6 +42,8 @@ ("grpc.enable_http_proxy", 0), ] +logger = logging.getLogger(__name__) + class ConnectionOpts(BaseModel): """The options used to configure a connection to a service.""" @@ -158,16 +160,14 @@ def __call__( class Connection: """Base class for service connections.""" - def __init__(self, channel, url: str, logger: logging.Logger): + def __init__(self, channel, url: str): """Constructor. Don't instantiate this directly, use the subclasses. :param channel: The RPC channel to use. :param url: The URL of the RPC service. - :param logger: A logger instance that will be used for logging messages. """ self.channel = channel self.url = url - self.logger = logger self.stub = CompilerGymServiceStub(self.channel) self.spaces: GetSpacesReply = self(self.stub.GetSpaces, GetSpacesRequest()) @@ -223,7 +223,7 @@ def __call__( f"{self.url} {e.details()} ({max_retries} retries)" ) from None remaining = max_retries - attempt - self.logger.warning( + logger.warning( "%s %s (%d %s remaining)", self.url, e.details(), @@ -297,7 +297,6 @@ def __init__( port_init_max_seconds: float, rpc_init_max_seconds: float, process_exit_max_seconds: float, - logger: logging.Logger, script_args: List[str], script_env: Dict[str, str], ): @@ -333,7 +332,9 @@ def __init__( # Set the verbosity of the service. The logging level of the service is # the debug level - 1, so that COMPILER_GYM_DEBUG=3 will cause VLOG(2) # and lower to be logged to stdout. - debug_level = get_debug_level() + debug_level = max( + get_debug_level(), logging_level_to_debug_level(logger.getEffectiveLevel()) + ) if debug_level > 0: cmd.append("--alsologtostderr") cmd.append(f"-v={debug_level - 1}") @@ -445,7 +446,7 @@ def __init__( f"{rpc_init_max_seconds:.1f} seconds.{logs_message}" ) - super().__init__(channel, url, logger) + super().__init__(channel, url) def loglines(self) -> Iterable[str]: """Fetch any available log lines from the service backend. @@ -478,14 +479,14 @@ def close(self): f"Service exited with returncode {self.process.returncode}" ) except ProcessLookupError: - self.logger.warning("Service process not found at %s", self.working_dir) + logger.warning("Service process not found at %s", self.working_dir) except subprocess.TimeoutExpired: # Try and kill it and then walk away. try: self.process.kill() except: # noqa pass - self.logger.warning("Abandoning orphan service at %s", self.working_dir) + logger.warning("Abandoning orphan service at %s", self.working_dir) finally: shutil.rmtree(self.working_dir, ignore_errors=True) super().close() @@ -498,7 +499,7 @@ def __repr__(self): class UnmanagedConnection(Connection): """A connection to a service that is not managed by this process.""" - def __init__(self, url: str, rpc_init_max_seconds: float, logger: logging.Logger): + def __init__(self, url: str, rpc_init_max_seconds: float): """Constructor. :param url: The URL of the service to connect to. @@ -529,7 +530,7 @@ def __init__(self, url: str, rpc_init_max_seconds: float, logger: logging.Logger f"{rpc_init_max_seconds:.1f} seconds" ) - super().__init__(channel, url, logger) + super().__init__(channel, url) def __repr__(self): return self.url @@ -588,7 +589,6 @@ def __init__( self, endpoint: Union[str, Path], opts: ConnectionOpts = None, - logger: Optional[logging.Logger] = None, ): """Constructor. @@ -604,7 +604,6 @@ def __init__( self.opts = opts or ConnectionOpts() self.connection = None self.stub = None - self.logger = logger or logging.getLogger("") self._establish_connection() self.action_spaces: List[ActionSpace] = list( @@ -616,7 +615,7 @@ def __init__( def _establish_connection(self) -> None: """Create and establish a connection.""" - self.connection = self._create_connection(self.endpoint, self.opts, self.logger) + self.connection = self._create_connection(self.endpoint, self.opts) self.stub = self.connection.stub @classmethod @@ -624,7 +623,6 @@ def _create_connection( cls, endpoint: Union[str, Path], opts: ConnectionOpts, - logger: logging.Logger, ) -> Connection: """Initialize the service connection, either by connecting to an RPC service or by starting a locally-managed subprocess. @@ -656,7 +654,6 @@ def _create_connection( process_exit_max_seconds=opts.local_service_exit_max_seconds, rpc_init_max_seconds=opts.rpc_init_max_seconds, port_init_max_seconds=opts.local_service_port_init_max_seconds, - logger=logger, script_args=opts.script_args, script_env=opts.script_env, ) @@ -665,7 +662,6 @@ def _create_connection( return UnmanagedConnection( url=endpoint, rpc_init_max_seconds=opts.rpc_init_max_seconds, - logger=logger, ) except (TimeoutError, ServiceError, NotImplementedError) as e: # Catch preventable errors so that we can retry: diff --git a/compiler_gym/service/runtime/benchmark_cache.py b/compiler_gym/service/runtime/benchmark_cache.py index 72a862b75..add4eea2b 100644 --- a/compiler_gym/service/runtime/benchmark_cache.py +++ b/compiler_gym/service/runtime/benchmark_cache.py @@ -11,6 +11,8 @@ MAX_SIZE_IN_BYTES = 512 * 104 * 1024 +logger = logging.getLogger(__name__) + class BenchmarkCache: """An in-memory cache of Benchmark messages. @@ -24,11 +26,9 @@ def __init__( self, max_size_in_bytes: int = MAX_SIZE_IN_BYTES, rng: Optional[np.random.Generator] = None, - logger: Optional[logging.Logger] = None, ): self._max_size_in_bytes = max_size_in_bytes self.rng = rng or np.random.default_rng() - self.logger = logger or logging.getLogger("compiler_gym") self._benchmarks: Dict[str, Benchmark] = {} self._size_in_bytes = 0 @@ -46,7 +46,7 @@ def __contains__(self, uri: str): def __setitem__(self, uri: str, benchmark: Benchmark): """Add benchmark to cache.""" - self.logger.debug( + logger.debug( "Caching benchmark %s. Cache size = %d bytes, %d items", uri, self.size_in_bytes, @@ -61,14 +61,14 @@ def __setitem__(self, uri: str, benchmark: Benchmark): size = benchmark.ByteSize() if self.size_in_bytes + size > self.max_size_in_bytes: if size > self.max_size_in_bytes: - self.logger.warning( + logger.warning( "Adding new benchmark with size %d bytes exceeds total " "target cache size of %d bytes", size, self.max_size_in_bytes, ) else: - self.logger.debug( + logger.debug( "Adding new benchmark with size %d bytes " "exceeds maximum size %d bytes, %d items", size, @@ -96,7 +96,7 @@ def evict_to_capacity(self, target_size_in_bytes: Optional[int] = None) -> None: del self._benchmarks[key] if evicted: - self.logger.info( + logger.info( "Evicted %d benchmarks from cache. " "Benchmark cache size now %d bytes, %d items", evicted, diff --git a/compiler_gym/service/runtime/compiler_gym_service.py b/compiler_gym/service/runtime/compiler_gym_service.py index 9fb507b97..50c4b5af4 100644 --- a/compiler_gym/service/runtime/compiler_gym_service.py +++ b/compiler_gym/service/runtime/compiler_gym_service.py @@ -32,6 +32,8 @@ from compiler_gym.service.runtime.benchmark_cache import BenchmarkCache from compiler_gym.util.version import __version__ +logger = logging.getLogger(__name__) + # NOTE(cummins): The CompilerGymService class is used in a subprocess by a # compiler service, so code coverage tracking does not work. As such we use "# # pragma: no cover" annotation for all definitions in this file. @@ -85,7 +87,7 @@ def __init__(self, working_directory: Path, compilation_session_type): def GetVersion(self, request: GetVersionRequest, context) -> GetVersionReply: del context # Unused del request # Unused - logging.debug("GetVersion()") + logger.debug("GetVersion()") return GetVersionReply( service_version=__version__, compiler_version=self.compilation_session_type.compiler_version, @@ -93,7 +95,7 @@ def GetVersion(self, request: GetVersionRequest, context) -> GetVersionReply: def GetSpaces(self, request: GetSpacesRequest, context) -> GetSpacesReply: del request # Unused - logging.debug("GetSpaces()") + logger.debug("GetSpaces()") with exception_to_grpc_status(context): return GetSpacesReply( action_space_list=self.action_spaces, @@ -102,7 +104,7 @@ def GetSpaces(self, request: GetSpacesRequest, context) -> GetSpacesReply: def StartSession(self, request: StartSessionRequest, context) -> StartSessionReply: """Create a new compilation session.""" - logging.debug( + logger.debug( "StartSession(id=%d, benchmark=%s), %d active sessions", self.next_session_id, request.benchmark.uri, @@ -148,7 +150,7 @@ def StartSession(self, request: StartSessionRequest, context) -> StartSessionRep def EndSession(self, request: EndSessionRequest, context) -> EndSessionReply: del context # Unused - logging.debug( + logger.debug( "EndSession(id=%d), %d sessions remaining", request.session_id, len(self.sessions) - 1, @@ -160,7 +162,7 @@ def EndSession(self, request: EndSessionRequest, context) -> EndSessionReply: return EndSessionReply(remaining_sessions=len(self.sessions)) def Step(self, request: StepRequest, context) -> StepReply: - logging.debug("Step()") + logger.debug("Step()") reply = StepReply() if request.session_id not in self.sessions: diff --git a/compiler_gym/util/debug_util.py b/compiler_gym/util/debug_util.py index 27ff77586..edc87db40 100644 --- a/compiler_gym/util/debug_util.py +++ b/compiler_gym/util/debug_util.py @@ -68,3 +68,18 @@ def set_debug_level(level: int) -> None: :param level: The debugging level to use. """ os.environ["COMPILER_GYM_DEBUG"] = str(level) + logging.getLogger("compiler_gym").setLevel( + _DEBUG_LEVEL_LOGGING_LEVEL_MAP.get(level, logging.DEBUG) + ) + + +def logging_level_to_debug_level(logging_level: int) -> int: + """Convert a python logging level to a debug level. + + See :func:`get_debug_level` for a description of the debug levels. + + :param logging_level: A python logging level. + + :returns: An integer logging level in the range :code:`[0,3]`. + """ + return max(_LOGGING_LEVEL_DEBUG_LEVEL_MAP.get(logging_level, 1) - 1, 0) diff --git a/compiler_gym/util/download.py b/compiler_gym/util/download.py index 2171e525b..c68a54ace 100644 --- a/compiler_gym/util/download.py +++ b/compiler_gym/util/download.py @@ -14,6 +14,8 @@ from compiler_gym.util.runfiles_path import cache_path from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + class DownloadFailed(IOError): """Error thrown if a download fails.""" @@ -42,7 +44,7 @@ def _get_url_data(url: str) -> bytes: def _do_download_attempt(url: str, sha256: Optional[str]) -> bytes: - logging.info("Downloading %s ...", url) + logger.info("Downloading %s ...", url) content = _get_url_data(url) if sha256: # Validate the checksum. @@ -63,7 +65,7 @@ def _do_download_attempt(url: str, sha256: Optional[str]) -> bytes: with atomic_file_write(path, fileobj=True) as f: f.write(content) - logging.debug(f"Downloaded {url}") + logger.debug(f"Downloaded {url}") return content @@ -85,7 +87,7 @@ def _download(urls: List[str], sha256: Optional[str], max_retries: int) -> bytes return _do_download_attempt(url, sha256) except TooManyRequests as e: last_exception = e - logging.info( + logger.info( "Download attempt failed with Too Many Requests error. " "Watiting %.1f seconds", wait_time, @@ -93,7 +95,7 @@ def _download(urls: List[str], sha256: Optional[str], max_retries: int) -> bytes sleep(wait_time) wait_time *= 1.5 except DownloadFailed as e: - logging.info("Download attempt failed: %s", truncate(e)) + logger.info("Download attempt failed: %s", truncate(e)) last_exception = e raise last_exception diff --git a/compiler_gym/util/minimize_trajectory.py b/compiler_gym/util/minimize_trajectory.py index face9be21..0de687699 100644 --- a/compiler_gym/util/minimize_trajectory.py +++ b/compiler_gym/util/minimize_trajectory.py @@ -17,6 +17,8 @@ from compiler_gym.util.truncate import truncate +logger = logging.getLogger(__name__) + class MinimizationError(OSError): """Error raised if trajectory minimization fails.""" @@ -30,7 +32,7 @@ class MinimizationError(OSError): def environment_validation_fails(env: "CompilerEnv") -> bool: # noqa: F821 """A hypothesis that holds true if environment validation fails.""" validation_result = env.validate() - logging.debug(truncate(str(validation_result), max_lines=1, max_line_len=120)) + logger.debug(truncate(str(validation_result), max_lines=1, max_line_len=120)) return not validation_result.okay() @@ -38,13 +40,13 @@ def _apply_and_test(env, actions, hypothesis, flakiness) -> bool: """Run specific actions on environment and return whether hypothesis holds.""" env.reset(benchmark=env.benchmark) for _ in range(flakiness): - logging.debug("Applying %d actions ...", len(actions)) + logger.debug("Applying %d actions ...", len(actions)) _, _, done, info = env.step(actions) if done: raise MinimizationError( f"Failed to replay actions: {info.get('error_details', '')}" ) - logging.debug("Applied %d actions", len(actions)) + logger.debug("Applied %d actions", len(actions)) if hypothesis(env): return True return False @@ -87,7 +89,7 @@ def apply_and_test(actions): if not all_actions: return env - logging.info( + logger.info( "%sisecting sequence of %d actions", "Reverse b" if reverse else "B", len(all_actions), @@ -104,13 +106,13 @@ def apply_and_test(actions): step += 1 remaining_steps = int(log(max(right - left, 1), 2)) mid = left + ((right - left) // 2) - logging.debug( + logger.debug( "Bisect step=%d, left=%d, right=%d, mid=%d", step, left, right, mid ) actions = all_actions[mid:] if reverse else all_actions[:mid] if apply_and_test(actions): - logging.info( + logger.info( "🟢 Hypothesis holds at num_actions=%d, remaining bisect steps=%d", mid, remaining_steps, @@ -121,7 +123,7 @@ def apply_and_test(actions): else: right = mid - 1 else: - logging.info( + logger.info( "🔴 Hypothesis does not hold at num_actions=%d, remaining bisect steps=%d", mid, remaining_steps, @@ -134,10 +136,10 @@ def apply_and_test(actions): mid = max(left, right) - 1 if reverse else min(left, right) + 1 if (reverse and mid < 0) or (not reverse and mid >= len(all_actions)): actions = all_actions - logging.info("Failed to reduce trajectory length using bisection") + logger.info("Failed to reduce trajectory length using bisection") else: actions = all_actions[mid:] if reverse else all_actions[:mid] - logging.info( + logger.info( "Determined that action %d of %d is the first at which the hypothesis holds: %s", mid, len(all_actions), @@ -216,7 +218,7 @@ def apply_and_test(actions): for _ in range(num_to_remove): del candidate_actions[random.randint(0, len(candidate_actions) - 1)] if apply_and_test(candidate_actions): - logging.info( + logger.info( "🟢 Hypothesis holds with %s of %s actions randomly removed, continuing", num_to_remove, len(actions), @@ -225,14 +227,14 @@ def apply_and_test(actions): discard_ratio = init_discard_ratio yield env else: - logging.info( + logger.info( "🔴 Hypothesis does not hold with %s of %s actions randomly removed, rolling back", num_to_remove, len(actions), ) discard_ratio *= discard_ratio_decay if num_to_remove == 1: - logging.info( + logger.info( "Terminating random minimization after failing with only a single action removed" ) break @@ -290,7 +292,7 @@ def apply_and_test(actions): pass_num += 1 action_has_been_pruned = False action_mask = [True] * len(all_actions) - logging.info("Minimization pass on sequence of %d actions", len(all_actions)) + logger.info("Minimization pass on sequence of %d actions", len(all_actions)) # Inner loop. Go through every action and see if it can be removed. for i in range(len(action_mask)): @@ -298,7 +300,7 @@ def apply_and_test(actions): action_name = env.action_space.flags[all_actions[i]] actions = [action for action, mask in zip(all_actions, action_mask) if mask] if apply_and_test(actions): - logging.info( + logger.info( "🟢 Hypothesis holds with action %s removed, %d actions remaining", action_name, sum(action_mask), @@ -308,7 +310,7 @@ def apply_and_test(actions): yield env else: action_mask[i] = True - logging.info( + logger.info( "🔴 Hypothesis does not hold with action %s removed, %d actions remaining", action_name, sum(action_mask), @@ -316,7 +318,7 @@ def apply_and_test(actions): all_actions = [action for action, mask in zip(all_actions, action_mask) if mask] - logging.info( + logger.info( "Minimization halted after %d passes, %d of %d actions removed", pass_num, actions_removed, diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index 91e9d8d61..8f471e0d5 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -3,7 +3,6 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Tests for the example CompilerGym service.""" -import logging import subprocess from pathlib import Path @@ -15,7 +14,6 @@ from compiler_gym.envs import CompilerEnv from compiler_gym.service import SessionNotFound from compiler_gym.spaces import Box, NamedDiscrete, Scalar, Sequence -from compiler_gym.util.debug_util import set_debug_level from tests.test_main import main # Given that the C++ and Python service implementations have identical @@ -39,14 +37,6 @@ def bin(request) -> Path: yield request.param -@pytest.mark.parametrize("env_id", EXAMPLE_ENVIRONMENTS) -def test_debug_level(env_id: str): - """Test that debug level is set.""" - set_debug_level(3) - with gym.make(env_id) as env: - assert env.logger.level == logging.DEBUG - - def test_invalid_arguments(bin: Path): """Test that running the binary with unrecognized arguments is an error.""" diff --git a/tests/compiler_env_test.py b/tests/compiler_env_test.py index 97b68114e..9ff33814d 100644 --- a/tests/compiler_env_test.py +++ b/tests/compiler_env_test.py @@ -3,8 +3,6 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Unit tests for //compiler_gym/envs.""" -import logging - import gym import pytest from flaky import flaky @@ -36,12 +34,11 @@ def test_benchmark_set_in_reset(env: LlvmEnv): assert env.benchmark == "benchmark://cbench-v1/dijkstra" -def test_logger_forced(): - logger = logging.getLogger("test_logger") - with gym.make("llvm-v0") as env_a: - with gym.make("llvm-v0", logger=logger) as env_b: - assert env_a.logger != logger - assert env_b.logger == logger +def test_logger_is_deprecated(env: LlvmEnv): + with pytest.deprecated_call( + match="The `CompilerEnv.logger` attribute is deprecated" + ): + env.logger def test_uri_substring_no_match(env: LlvmEnv): diff --git a/tests/datasets/dataset_test.py b/tests/datasets/dataset_test.py index fccb3385d..99645c256 100644 --- a/tests/datasets/dataset_test.py +++ b/tests/datasets/dataset_test.py @@ -237,5 +237,11 @@ def test_benchmarks_iter(): assert list(dataset) == [1, 2, 3] +def test_logger_is_deprecated(): + dataset = DatasetForTesting() + with pytest.deprecated_call(match="The `Dataset.logger` attribute is deprecated"): + dataset.logger + + if __name__ == "__main__": main() diff --git a/tests/llvm/llvm_env_test.py b/tests/llvm/llvm_env_test.py index 19feab19a..f112f55b1 100644 --- a/tests/llvm/llvm_env_test.py +++ b/tests/llvm/llvm_env_test.py @@ -20,7 +20,6 @@ from compiler_gym.envs.llvm.llvm_env import LlvmEnv from compiler_gym.service import ServiceError from compiler_gym.service.connection import CompilerGymServiceConnection -from compiler_gym.util import debug_util as dbg from tests.pytest_plugins import llvm as llvm_plugin from tests.test_main import main @@ -212,10 +211,6 @@ def test_generate_enum_declarations(env: LlvmEnv): assert issubclass(llvm.reward_spaces, Enum) -def test_logging_default_level(env: LlvmEnv): - assert env.logger.level == dbg.get_logging_level() - - def test_step_multiple_actions_list(env: LlvmEnv): """Pass a list of actions to step().""" env.reset(benchmark="cbench-v1/crc32") diff --git a/tests/service/runtime/benchmark_cache_test.py b/tests/service/runtime/benchmark_cache_test.py index e3036e3dd..7bed096a9 100644 --- a/tests/service/runtime/benchmark_cache_test.py +++ b/tests/service/runtime/benchmark_cache_test.py @@ -7,7 +7,7 @@ import pytest from compiler_gym.service.proto import Benchmark, File -from compiler_gym.service.runtime.benchmark_cache import BenchmarkCache +from compiler_gym.service.runtime.benchmark_cache import BenchmarkCache, logger from tests.test_main import main @@ -57,7 +57,7 @@ def test_evict_to_capacity_on_max_size_reached(mocker): cache = BenchmarkCache(max_size_in_bytes=100) mocker.spy(cache, "evict_to_capacity") - mocker.spy(cache.logger, "info") + mocker.spy(logger, "info") cache["a"] = make_benchmark_of_size(30) cache["b"] = make_benchmark_of_size(30) @@ -70,7 +70,7 @@ def test_evict_to_capacity_on_max_size_reached(mocker): assert cache.size == 2 assert cache.size_in_bytes == 60 - cache.logger.info.assert_called_once_with( + logger.info.assert_called_once_with( "Evicted %d benchmarks from cache. Benchmark cache size now %d bytes, " "%d items", 2, @@ -85,11 +85,11 @@ def test_oversized_benchmark_emits_warning(mocker): """ cache = BenchmarkCache(max_size_in_bytes=10) - mocker.spy(cache.logger, "warning") + mocker.spy(logger, "warning") cache["test"] = make_benchmark_of_size(50) - cache.logger.warning.assert_called_once_with( + logger.warning.assert_called_once_with( "Adding new benchmark with size %d bytes exceeds total target cache " "size of %d bytes", 50, @@ -128,7 +128,7 @@ def test_evict_to_capacity_on_maximum_size_update(mocker): cache = BenchmarkCache(max_size_in_bytes=100) mocker.spy(cache, "evict_to_capacity") - mocker.spy(cache.logger, "info") + mocker.spy(logger, "info") cache["a"] = make_benchmark_of_size(30) cache["b"] = make_benchmark_of_size(30) From c74bb2e55fe40e2418e54a57cab7be4b1c742beb Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 15:44:57 +0100 Subject: [PATCH 044/254] More verbose logging when downloading large datasets. Issue #445. --- compiler_gym/datasets/tar_dataset.py | 7 +++++-- compiler_gym/third_party/llvm/__init__.py | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/compiler_gym/datasets/tar_dataset.py b/compiler_gym/datasets/tar_dataset.py index b6b8ab80e..6b2040343 100644 --- a/compiler_gym/datasets/tar_dataset.py +++ b/compiler_gym/datasets/tar_dataset.py @@ -92,9 +92,12 @@ def install(self) -> None: # Remove any partially-completed prior extraction. shutil.rmtree(self.site_data_path / "contents", ignore_errors=True) - logger.info("Downloading %s dataset", self.name) + logger.warning( + "Installing the %s dataset. This may take a few moments ...", self.name + ) + tar_data = io.BytesIO(download(self.tar_urls, self.tar_sha256)) - logger.info("Unpacking %s dataset", self.name) + logger.info("Unpacking %s dataset to %s", self.name, self.site_data_path) with tarfile.open( fileobj=tar_data, mode=f"r:{self.tar_compression}" ) as arc: diff --git a/compiler_gym/third_party/llvm/__init__.py b/compiler_gym/third_party/llvm/__init__.py index 58be6ba2c..80781616f 100644 --- a/compiler_gym/third_party/llvm/__init__.py +++ b/compiler_gym/third_party/llvm/__init__.py @@ -4,6 +4,7 @@ # LICENSE file in the root directory of this source tree. """Module for resolving paths to LLVM binaries and libraries.""" import io +import logging import shutil import sys import tarfile @@ -16,6 +17,8 @@ from compiler_gym.util.download import download from compiler_gym.util.runfiles_path import cache_path, site_data_path +logger = logging.getLogger(__name__) + # The data archive containing LLVM binaries and libraries. _LLVM_URL, _LLVM_SHA256 = { "darwin": ( @@ -37,6 +40,10 @@ def _download_llvm_files(destination: Path) -> Path: """Download and unpack the LLVM data pack.""" + logger.warning( + "Installing the CompilerGym LLVM environment runtime. This may take a few moments ..." + ) + # Tidy up an incomplete unpack. shutil.rmtree(destination, ignore_errors=True) From dd272c811e6d48170b387c1b2d193fa2d51e5764 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 29 Sep 2021 21:02:41 +0100 Subject: [PATCH 045/254] [tests] Bump pytest dependency versions. --- tests/requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 623fd95ef..a93d91ec0 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,11 +1,11 @@ flaky==3.7.0 psutil==5.8.0 # Implicit dependency of pytest-xdist -pytest==6.1.0 -pytest-benchmark==3.2.3 -pytest-cov==2.11.1 -pytest-mock==3.6.0 -pytest-shard==0.1.1 +pytest==6.2.5 +pytest-benchmark==3.4.1 +pytest-cov==2.12.1 +pytest-mock==3.6.1 +pytest-shard==0.1.2 pytest-stress==1.0.1 pytest-sugar==0.9.4 pytest-timeout==1.4.2 -pytest-xdist==2.2.1 +pytest-xdist==2.4.0 From 4963a3efa02ea0ce3b63879acd6a2f1f3a31b2cf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 17:23:03 +0100 Subject: [PATCH 046/254] Be consistent in use of process.kill(). Always check the Python version and use terminate() on py < 3.7, and always block until the process has actually terminated. --- compiler_gym/envs/llvm/compute_observation.py | 7 +++++++ compiler_gym/envs/llvm/datasets/cbench.py | 14 ++++++++++++-- compiler_gym/envs/llvm/llvm_benchmark.py | 1 + compiler_gym/service/connection.py | 19 ++++++++++++++++--- tests/llvm/multiprocessing_test.py | 2 +- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/compiler_gym/envs/llvm/compute_observation.py b/compiler_gym/envs/llvm/compute_observation.py index 1585fc78d..426b9fce6 100644 --- a/compiler_gym/envs/llvm/compute_observation.py +++ b/compiler_gym/envs/llvm/compute_observation.py @@ -4,6 +4,7 @@ # LICENSE file in the root directory of this source tree. """This module defines a utility function for computing LLVM observations.""" import subprocess +import sys from pathlib import Path from typing import List @@ -81,6 +82,12 @@ def compute_observation( try: stdout, stderr = process.communicate(timeout=timeout) except subprocess.TimeoutExpired as e: + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + process.kill() + else: + process.terminate() + process.communicate(timeout=timeout) # Wait for shutdown to complete. raise TimeoutError( f"Failed to compute {observation_space.id} observation in " f"{timeout:.1f} {plural(int(round(timeout)), 'second', 'seconds')}" diff --git a/compiler_gym/envs/llvm/datasets/cbench.py b/compiler_gym/envs/llvm/datasets/cbench.py index 6a7fcf595..f344f085c 100644 --- a/compiler_gym/envs/llvm/datasets/cbench.py +++ b/compiler_gym/envs/llvm/datasets/cbench.py @@ -145,7 +145,12 @@ def _compile_and_run_bitcode_file( try: output, _ = clang.communicate(timeout=compilation_timeout_seconds) except subprocess.TimeoutExpired: - clang.kill() + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + clang.kill() + else: + clang.terminate() + clang.communicate(timeout=30) # Wait for shutdown to complete. error_data["timeout"] = compilation_timeout_seconds return BenchmarkExecutionResult( walltime_seconds=timeout_seconds, @@ -183,7 +188,12 @@ def _compile_and_run_bitcode_file( with Timer() as timer: stdout, _ = process.communicate(timeout=timeout_seconds) except subprocess.TimeoutExpired: - process.kill() + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + process.kill() + else: + process.terminate() + process.communicate(timeout=30) # Wait for shutdown to complete. error_data["timeout_seconds"] = timeout_seconds return BenchmarkExecutionResult( walltime_seconds=timeout_seconds, diff --git a/compiler_gym/envs/llvm/llvm_benchmark.py b/compiler_gym/envs/llvm/llvm_benchmark.py index 5a36dbf4d..0e354749b 100644 --- a/compiler_gym/envs/llvm/llvm_benchmark.py +++ b/compiler_gym/envs/llvm/llvm_benchmark.py @@ -33,6 +33,7 @@ def _communicate(process, input=None, timeout=None): process.kill() else: process.terminate() + process.communicate(timeout=timeout) # Wait for shutdown to complete. raise diff --git a/compiler_gym/service/connection.py b/compiler_gym/service/connection.py index 033cb4571..af4f7072e 100644 --- a/compiler_gym/service/connection.py +++ b/compiler_gym/service/connection.py @@ -401,7 +401,11 @@ def __init__( sleep(wait_secs) wait_secs *= 1.2 else: - self.process.kill() + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + self.process.kill() + else: + self.process.terminate() self.process.communicate(timeout=rpc_init_max_seconds) shutil.rmtree(self.working_dir) raise TimeoutError( @@ -430,7 +434,11 @@ def __init__( ) wait_secs *= 1.2 else: - self.process.kill() + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + self.process.kill() + else: + self.process.terminate() self.process.communicate(timeout=process_exit_max_seconds) # Include the last few lines of logs generated by the compiler @@ -483,7 +491,12 @@ def close(self): except subprocess.TimeoutExpired: # Try and kill it and then walk away. try: - self.process.kill() + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + self.process.kill() + else: + self.process.terminate() + self.process.communicate(timeout=60) except: # noqa pass logger.warning("Abandoning orphan service at %s", self.working_dir) diff --git a/tests/llvm/multiprocessing_test.py b/tests/llvm/multiprocessing_test.py index bca182aba..d2ae8f4d1 100644 --- a/tests/llvm/multiprocessing_test.py +++ b/tests/llvm/multiprocessing_test.py @@ -62,7 +62,7 @@ def test_running_environment_in_background_process(): process.kill() else: process.terminate() - process.join() + process.join(timeout=60) @macos_only From 3580bb1be792034eabb99eaf5d8298b22ff90cb5 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 17:23:58 +0100 Subject: [PATCH 047/254] [Makefile] Don't double quote paths. --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index c12f88b63..975f963e6 100644 --- a/Makefile +++ b/Makefile @@ -275,12 +275,12 @@ livedocs: gendocs doxygen # Testing # ########### -COMPILER_GYM_SITE_DATA ?= "/tmp/compiler_gym_$(USER)/tests/site_data" -COMPILER_GYM_CACHE ?= "/tmp/compiler_gym_$(USER)/tests/cache" +COMPILER_GYM_SITE_DATA ?= /tmp/compiler_gym_$(USER)/tests/site_data +COMPILER_GYM_CACHE ?= /tmp/compiler_gym_$(USER)/tests/cache # A directory that is used as the working directory for running pytest tests # by symlinking the tests directory into it. -INSTALL_TEST_ROOT ?= "/tmp/compiler_gym_$(USER)/install_tests" +INSTALL_TEST_ROOT ?= /tmp/compiler_gym_$(USER)/install_tests # The target to use. If not provided, all tests will be run. For `make test` and # related, this is a bazel target pattern, with default value '//...'. For `make From c4f2c27a7b12a45ac4641d3ba7e989a0645d7331 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 17:24:06 +0100 Subject: [PATCH 048/254] [Makefile] Fix redundant instruction. --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 975f963e6..bab14cb64 100644 --- a/Makefile +++ b/Makefile @@ -307,7 +307,6 @@ itest: bazel-fetch install-test-setup: mkdir -p "$(INSTALL_TEST_ROOT)" rm -f "$(INSTALL_TEST_ROOT)/tests" "$(INSTALL_TEST_ROOT)/tox.ini" - ln -s "$(INSTALL_TEST_ROOT)" ln -s "$(ROOT)/tests" "$(INSTALL_TEST_ROOT)" ln -s "$(ROOT)/tox.ini" "$(INSTALL_TEST_ROOT)" From 380c5422c22807aad2b9ff1bc1144a6c8795786e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 17:25:33 +0100 Subject: [PATCH 049/254] [Makefile] Update list of data file locations. --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index bab14cb64..05c598f09 100644 --- a/Makefile +++ b/Makefile @@ -359,10 +359,12 @@ install: | init-runtime-requirements bazel-build pip-install # A list of all filesystem locations that CompilerGym may use for storing # files and data. COMPILER_GYM_DATA_FILE_LOCATIONS = \ - $(HOME)/.cache/compiler_gym \ - $(HOME)/.local/share/compiler_gym \ - $(HOME)/logs/compiler_gym \ + "$(HOME)/.cache/compiler_gym" \ + "$(HOME)/.local/share/compiler_gym" \ + "$(HOME)/logs/compiler_gym" \ /dev/shm/compiler_gym \ + /dev/shm/compiler_gym_$(USER) \ + /tmp/compiler_gym \ /tmp/compiler_gym_$(USER) \ $(NULL) From 4c0d5c96bbe51ed5592f5000438a2bddb37e693a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 17:29:45 +0100 Subject: [PATCH 050/254] [llvm] Fix orphaned subprocess. --- compiler_gym/envs/llvm/datasets/llvm_stress.py | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler_gym/envs/llvm/datasets/llvm_stress.py b/compiler_gym/envs/llvm/datasets/llvm_stress.py index 130add7a7..949b17c49 100644 --- a/compiler_gym/envs/llvm/datasets/llvm_stress.py +++ b/compiler_gym/envs/llvm/datasets/llvm_stress.py @@ -86,6 +86,7 @@ def benchmark_from_seed(self, seed: int) -> Benchmark: ) stdout, _ = llvm_as.communicate(timeout=60) + llvm_stress.communicate(timeout=60) if llvm_stress.returncode or llvm_as.returncode: raise BenchmarkInitError("Failed to generate benchmark") From 9d2d2061942a40c73d9c70680b8504edd6496d72 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 6 Oct 2021 18:33:20 +0100 Subject: [PATCH 051/254] [tests] Mark a flaky test. --- tests/llvm/llvm_env_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/llvm/llvm_env_test.py b/tests/llvm/llvm_env_test.py index f112f55b1..a1efc22a6 100644 --- a/tests/llvm/llvm_env_test.py +++ b/tests/llvm/llvm_env_test.py @@ -10,6 +10,7 @@ import gym import pytest +from flaky import flaky import compiler_gym from compiler_gym.compiler_env_state import ( @@ -75,6 +76,7 @@ def test_double_reset(env: LlvmEnv, always_send_benchmark_on_reset: bool): assert env.in_episode +@flaky def test_connection_dies_default_reward(env: LlvmEnv): env.reward_space = "IrInstructionCount" env.reset(benchmark="cbench-v1/crc32") @@ -98,6 +100,7 @@ def test_connection_dies_default_reward(env: LlvmEnv): assert reward == 2.5 +@flaky def test_connection_dies_default_reward_negated(env: LlvmEnv): env.reward_space = "IrInstructionCount" env.reset(benchmark="cbench-v1/crc32") From a247b40e3f403b562e76e608db57310c249c029f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 7 Oct 2021 18:00:41 +0100 Subject: [PATCH 052/254] [requirements] Pin gym at < 0.21. Fixes #456. --- compiler_gym/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/requirements.txt b/compiler_gym/requirements.txt index c76c2edbb..721c9590d 100644 --- a/compiler_gym/requirements.txt +++ b/compiler_gym/requirements.txt @@ -3,7 +3,7 @@ deprecated>=1.2.12 docker>=4.0.0 fasteners>=0.15 grpcio>=1.32.0 -gym>=0.18.0 +gym>=0.18.0,<0.21 humanize>=2.6.0 loop_tool_py==0.0.7 networkx>=2.5 From 2f00774ceae7ce3009dc528e4342d1fdf0eb6f35 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 11 Oct 2021 16:48:31 +0100 Subject: [PATCH 053/254] [tests] Add missing __init__.py file --- tests/loop_tool/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/loop_tool/__init__.py diff --git a/tests/loop_tool/__init__.py b/tests/loop_tool/__init__.py new file mode 100644 index 000000000..768f77b7e --- /dev/null +++ b/tests/loop_tool/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the LICENSE file +# in the root directory of this source tree. +# +# tests/**/__init__.py files are needed for pytest Python path resolution. See: +# https://docs.pytest.org/en/latest/explanation/pythonpath.html From 7c10cffb4332c135f1b0d87aa142dd107676584d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 11 Oct 2021 16:51:17 +0100 Subject: [PATCH 054/254] [examples] Fix scoped thread pool. This ensures that the thread pool is destroyed after use. --- examples/explore.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/explore.py b/examples/explore.py index c943f9cb8..6ae6668d0 100644 --- a/examples/explore.py +++ b/examples/explore.py @@ -285,13 +285,11 @@ def number_list(stats): # Compute an action graph and use it to find the optimal sequence # within episode_length actions. Uses as many threads as there are # elements in envs. -def compute_action_graph(envs, episode_length): +def compute_action_graph(pool, envs, episode_length): assert len(envs) >= 1 env_queue = Queue() for env in envs: env_queue.put(env) - pool = ThreadPool(len(envs)) - stats = NodeTypeStats(action_count=env.action_space.n) graph = StateGraph(edges_per_node=env.action_space.n) @@ -448,7 +446,8 @@ def main(argv): try: for _ in range(FLAGS.nproc): envs.append(make_env()) - compute_action_graph(envs, episode_length=FLAGS.episode_length) + with ThreadPool(len(envs)) as pool: + compute_action_graph(pool, envs, episode_length=FLAGS.episode_length) finally: for env in envs: env.close() From fe9a37ac885e00da02403acaddc7e7b8e2b1848a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 7 Oct 2021 18:00:41 +0100 Subject: [PATCH 055/254] [requirements] Pin gym at < 0.21. Fixes #456. --- compiler_gym/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/requirements.txt b/compiler_gym/requirements.txt index c76c2edbb..721c9590d 100644 --- a/compiler_gym/requirements.txt +++ b/compiler_gym/requirements.txt @@ -3,7 +3,7 @@ deprecated>=1.2.12 docker>=4.0.0 fasteners>=0.15 grpcio>=1.32.0 -gym>=0.18.0 +gym>=0.18.0,<0.21 humanize>=2.6.0 loop_tool_py==0.0.7 networkx>=2.5 From edf915bc307e3b0fdb9bb6f1f47ae73c7498754c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 11 Oct 2021 18:57:47 +0100 Subject: [PATCH 056/254] Mark test regressions introduced in #453. Issue #459. --- .../action_sensitivity_analysis_test.py | 7 +++++++ tests/bin/service_bin_test.py | 6 ++++++ tests/gcc/gcc_env_test.py | 9 +++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/examples/sensitivity_analysis/action_sensitivity_analysis_test.py b/examples/sensitivity_analysis/action_sensitivity_analysis_test.py index cd586321b..554f432a3 100644 --- a/examples/sensitivity_analysis/action_sensitivity_analysis_test.py +++ b/examples/sensitivity_analysis/action_sensitivity_analysis_test.py @@ -4,9 +4,11 @@ # LICENSE file in the root directory of this source tree. """End-to-end test of //compiler_gym/bin:action_sensitivity_analysis.""" +import sys import tempfile from pathlib import Path +import pytest from absl.flags import FLAGS from sensitivity_analysis.action_sensitivity_analysis import ( run_action_sensitivity_analysis, @@ -14,6 +16,11 @@ from sensitivity_analysis.sensitivity_analysis_eval import run_sensitivity_analysis_eval +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_run_action_sensitivity_analysis(): actions = [0, 1] env = "llvm-v0" diff --git a/tests/bin/service_bin_test.py b/tests/bin/service_bin_test.py index 53c7e9011..083eae4d1 100644 --- a/tests/bin/service_bin_test.py +++ b/tests/bin/service_bin_test.py @@ -3,6 +3,8 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Unit tests for //compiler_gym/bin:service.""" +import sys + import gym import pytest from absl import flags @@ -14,6 +16,10 @@ @pytest.mark.parametrize("env_name", compiler_gym.COMPILER_GYM_ENVS) +@pytest.mark.xfail( + sys.platform == "darwin", + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_print_service_capabilities_smoke_test(env_name: str): flags.FLAGS(["argv0"]) try: diff --git a/tests/gcc/gcc_env_test.py b/tests/gcc/gcc_env_test.py index 3f457565b..3777c5832 100644 --- a/tests/gcc/gcc_env_test.py +++ b/tests/gcc/gcc_env_test.py @@ -14,7 +14,7 @@ from compiler_gym.service.connection import ServiceError from compiler_gym.spaces import Scalar, Sequence from tests.pytest_plugins.common import with_docker, without_docker -from tests.pytest_plugins.gcc import with_gcc_support +from tests.pytest_plugins.gcc import docker_is_available, with_gcc_support from tests.test_main import main pytest_plugins = ["tests.pytest_plugins.gcc"] @@ -35,7 +35,12 @@ def test_docker_default_action_space(): assert env.action_spaces[0].names[0] == "-O0" -def test_observation_spaces(gcc_bin: str): +@pytest.mark.xfail( + not docker_is_available(), + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) +def test_observation_spaces_failing_because_of_bug(gcc_bin: str): """Test that the environment reports the service's observation spaces.""" with gym.make("gcc-v0", gcc_bin=gcc_bin) as env: env.reset() From 7594a7179907aeff40537a2baf895bd0d302dcce Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 11 Oct 2021 22:13:08 +0100 Subject: [PATCH 057/254] [tests] Mark macOS test regressions. Issue #459. --- tests/llvm/datasets/csmith_test.py | 11 ++++++++++ ...esh_environment_observation_reward_test.py | 7 +++++++ tests/llvm/llvm_session_parameters_test.py | 7 +++++++ tests/llvm/observation_spaces_test.py | 20 +++++++++++++++++++ tests/llvm/runtime_test.py | 11 ++++++++++ 5 files changed, 56 insertions(+) diff --git a/tests/llvm/datasets/csmith_test.py b/tests/llvm/datasets/csmith_test.py index 50a8d09f2..955f85276 100644 --- a/tests/llvm/datasets/csmith_test.py +++ b/tests/llvm/datasets/csmith_test.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Tests for the Csmith dataset.""" +import sys from itertools import islice from pathlib import Path @@ -62,6 +63,11 @@ def test_csmith_from_seed_retry_count_exceeded(csmith_dataset: CsmithDataset): csmith_dataset.benchmark_from_seed(seed=1, max_retries=3, retry_count=5) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky(rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) def test_csmith_positive_runtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): benchmark = next(csmith_dataset.benchmarks()) @@ -71,6 +77,11 @@ def test_csmith_positive_runtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): assert np.all(np.greater(val, 0)) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky(rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) def test_csmith_positive_buildtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): benchmark = next(csmith_dataset.benchmarks()) diff --git a/tests/llvm/fresh_environment_observation_reward_test.py b/tests/llvm/fresh_environment_observation_reward_test.py index 8e5957e9d..0ec955090 100644 --- a/tests/llvm/fresh_environment_observation_reward_test.py +++ b/tests/llvm/fresh_environment_observation_reward_test.py @@ -3,7 +3,9 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Integrations tests for the LLVM CompilerGym environments.""" +import sys +import pytest from flaky import flaky from compiler_gym.envs import CompilerEnv @@ -12,6 +14,11 @@ pytest_plugins = ["tests.pytest_plugins.llvm"] +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Runtime can timeout def test_step(env: CompilerEnv, observation_space: str, reward_space: str): """Request every combination of observation and reward in a fresh environment.""" diff --git a/tests/llvm/llvm_session_parameters_test.py b/tests/llvm/llvm_session_parameters_test.py index 1d72cde52..56a8db6de 100644 --- a/tests/llvm/llvm_session_parameters_test.py +++ b/tests/llvm/llvm_session_parameters_test.py @@ -3,6 +3,8 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Tests for LLVM session parameter handlers.""" +import sys + import pytest from flaky import flaky @@ -67,6 +69,11 @@ def test_benchmarks_cache_parameter_invalid_int_type(env: LlvmEnv): env.send_params(("service.benchmark_cache.set_max_size_in_bytes", "not an int")) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Runtime can timeout. @pytest.mark.parametrize("n", [1, 3, 10]) def test_runtime_observation_parameters(env: LlvmEnv, n: int): diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index a98fd4b74..2210e1f2b 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -1202,6 +1202,11 @@ def test_object_text_size_observation_spaces(env: LlvmEnv): assert value == crc32_code_sizes[sys.platform][2] +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Runtimes can timeout def test_runtime_observation_space(env: LlvmEnv): env.reset("cbench-v1/crc32") @@ -1226,6 +1231,11 @@ def test_runtime_observation_space(env: LlvmEnv): assert len(set(value)) > 1 +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Runtimes can timeout def test_runtime_observation_space_different_observation_count(env: LlvmEnv): """Test setting a custom observation count for LLVM runtimes.""" @@ -1247,6 +1257,11 @@ def test_runtime_observation_space_different_observation_count(env: LlvmEnv): assert value.shape == (5,) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Runtimes can timeout def test_runtime_observation_space_invalid_observation_count(env: LlvmEnv): """Test setting an invalid custom observation count for LLVM runtimes.""" @@ -1273,6 +1288,11 @@ def test_runtime_observation_space_not_runnable(env: LlvmEnv): assert space.space.contains(value) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky # Build can timeout def test_buildtime_observation_space(env: LlvmEnv): env.reset("cbench-v1/crc32") diff --git a/tests/llvm/runtime_test.py b/tests/llvm/runtime_test.py index 72ad3a120..21c774a67 100644 --- a/tests/llvm/runtime_test.py +++ b/tests/llvm/runtime_test.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Integrations tests for LLVM runtime support.""" +import sys from pathlib import Path import numpy as np @@ -16,6 +17,11 @@ pytest_plugins = ["tests.pytest_plugins.llvm"] +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @pytest.mark.parametrize("runtime_observation_count", [1, 3, 5]) def test_custom_benchmark_runtime(env: LlvmEnv, tmpdir, runtime_observation_count: int): env.reset() @@ -50,6 +56,11 @@ def test_custom_benchmark_runtime(env: LlvmEnv, tmpdir, runtime_observation_coun assert np.all(runtimes > 0) +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @flaky def test_custom_benchmark_runtimes_differ(env: LlvmEnv, tmpdir): """Same as above, but test that runtimes differ from run to run.""" From 6470b6386e5d97d97b96236b75bf6e035db076cf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 12 Oct 2021 00:26:09 +0100 Subject: [PATCH 058/254] [llvm] Add a timeout to the make_specs.py script. --- compiler_gym/envs/llvm/make_specs.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/compiler_gym/envs/llvm/make_specs.py b/compiler_gym/envs/llvm/make_specs.py index aaf54e211..c44ce0d3d 100644 --- a/compiler_gym/envs/llvm/make_specs.py +++ b/compiler_gym/envs/llvm/make_specs.py @@ -6,6 +6,8 @@ Usage: make_specs.py . """ +import signal + # TODO: As we add support for more compilers we could generalize this script # to work with other compiler services rather than hardcoding to LLVM. import sys @@ -19,11 +21,24 @@ ) as f: _FLAG_DESCRIPTIONS = [ln.rstrip() for ln in f.readlines()] +# The maximum number of seconds to wait before timing out. +TIMEOUT_SECONDS = 300 + + +def timeout_handler(signum, frame): + del signum # unused + del frame # unused + print(f"error: Timeout reached after {TIMEOUT_SECONDS:,d} seconds", file=sys.stderr) + sys.exit(1) + def main(argv): assert len(argv) == 3, "Usage: make_specs.py " service_path, output_path = argv[1:] + signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(TIMEOUT_SECONDS) + with LlvmEnv(Path(service_path)) as env: with open(output_path, "w") as f: print("from enum import Enum", file=f) From 483c694d075521fbe96ba2254f9fedac1ba533cf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 12 Oct 2021 00:29:29 +0100 Subject: [PATCH 059/254] Deprecate the add_derived_space() API. Issue #461. --- compiler_gym/views/observation.py | 9 +++++++++ tests/llvm/observation_spaces_test.py | 15 +++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler_gym/views/observation.py b/compiler_gym/views/observation.py index f1305dd8f..47e714ed3 100644 --- a/compiler_gym/views/observation.py +++ b/compiler_gym/views/observation.py @@ -4,6 +4,8 @@ # LICENSE file in the root directory of this source tree. from typing import Callable, Dict, List +from deprecated.sphinx import deprecated + from compiler_gym.service.connection import ServiceError from compiler_gym.service.proto import ObservationSpace from compiler_gym.util.gym_type_hints import ( @@ -93,6 +95,13 @@ def _add_space(self, space: ObservationSpaceSpec): # env.observation.FooBar(). setattr(self, space.id, lambda: self[space.id]) + @deprecated( + version="0.2.1", + reason=( + "Use the derived_observation_spaces argument to CompilerEnv constructor. " + "See ." + ), + ) def add_derived_space( self, id: str, diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 2210e1f2b..5d658701e 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -1379,12 +1379,15 @@ def test_is_buildable_observation_space_not_buildable(env: LlvmEnv): def test_add_derived_space(env: LlvmEnv): env.reset() - env.observation.add_derived_space( - id="IrLen", - base_id="Ir", - space=Box(name="IrLen", low=0, high=float("inf"), shape=(1,), dtype=int), - translate=lambda base: [15], - ) + with pytest.deprecated_call( + match="Use the derived_observation_spaces argument to CompilerEnv constructor." + ): + env.observation.add_derived_space( + id="IrLen", + base_id="Ir", + space=Box(name="IrLen", low=0, high=float("inf"), shape=(1,), dtype=int), + translate=lambda base: [15], + ) value = env.observation["IrLen"] assert isinstance(value, list) From 44d8602a753344ad1ed75a2484f1860b084d593b Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 12 Oct 2021 00:32:33 +0100 Subject: [PATCH 060/254] Make derived observation spaces useable at construction time. Fixes #461. --- compiler_gym/envs/compiler_env.py | 10 ++ compiler_gym/envs/llvm/llvm_env.py | 204 +++++++++++++------------- compiler_gym/views/observation.py | 13 ++ tests/llvm/observation_spaces_test.py | 15 ++ 4 files changed, 141 insertions(+), 101 deletions(-) diff --git a/compiler_gym/envs/compiler_env.py b/compiler_gym/envs/compiler_env.py index a6325dd32..bb4040f5c 100644 --- a/compiler_gym/envs/compiler_env.py +++ b/compiler_gym/envs/compiler_env.py @@ -159,6 +159,7 @@ def __init__( observation_space: Optional[Union[str, ObservationSpaceSpec]] = None, reward_space: Optional[Union[str, Reward]] = None, action_space: Optional[str] = None, + derived_observation_spaces: Optional[List[Dict[str, Any]]] = None, connection_settings: Optional[ConnectionOpts] = None, service_connection: Optional[CompilerGymServiceConnection] = None, logger: Optional[logging.Logger] = None, @@ -205,6 +206,10 @@ def __init__( :param action_space: The name of the action space to use. If not specified, the default action space for this compiler is used. + :param derived_observation_spaces: An optional list of arguments to be + passed to :meth:`env.observation.add_derived_space() + `. + :param connection_settings: The settings used to establish a connection with the remote service. @@ -299,6 +304,11 @@ def __init__( ) self.reward = self._reward_view_type(rewards, self.observation) + # Register any derived observation spaces now so that the observation + # space can be set below. + for derived_observation_space in derived_observation_spaces or []: + self.observation.add_derived_space_internal(**derived_observation_space) + # Lazily evaluated version strings. self._versions: Optional[GetVersionReply] = None diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index efb5f8669..2528831f2 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -68,6 +68,7 @@ def __init__( # First perform a one-time download of LLVM binaries that are needed by # the LLVM service and are not included by the pip-installed package. download_llvm_files() + self.inst2vec = _INST2VEC_ENCODER super().__init__( *args, **kwargs, @@ -150,6 +151,108 @@ def __init__( platform_dependent=True, ), ], + derived_observation_spaces=[ + { + "id": "Inst2vecPreprocessedText", + "base_id": "Ir", + "space": Sequence( + name="Inst2vecPreprocessedText", size_range=(0, None), dtype=str + ), + "translate": self.inst2vec.preprocess, + "default_value": "", + }, + { + "id": "Inst2vecEmbeddingIndices", + "base_id": "Ir", + "space": Sequence( + name="Inst2vecEmbeddingIndices", + size_range=(0, None), + dtype=np.int32, + ), + "translate": lambda base_observation: self.inst2vec.encode( + self.inst2vec.preprocess(base_observation) + ), + "default_value": np.array([self.inst2vec.vocab["!UNK"]]), + }, + { + "id": "Inst2vec", + "base_id": "Ir", + "space": Sequence( + name="Inst2vec", size_range=(0, None), dtype=np.ndarray + ), + "translate": lambda base_observation: self.inst2vec.embed( + self.inst2vec.encode(self.inst2vec.preprocess(base_observation)) + ), + "default_value": np.vstack( + [self.inst2vec.embeddings[self.inst2vec.vocab["!UNK"]]] + ), + }, + { + "id": "InstCountDict", + "base_id": "InstCount", + "space": DictSpace( + { + f"{name}Count": Scalar( + name=f"{name}Count", min=0, max=None, dtype=int + ) + for name in INST_COUNT_FEATURE_NAMES + }, + name="InstCountDict", + ), + "translate": lambda base_observation: { + f"{name}Count": val + for name, val in zip(INST_COUNT_FEATURE_NAMES, base_observation) + }, + }, + { + "id": "InstCountNorm", + "base_id": "InstCount", + "space": Box( + name="InstCountNorm", + low=0, + high=1, + shape=(len(INST_COUNT_FEATURE_NAMES) - 1,), + dtype=np.float32, + ), + "translate": lambda base_observation: ( + base_observation[1:] / max(base_observation[0], 1) + ).astype(np.float32), + }, + { + "id": "InstCountNormDict", + "base_id": "InstCountNorm", + "space": DictSpace( + { + f"{name}Density": Scalar( + name=f"{name}Density", min=0, max=None, dtype=int + ) + for name in INST_COUNT_FEATURE_NAMES[1:] + }, + name="InstCountNormDict", + ), + "translate": lambda base_observation: { + f"{name}Density": val + for name, val in zip( + INST_COUNT_FEATURE_NAMES[1:], base_observation + ) + }, + }, + { + "id": "AutophaseDict", + "base_id": "Autophase", + "space": DictSpace( + { + name: Scalar(name=name, min=0, max=None, dtype=int) + for name in AUTOPHASE_FEATURE_NAMES + }, + name="AutophaseDict", + ), + "translate": lambda base_observation: { + name: val + for name, val in zip(AUTOPHASE_FEATURE_NAMES, base_observation) + }, + }, + ], ) # Mutable runtime configuration options that must be set on every call @@ -157,8 +260,6 @@ def __init__( self._runtimes_per_observation_count: Optional[int] = None self._runtimes_warmup_per_observation_count: Optional[int] = None - self.inst2vec = _INST2VEC_ENCODER - cpu_info_spaces = [ Sequence(name="name", size_range=(0, None), dtype=str), Scalar(name="cores_count", min=None, max=None, dtype=int), @@ -178,105 +279,6 @@ def __init__( name="CpuInfo", ) - self.observation.add_derived_space( - id="Inst2vecPreprocessedText", - base_id="Ir", - space=Sequence( - name="Inst2vecPreprocessedText", size_range=(0, None), dtype=str - ), - translate=self.inst2vec.preprocess, - default_value="", - ) - self.observation.add_derived_space( - id="Inst2vecEmbeddingIndices", - base_id="Ir", - space=Sequence( - name="Inst2vecEmbeddingIndices", size_range=(0, None), dtype=np.int32 - ), - translate=lambda base_observation: self.inst2vec.encode( - self.inst2vec.preprocess(base_observation) - ), - default_value=np.array([self.inst2vec.vocab["!UNK"]]), - ) - self.observation.add_derived_space( - id="Inst2vec", - base_id="Ir", - space=Sequence(name="Inst2vec", size_range=(0, None), dtype=np.ndarray), - translate=lambda base_observation: self.inst2vec.embed( - self.inst2vec.encode(self.inst2vec.preprocess(base_observation)) - ), - default_value=np.vstack( - [self.inst2vec.embeddings[self.inst2vec.vocab["!UNK"]]] - ), - ) - - self.observation.add_derived_space( - id="InstCountDict", - base_id="InstCount", - space=DictSpace( - { - f"{name}Count": Scalar( - name=f"{name}Count", min=0, max=None, dtype=int - ) - for name in INST_COUNT_FEATURE_NAMES - }, - name="InstCountDict", - ), - translate=lambda base_observation: { - f"{name}Count": val - for name, val in zip(INST_COUNT_FEATURE_NAMES, base_observation) - }, - ) - - self.observation.add_derived_space( - id="InstCountNorm", - base_id="InstCount", - space=Box( - name="InstCountNorm", - low=0, - high=1, - shape=(len(INST_COUNT_FEATURE_NAMES) - 1,), - dtype=np.float32, - ), - translate=lambda base_observation: ( - base_observation[1:] / max(base_observation[0], 1) - ).astype(np.float32), - ) - - self.observation.add_derived_space( - id="InstCountNormDict", - base_id="InstCountNorm", - space=DictSpace( - { - f"{name}Density": Scalar( - name=f"{name}Density", min=0, max=None, dtype=int - ) - for name in INST_COUNT_FEATURE_NAMES[1:] - }, - name="InstCountNormDict", - ), - translate=lambda base_observation: { - f"{name}Density": val - for name, val in zip(INST_COUNT_FEATURE_NAMES[1:], base_observation) - }, - ) - - self.observation.add_derived_space( - id="AutophaseDict", - base_id="Autophase", - space=DictSpace( - { - name: Scalar(name=name, min=0, max=None, dtype=int) - for name in AUTOPHASE_FEATURE_NAMES - }, - name="AutophaseDict", - ), - translate=lambda base_observation: { - name: val - for name, val in zip(AUTOPHASE_FEATURE_NAMES, base_observation) - }, - ) - def reset(self, *args, **kwargs): try: observation = super().reset(*args, **kwargs) diff --git a/compiler_gym/views/observation.py b/compiler_gym/views/observation.py index 47e714ed3..e6e72b0e6 100644 --- a/compiler_gym/views/observation.py +++ b/compiler_gym/views/observation.py @@ -135,5 +135,18 @@ def add_derived_space( base_space = self.spaces[base_id] self._add_space(base_space.make_derived_space(id=id, **kwargs)) + # NOTE(github.com/facebookresearch/CompilerGym/issues/461): This method will + # be renamed to add_derived_space() once the current method with that name + # is removed. + def add_derived_space_internal( + self, + id: str, + base_id: str, + **kwargs, + ) -> None: + """Internal API for adding a new observation space.""" + base_space = self.spaces[base_id] + self._add_space(base_space.make_derived_space(id=id, **kwargs)) + def __repr__(self): return f"ObservationView[{', '.join(sorted(self.spaces.keys()))}]" diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 5d658701e..449698911 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -7,6 +7,7 @@ import sys from typing import Any, Dict, List +import gym import networkx as nx import numpy as np import pytest @@ -1399,5 +1400,19 @@ def test_add_derived_space(env: LlvmEnv): assert value == [15] +def test_derived_space_constructor(): + """Test that derived observation space can be specified at construction + time. + """ + with gym.make("llvm-v0") as env: + env.observation_space = "AutophaseDict" + a = env.reset() + + with gym.make("llvm-v0", observation_space="AutophaseDict") as env: + b = env.reset() + + assert a == b + + if __name__ == "__main__": main() From 0de2798c1d3f9577152a7c2f3822e142d03402dd Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 11 Oct 2021 23:27:19 +0100 Subject: [PATCH 061/254] [ci] Rewrite and update the fuzz tests. Issue #385. --- .github/workflows/fuzz.yaml | 33 ++++++++++++------- .../fuzzing/llvm_cbench_validate_fuzz_test.py | 1 + .../fuzzing/llvm_random_actions_fuzz_test.py | 18 +++++----- tests/fuzzing/llvm_stress_fuzz_test.py | 16 ++++----- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/.github/workflows/fuzz.yaml b/.github/workflows/fuzz.yaml index 2245cd6d5..4934fae48 100644 --- a/.github/workflows/fuzz.yaml +++ b/.github/workflows/fuzz.yaml @@ -14,33 +14,42 @@ on: jobs: fuzz: - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest] - python: [3.9] + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up Python ${{ matrix.python }} + - name: Persist the bazel cache + uses: actions/cache@v2 + with: + path: ~/.cache/bazel/_bazel_runner + key: bazel-${{ hashFiles('WORKSPACE') }}-${{ hashFiles('**/BUILD') }} + restore-keys: | + bazel-${{ hashFiles('WORKSPACE') }}- + bazel- + + - name: Set up Python uses: actions/setup-python@v2 with: - python-version: ${{ matrix.python }} + python-version: 3.9 - name: Install build dependencies uses: ./.github/actions/install-build-dependencies - - name: Install + - name: Build and install Python wheel run: make install env: CC: clang CXX: clang++ BAZEL_OPTS: --batch BAZEL_FETCH_OPTS: --config=ci - BAZEL_TEST_OPTS: --config=ci + BAZEL_BUILD_OPTS: --config=ci + + - name: Install runtime dependencies + uses: ./.github/actions/install-runtime-dependencies + + - name: Install test dependencies + run: python -m pip install -r tests/requirements.txt - - name: Test + - name: Fuzz test run: FUZZ_TIME=600 make install-fuzz diff --git a/tests/fuzzing/llvm_cbench_validate_fuzz_test.py b/tests/fuzzing/llvm_cbench_validate_fuzz_test.py index 8a5faa67e..b07d7da3d 100644 --- a/tests/fuzzing/llvm_cbench_validate_fuzz_test.py +++ b/tests/fuzzing/llvm_cbench_validate_fuzz_test.py @@ -23,6 +23,7 @@ def test_fuzz(env: LlvmEnv): """This test generates a random trajectory and validates the semantics.""" benchmark = random.choice(VALIDATABLE_CBENCH_URIS) num_actions = random.randint(*RANDOM_TRAJECTORY_LENGTH_RANGE) + print(benchmark) while True: env.reset(benchmark=benchmark) diff --git a/tests/fuzzing/llvm_random_actions_fuzz_test.py b/tests/fuzzing/llvm_random_actions_fuzz_test.py index 814527ccc..31767a858 100644 --- a/tests/fuzzing/llvm_random_actions_fuzz_test.py +++ b/tests/fuzzing/llvm_random_actions_fuzz_test.py @@ -20,15 +20,15 @@ @pytest.mark.timeout(600) -def test_fuzz(benchmark_name: str): +def test_fuzz(observation_space: str, reward_space: str): """Run randomly selected actions on a benchmark until a minimum amount of time has elapsed.""" with gym.make( - "llvm-v0", - reward_space="IrInstructionCount", - observation_space="Autophase", - benchmark=benchmark_name, + "llvm-v0", reward_space=reward_space, observation_space=observation_space ) as env: - env.reset() + benchmark = env.datasets["generator://llvm-stress-v0"].random_benchmark() + print(benchmark.uri) # For debugging in case of failure. + + env.reset(benchmark=benchmark) # Take a random step until a predetermined amount of time has elapsed. end_time = time() + FUZZ_TIME_SECONDS @@ -42,9 +42,9 @@ def test_fuzz(benchmark_name: str): assert isinstance(reward, float) env = gym.make( "llvm-v0", - reward_space="IrInstructionCount", - observation_space="Autophase", - benchmark=benchmark_name, + reward_space=reward_space, + benchmark=benchmark, + observation_space=observation_space, ) env.reset() else: diff --git a/tests/fuzzing/llvm_stress_fuzz_test.py b/tests/fuzzing/llvm_stress_fuzz_test.py index 9960d67a4..02e5461f1 100644 --- a/tests/fuzzing/llvm_stress_fuzz_test.py +++ b/tests/fuzzing/llvm_stress_fuzz_test.py @@ -29,15 +29,15 @@ def test_fuzz(env: LlvmEnv, observation_space: str, reward_space: str): try: env.reset(benchmark=benchmark) - apply_random_trajectory( - env, - random_trajectory_length_range=RANDOM_TRAJECTORY_LENGTH_RANGE, - timeout=10, - ) - print(env.state) # For debugging in case of failure. except BenchmarkInitError: - # Benchmark is invalid. - pass + return # Benchmark is invalid. + + apply_random_trajectory( + env, + random_trajectory_length_range=RANDOM_TRAJECTORY_LENGTH_RANGE, + timeout=10, + ) + print(env.state) # For debugging in case of failure. if __name__ == "__main__": From cd4728b7ddd1626e65dd25dfc001ac22092e1ef4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 12:55:43 +0100 Subject: [PATCH 062/254] [tests] Add a test for forced working directory. --- .../example_compiler_gym_service/env_tests.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index 8f471e0d5..de86ef743 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -5,10 +5,12 @@ """Tests for the example CompilerGym service.""" import subprocess from pathlib import Path +from time import sleep import gym import numpy as np import pytest +from flaky import flaky import examples.example_compiler_gym_service as example from compiler_gym.envs import CompilerEnv @@ -225,5 +227,22 @@ def test_fork(env: CompilerEnv): other_env.close() +@flaky # Timeout-based test. +def test_force_working_dir(bin: Path, tmpdir): + """Test that expected files are generated in the working directory.""" + tmpdir = Path(tmpdir) / "subdir" + service = subprocess.Popen([str(bin), "--working_dir", str(tmpdir)]) + try: + for _ in range(10): + sleep(0.5) + if (tmpdir / "pid.txt").is_file() and (tmpdir / "port.txt").is_file(): + break + else: + pytest.fail(f"PID file not found in {tmpdir}: {list(tmpdir.iterdir())}") + finally: + service.terminate() + service.communicate(timeout=60) + + if __name__ == "__main__": main() From 935aae3c95c52e54aaea88dd796c4c9e3599fa67 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 12:59:13 +0100 Subject: [PATCH 063/254] [service] Always create the required working directories. --- .../service/runtime/CreateAndRunCompilerGymServiceImpl.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/compiler_gym/service/runtime/CreateAndRunCompilerGymServiceImpl.h b/compiler_gym/service/runtime/CreateAndRunCompilerGymServiceImpl.h index b88b6a568..0370d9e71 100644 --- a/compiler_gym/service/runtime/CreateAndRunCompilerGymServiceImpl.h +++ b/compiler_gym/service/runtime/CreateAndRunCompilerGymServiceImpl.h @@ -69,21 +69,16 @@ template // Set up the working and logging directories. boost::filesystem::path workingDirectory{FLAGS_working_dir}; - bool createdWorkingDir = false; if (FLAGS_working_dir.empty()) { // If no working directory was set, create one. workingDirectory = boost::filesystem::unique_path(boost::filesystem::temp_directory_path() / "compiler_gym-service-%%%%-%%%%"); - boost::filesystem::create_directories(workingDirectory / "logs"); FLAGS_working_dir = workingDirectory.string(); - createdWorkingDir = true; } + // Create amd set the logging directory. + boost::filesystem::create_directories(workingDirectory / "logs"); FLAGS_log_dir = workingDirectory.string() + "/logs"; - if (!createdWorkingDir && !boost::filesystem::is_directory(FLAGS_log_dir)) { - std::cerr << "ERROR: logging directory '" << FLAGS_log_dir << "' not found"; - exit(1); - } google::InitGoogleLogging(argv[0]); From 793c96e089fb8391c3f6aa28afb24060f3fc92b2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 12:59:46 +0100 Subject: [PATCH 064/254] [docs] Add clang-format to macOS install instructions. --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index bf81f5f94..e05451afe 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -18,7 +18,7 @@ On macOS the required dependencies can be installed using [homebrew](https://docs.brew.sh/Installation): ```sh -brew install bazelisk buildifier hadolint prototool zlib +brew install bazelisk buildifier clang-format hadolint prototool zlib export LDFLAGS="-L/usr/local/opt/zlib/lib" export CPPFLAGS="-I/usr/local/opt/zlib/include" export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig" From 298635831e7f5fc3b9ca77f6429423f54a2b223e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 13:03:42 +0100 Subject: [PATCH 065/254] [service] Fix --port flag usage in Python services. --- .../service/runtime/create_and_run_compiler_gym_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler_gym/service/runtime/create_and_run_compiler_gym_service.py b/compiler_gym/service/runtime/create_and_run_compiler_gym_service.py index f02f35a03..df9d43039 100644 --- a/compiler_gym/service/runtime/create_and_run_compiler_gym_service.py +++ b/compiler_gym/service/runtime/create_and_run_compiler_gym_service.py @@ -106,7 +106,9 @@ def main(argv): compiler_gym_service_pb2_grpc.add_CompilerGymServiceServicer_to_server( service, server ) - port = server.add_insecure_port("0.0.0.0:0") + + address = f"0.0.0.0:{FLAGS.port}" if FLAGS.port else "0.0.0.0:0" + port = server.add_insecure_port(address) with atomic_file_write(working_dir / "port.txt", fileobj=True, mode="w") as f: f.write(str(port)) From 15325769821ebdbe230d0534b53326e969e6b3ad Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 13:04:55 +0100 Subject: [PATCH 066/254] [tests] Add a test for forcing the --port of a service. --- .../example_compiler_gym_service/env_tests.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index de86ef743..9f5dee8c1 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Tests for the example CompilerGym service.""" +import socket import subprocess from pathlib import Path from time import sleep @@ -244,5 +245,57 @@ def test_force_working_dir(bin: Path, tmpdir): service.communicate(timeout=60) +def unsafe_select_unused_port() -> int: + """Try and select an unused port that on the local system. + + There is nothing to prevent the port number returned by this function from + being claimed by another process or thread, so it is liable to race conditions + """ + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(("", 0)) + s.listen(1) + port = s.getsockname()[1] + s.close() + return port + + +def port_is_free(port: int) -> bool: + """Determine if a port is in use""" + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind(("", port)) + return True + except OSError: + return False + finally: + s.close() + + +@flaky # Unsafe free port allocation +def test_force_port(bin: Path, tmpdir): + """Test that a forced --port value is respected.""" + port = unsafe_select_unused_port() + assert port_is_free(port) # Sanity check + + tmpdir = Path(tmpdir) + p = subprocess.Popen([str(bin), "--port", str(port), "--working_dir", str(tmpdir)]) + try: + for _ in range(10): + sleep(0.5) + if (tmpdir / "pid.txt").is_file() and (tmpdir / "port.txt").is_file(): + break + else: + pytest.fail(f"PID file not found in {tmpdir}: {list(tmpdir.iterdir())}") + + with open(tmpdir / "port.txt") as f: + actual_port = int(f.read()) + + assert actual_port == port + assert not port_is_free(actual_port) + finally: + p.terminate() + p.communicate(timeout=60) + + if __name__ == "__main__": main() From e77d07f70fa55998f15d13596755b2b81133697a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 13:20:08 +0100 Subject: [PATCH 067/254] [examples] Add a demo py_binary for the example services. --- examples/example_compiler_gym_service/BUILD | 20 ++++++++++- examples/example_compiler_gym_service/demo.py | 35 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 examples/example_compiler_gym_service/demo.py diff --git a/examples/example_compiler_gym_service/BUILD b/examples/example_compiler_gym_service/BUILD index f6cc2e193..68e2afe2b 100644 --- a/examples/example_compiler_gym_service/BUILD +++ b/examples/example_compiler_gym_service/BUILD @@ -2,8 +2,11 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -load("@rules_python//python:defs.bzl", "py_library", "py_test") +load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") +# Here we bundle up the new compiler service and data dependencies as a python +# library. To use these example services you can depend on this target. See +# below for examples. py_library( name = "example_compiler_gym_service", srcs = ["__init__.py"], @@ -13,10 +16,25 @@ py_library( ], visibility = ["//visibility:public"], deps = [ + "//compiler_gym/datasets", + "//compiler_gym/spaces", "//compiler_gym/util", ], ) +# This is a scrip that demonstrates how to use the example services. To run it, +# use: $ bazel run -c opt //examples/example_compiler_gym_service:demo +py_binary( + name = "demo", + srcs = ["demo.py"], + deps = [ + ":example_compiler_gym_service", + "//compiler_gym", + ], +) + +# This is a set of unit tests for the example services. To run the tests, use: +# $ bazel test //examples/example_compiler_gym_service:env_tests py_test( name = "env_tests", srcs = ["env_tests.py"], diff --git a/examples/example_compiler_gym_service/demo.py b/examples/example_compiler_gym_service/demo.py new file mode 100644 index 000000000..16244191d --- /dev/null +++ b/examples/example_compiler_gym_service/demo.py @@ -0,0 +1,35 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""This script demonstrates how the example services defined in this directory +can be used as gym environments. Usage: + + $ bazel run -c opt //examples/example_compiler_gym_service:demo +""" +import logging + +import gym + +# To use the example services we simply need to import the module which +# registers the environments. +import examples.example_compiler_gym_service # noqa Register environments + + +def main(): + # Use debug verbosity to print out extra logging information. + logging.basicConfig(level=logging.DEBUG) + + # Create the environment using the regular gym.make(...) interface. We could + # use either the C++ service "example-cc-v0" or the Python service + # "example-py-v0". + with gym.make("example-cc-v0") as env: + env.reset() + for _ in range(20): + observation, reward, done, info = env.step(env.action_space.sample()) + if done: + env.reset() + + +if __name__ == "__main__": + main() From 83ddedc8ddeb4bebaab5b381d77fcca586525c1a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 14:07:20 +0100 Subject: [PATCH 068/254] [examples] Fix docstring header. --- examples/example_compiler_gym_service/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/example_compiler_gym_service/__init__.py b/examples/example_compiler_gym_service/__init__.py index c20b43a16..7e4a7b62e 100644 --- a/examples/example_compiler_gym_service/__init__.py +++ b/examples/example_compiler_gym_service/__init__.py @@ -2,7 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""This module demonstrates how to """ +"""This module defines and registers the example gym environments.""" from pathlib import Path from typing import Iterable From 2412790e4d81729b1c77e4c0be3f2b2249b7969e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 14:07:43 +0100 Subject: [PATCH 069/254] [examples] Add a demo using example services without bazel. --- .../demo_without_bazel.py | 114 ++++++++++++++++++ .../demo_without_bazel_test.py | 10 ++ 2 files changed, 124 insertions(+) create mode 100644 examples/example_compiler_gym_service/demo_without_bazel.py create mode 100644 examples/example_compiler_gym_service/demo_without_bazel_test.py diff --git a/examples/example_compiler_gym_service/demo_without_bazel.py b/examples/example_compiler_gym_service/demo_without_bazel.py new file mode 100644 index 000000000..191c26706 --- /dev/null +++ b/examples/example_compiler_gym_service/demo_without_bazel.py @@ -0,0 +1,114 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""This script demonstrates how the Python example service without needing +to use the bazel build system. Usage: + + $ python example_compiler_gym_service/demo_without_bazel.py + +It is equivalent in behavior to the demo.py script in this directory. +""" +import logging +from pathlib import Path +from typing import Iterable + +import gym + +from compiler_gym.datasets import Benchmark, Dataset +from compiler_gym.spaces import Reward +from compiler_gym.util.registration import register +from compiler_gym.util.runfiles_path import site_data_path + +EXAMPLE_PY_SERVICE_BINARY: Path = Path( + "example_compiler_gym_service/service_py/example_service.py" +) +assert EXAMPLE_PY_SERVICE_BINARY.is_file(), "Service script not found" + + +class RuntimeReward(Reward): + """An example reward that uses changes in the "runtime" observation value + to compute incremental reward. + """ + + def __init__(self): + super().__init__( + id="runtime", + observation_spaces=["runtime"], + default_value=0, + default_negates_returns=True, + deterministic=False, + platform_dependent=True, + ) + self.previous_runtime = None + + def reset(self, benchmark: str, observation_view): + del benchmark # unused + self.previous_runtime = None + + def update(self, action, observations, observation_view): + del action + del observation_view + + if self.previous_runtime is None: + self.previous_runtime = observations[0] + + reward = float(self.previous_runtime - observations[0]) + self.previous_runtime = observations[0] + return reward + + +class ExampleDataset(Dataset): + def __init__(self, *args, **kwargs): + super().__init__( + name="benchmark://example-v0", + license="MIT", + description="An example dataset", + site_data_base=site_data_path("example_dataset"), + ) + self._benchmarks = { + "benchmark://example-v0/foo": Benchmark.from_file_contents( + "benchmark://example-v0/foo", "Ir data".encode("utf-8") + ), + "benchmark://example-v0/bar": Benchmark.from_file_contents( + "benchmark://example-v0/bar", "Ir data".encode("utf-8") + ), + } + + def benchmark_uris(self) -> Iterable[str]: + yield from self._benchmarks.keys() + + def benchmark(self, uri: str) -> Benchmark: + if uri in self._benchmarks: + return self._benchmarks[uri] + else: + raise LookupError("Unknown program name") + + +# Register the environment for use with gym.make(...). +register( + id="example-v0", + entry_point="compiler_gym.envs:CompilerEnv", + kwargs={ + "service": EXAMPLE_PY_SERVICE_BINARY, + "rewards": [RuntimeReward()], + "datasets": [ExampleDataset()], + }, +) + + +def main(): + # Use debug verbosity to print out extra logging information. + logging.basicConfig(level=logging.DEBUG) + + # Create the environment using the regular gym.make(...) interface. + with gym.make("example-v0") as env: + env.reset() + for _ in range(20): + observation, reward, done, info = env.step(env.action_space.sample()) + if done: + env.reset() + + +if __name__ == "__main__": + main() diff --git a/examples/example_compiler_gym_service/demo_without_bazel_test.py b/examples/example_compiler_gym_service/demo_without_bazel_test.py new file mode 100644 index 000000000..aa9ef51cf --- /dev/null +++ b/examples/example_compiler_gym_service/demo_without_bazel_test.py @@ -0,0 +1,10 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Smoke test for examples/example_compiler_gym_service/demo_without_bazel.py""" +from example_compiler_gym_service.demo_without_bazel import main + + +def test_demo_without_bazel(): + main() From ee4e19d2b8e813964863017af03c70d7d52f4a20 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 14:12:03 +0100 Subject: [PATCH 070/254] [examples] Overhaul the example service README. The documentation for the example services has fallen out of date, as reported in #466. This patch updates the README to include the latest usage instructions. --- .../example_compiler_gym_service/README.md | 66 +++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/examples/example_compiler_gym_service/README.md b/examples/example_compiler_gym_service/README.md index cade0209e..8d6155dac 100644 --- a/examples/example_compiler_gym_service/README.md +++ b/examples/example_compiler_gym_service/README.md @@ -9,46 +9,60 @@ RPC interface that the frontend interacts with. This directory contains an example backend service implemented in C++ and Python. Both implementations have the same features. They don't do any actual -compilation, but can be used as a starting point for writing new services, or -for debugging and testing frontend code. +compilation, but can be used as a starting point for adding support for new +compilers, or for debugging and testing frontend code. -Features: +If you have any questions please [file an +issue](https://github.com/facebookresearch/CompilerGym/issues/new/choose). -* Enforces the service contract, e.g. `StartSession()` must be called before - `EndSession()`, list indices must be in-bounds, etc. -* Implements all of the RPC endpoints. + +## Features + +* A static action space with three items: `["a", "b", "c"]`. The action space + never changes. Actions never end the episode. +* There are two observation spaces: + * `ir` which returns the string "Hello, world!". + * `features` which returns an `int64_list` of `[0, 0, 0]`. +* A single reward space `runtime` which returns 0. * It has a single dataset "benchmark://example-v0" with two programs "foo" and "bar". -* It has a static action space with three items: `["a", "b", "c"]`. The action - space never changes. Actions never end the episode. -* There are two observation spaces: - * `ir` which returns the string "Hello, world!". - * `features` which returns an `int64_list` of `[0, 0, 0]`. -* There is a single reward space `runtime` which returns 0. -* Supports default observation and reward spaces. -See [service_cc/ExampleService.h](service_cc/ExampleService.h) for the C++ -service implementation, -[service_py/example_service.py](service_py/example_service.py) for the Python -version, [__init__.py](__init__.py) for a python module that registers this -service with the gym on import, and [env_tests.py](env_tests.py) for tests. +## Implementation + +There are two identical service implementations, one in Python, one in C++. See +[service_cc/ExampleService.h](service_cc/ExampleService.h) for the C++ service, +and [service_py/example_service.py](service_py/example_service.py) for the +Python service. The module [__init__.py](__init__.py) defines the reward space, +dataset, and registers two new environments using these services. + +The file [demo.py](demo.py) demonstrates how to use these example environments +using CompilerGym's bazel build system. The file [env_tests.py](env_tests.py) +contains unit tests for the example services. Because the Python and C++ +services implement the same interface, the same tests are run against both +environments. ## Usage -Start an example service using: +Run the demo script using: ```sh -$ bazel run -c opt //examples/example_compiler_gym_service/service -- \ - --port=8080 --working_dir=/tmp +$ bazel run -c opt //examples/example_compiler_gym_service:demo ``` -The service never terminates and does not print logging messages. Interact with -the RPC endpoints using your frontend of choice, for example, the manual -environment: +Run the unit tests using: ```sh -$ bazel run -c opt //compiler_gym/bin:manual_env -- --service=localhost:8080 +$ bazel test //examples/example_compiler_gym_service/... ``` -Kill the service using C-c when you are done. +### Using the python service without bazel + +Because the python service contains no compiled code, it can be run directly as +a standalone script without using the bazel build system. From the root of the +CompilerGym repository, run: + +```sh +$ cd examples +$ python3 example_compiler_gym_service/demo_without_bazel.py +``` From 555b7e5c4030b11cc351e3f759ba904e7e941fdf Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 21 Sep 2021 11:21:59 -0400 Subject: [PATCH 071/254] start with a working example by copying example_compiler_gym_service --- examples/example_unrolling_service/BUILD | 28 +++ examples/example_unrolling_service/README.md | 16 ++ .../example_unrolling_service/__init__.py | 89 +++++++ .../example_unrolling_service/env_tests.py | 232 ++++++++++++++++++ .../service_py/BUILD | 17 ++ .../service_py/example_service.py | 109 ++++++++ 6 files changed, 491 insertions(+) create mode 100644 examples/example_unrolling_service/BUILD create mode 100644 examples/example_unrolling_service/README.md create mode 100644 examples/example_unrolling_service/__init__.py create mode 100644 examples/example_unrolling_service/env_tests.py create mode 100644 examples/example_unrolling_service/service_py/BUILD create mode 100755 examples/example_unrolling_service/service_py/example_service.py diff --git a/examples/example_unrolling_service/BUILD b/examples/example_unrolling_service/BUILD new file mode 100644 index 000000000..f6cc2e193 --- /dev/null +++ b/examples/example_unrolling_service/BUILD @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +py_library( + name = "example_compiler_gym_service", + srcs = ["__init__.py"], + data = [ + "//examples/example_compiler_gym_service/service_cc:compiler_gym-example-service-cc", + "//examples/example_compiler_gym_service/service_py:compiler_gym-example-service-py", + ], + visibility = ["//visibility:public"], + deps = [ + "//compiler_gym/util", + ], +) + +py_test( + name = "env_tests", + srcs = ["env_tests.py"], + deps = [ + ":example_compiler_gym_service", + "//compiler_gym", + "//tests:test_main", + ], +) diff --git a/examples/example_unrolling_service/README.md b/examples/example_unrolling_service/README.md new file mode 100644 index 000000000..b887cb829 --- /dev/null +++ b/examples/example_unrolling_service/README.md @@ -0,0 +1,16 @@ +# Unrolling CompilerGym Service Example + +TBD + +# Features: + +TBD + + +## Usage + +Rub: + +```sh +$ bazel test //examples/example_unrolling_service:env_tests +``` diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py new file mode 100644 index 000000000..4549aa3c2 --- /dev/null +++ b/examples/example_unrolling_service/__init__.py @@ -0,0 +1,89 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""This module demonstrates how to """ +from pathlib import Path +from typing import Iterable + +from compiler_gym.datasets import Benchmark, Dataset +from compiler_gym.spaces import Reward +from compiler_gym.util.registration import register +from compiler_gym.util.runfiles_path import runfiles_path, site_data_path + +EXAMPLE_PY_SERVICE_BINARY: Path = runfiles_path( + "examples/example_compiler_gym_service/service_py/compiler_gym-example-service-py" +) + + +class RuntimeReward(Reward): + """An example reward that uses changes in the "runtime" observation value + to compute incremental reward. + """ + + def __init__(self): + super().__init__( + id="runtime", + observation_spaces=["runtime"], + default_value=0, + default_negates_returns=True, + deterministic=False, + platform_dependent=True, + ) + self.previous_runtime = None + + def reset(self, benchmark: str, observation_view): + del benchmark # unused + self.previous_runtime = None + + def update(self, action, observations, observation_view): + del action + del observation_view + + if self.previous_runtime is None: + self.previous_runtime = observations[0] + + reward = float(self.previous_runtime - observations[0]) + self.previous_runtime = observations[0] + return reward + + +class ExampleDataset(Dataset): + def __init__(self, *args, **kwargs): + super().__init__( + name="benchmark://example-v0", + license="MIT", + description="An example dataset", + site_data_base=site_data_path("example_dataset"), + ) + self._benchmarks = { + "benchmark://example-v0/foo": Benchmark.from_file_contents( + "benchmark://example-v0/foo", "Ir data".encode("utf-8") + ), + "benchmark://example-v0/bar": Benchmark.from_file_contents( + "benchmark://example-v0/bar", "Ir data".encode("utf-8") + ), + } + + def benchmark_uris(self) -> Iterable[str]: + yield from self._benchmarks.keys() + + def benchmark(self, uri: str) -> Benchmark: + if uri in self._benchmarks: + return self._benchmarks[uri] + else: + raise LookupError("Unknown program name") + + +# Register the example service on module import. After importing this module, +# the example-v0 environment will be available to gym.make(...). + +register( + id="example-py-v0", + entry_point="compiler_gym.envs:CompilerEnv", + kwargs={ + "service": EXAMPLE_PY_SERVICE_BINARY, + "rewards": [RuntimeReward()], + "datasets": [ExampleDataset()], + }, +) diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py new file mode 100644 index 000000000..988bfab59 --- /dev/null +++ b/examples/example_unrolling_service/env_tests.py @@ -0,0 +1,232 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Tests for the example CompilerGym service.""" +import logging +import subprocess +from pathlib import Path + +import gym +import numpy as np +import pytest +from gym.spaces import Box + +import compiler_gym +import examples.example_unrolling_service as example +from compiler_gym.envs import CompilerEnv +from compiler_gym.service import SessionNotFound +from compiler_gym.spaces import NamedDiscrete, Scalar, Sequence +from compiler_gym.util.debug_util import set_debug_level +from tests.test_main import main + +# Given that the C++ and Python service implementations have identical +# featuresets, we can parameterize the tests and run them against both backends. +EXAMPLE_ENVIRONMENTS = ["example-py-v0"] + + +@pytest.fixture(scope="function", params=EXAMPLE_ENVIRONMENTS) +def env(request) -> CompilerEnv: + """Text fixture that yields an environment.""" + with gym.make(request.param) as env: + yield env + + +@pytest.fixture( + scope="module", + params=[example.EXAMPLE_PY_SERVICE_BINARY], + ids=["example-py-v0"], +) +def bin(request) -> Path: + yield request.param + + +@pytest.mark.parametrize("env_id", EXAMPLE_ENVIRONMENTS) +def test_debug_level(env_id: str): + """Test that debug level is set.""" + set_debug_level(3) + with gym.make(env_id) as env: + assert env.logger.level == logging.DEBUG + + +def test_invalid_arguments(bin: Path): + """Test that running the binary with unrecognized arguments is an error.""" + + def run(cmd): + p = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True + ) + stdout, stderr = p.communicate(timeout=10) + return p.returncode, stdout, stderr + + returncode, _, stderr = run([str(bin), "foobar"]) + assert "ERROR:" in stderr + assert "'foobar'" in stderr + assert returncode == 1 + + returncode, _, stderr = run([str(bin), "--foobar"]) + # C++ and python flag parsing library emit slightly different error + # messages. + assert "ERROR:" in stderr or "FATAL" in stderr + assert "'foobar'" in stderr + assert returncode == 1 + + +def test_versions(env: CompilerEnv): + """Tests the GetVersion() RPC endpoint.""" + assert env.version == compiler_gym.__version__ + assert env.compiler_version == "1.0.0" + + +def test_action_space(env: CompilerEnv): + """Test that the environment reports the service's action spaces.""" + assert env.action_spaces == [ + NamedDiscrete( + name="default", + items=["a", "b", "c"], + ) + ] + + +def test_observation_spaces(env: CompilerEnv): + """Test that the environment reports the service's observation spaces.""" + env.reset() + assert env.observation.spaces.keys() == {"ir", "features", "runtime"} + assert env.observation.spaces["ir"].space == Sequence( + size_range=(0, None), dtype=str, opaque_data_format="" + ) + assert env.observation.spaces["features"].space == Box( + shape=(3,), low=-100, high=100, dtype=int + ) + assert env.observation.spaces["runtime"].space == Scalar( + min=0, max=np.inf, dtype=float + ) + + +def test_reward_spaces(env: CompilerEnv): + """Test that the environment reports the service's reward spaces.""" + env.reset() + assert env.reward.spaces.keys() == {"runtime"} + + +def test_step_before_reset(env: CompilerEnv): + """Taking a step() before reset() is illegal.""" + with pytest.raises(SessionNotFound, match=r"Must call reset\(\) before step\(\)"): + env.step(0) + + +def test_observation_before_reset(env: CompilerEnv): + """Taking an observation before reset() is illegal.""" + with pytest.raises(SessionNotFound, match=r"Must call reset\(\) before step\(\)"): + _ = env.observation["ir"] + + +def test_reward_before_reset(env: CompilerEnv): + """Taking a reward before reset() is illegal.""" + with pytest.raises(SessionNotFound, match=r"Must call reset\(\) before step\(\)"): + _ = env.reward["runtime"] + + +def test_reset_invalid_benchmark(env: CompilerEnv): + """Test requesting a specific benchmark.""" + with pytest.raises(LookupError) as ctx: + env.reset(benchmark="example-v0/foobar") + assert str(ctx.value) == "Unknown program name" + + +def test_invalid_observation_space(env: CompilerEnv): + """Test error handling with invalid observation space.""" + with pytest.raises(LookupError): + env.observation_space = 100 + + +def test_invalid_reward_space(env: CompilerEnv): + """Test error handling with invalid reward space.""" + with pytest.raises(LookupError): + env.reward_space = 100 + + +def test_double_reset(env: CompilerEnv): + """Test that reset() can be called twice.""" + env.reset() + assert env.in_episode + env.step(env.action_space.sample()) + env.reset() + env.step(env.action_space.sample()) + assert env.in_episode + + +def test_Step_out_of_range(env: CompilerEnv): + """Test error handling with an invalid action.""" + env.reset() + with pytest.raises(ValueError) as ctx: + env.step(100) + assert str(ctx.value) == "Out-of-range" + + +def test_default_ir_observation(env: CompilerEnv): + """Test default observation space.""" + env.observation_space = "ir" + observation = env.reset() + assert observation == "Hello, world!" + + observation, reward, done, info = env.step(0) + assert observation == "Hello, world!" + assert reward is None + assert not done + + +def test_default_features_observation(env: CompilerEnv): + """Test default observation space.""" + env.observation_space = "features" + observation = env.reset() + assert isinstance(observation, np.ndarray) + assert observation.shape == (3,) + assert observation.dtype == np.int64 + assert observation.tolist() == [0, 0, 0] + + +def test_default_reward(env: CompilerEnv): + """Test default reward space.""" + env.reward_space = "runtime" + env.reset() + observation, reward, done, info = env.step(0) + assert observation is None + assert reward == 0 + assert not done + + +def test_observations(env: CompilerEnv): + """Test observation spaces.""" + env.reset() + assert env.observation["ir"] == "Hello, world!" + np.testing.assert_array_equal(env.observation["features"], [0, 0, 0]) + + +def test_rewards(env: CompilerEnv): + """Test reward spaces.""" + env.reset() + assert env.reward["runtime"] == 0 + + +def test_benchmarks(env: CompilerEnv): + assert list(env.datasets.benchmark_uris()) == [ + "benchmark://example-v0/foo", + "benchmark://example-v0/bar", + ] + + +def test_fork(env: CompilerEnv): + env.reset() + env.step(0) + env.step(1) + other_env = env.fork() + try: + assert env.benchmark == other_env.benchmark + assert other_env.actions == [0, 1] + finally: + other_env.close() + + +if __name__ == "__main__": + main() diff --git a/examples/example_unrolling_service/service_py/BUILD b/examples/example_unrolling_service/service_py/BUILD new file mode 100644 index 000000000..5703fed5b --- /dev/null +++ b/examples/example_unrolling_service/service_py/BUILD @@ -0,0 +1,17 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") + +py_binary( + name = "compiler_gym-example-service-py", + srcs = ["example_service.py"], + main = "example_service.py", + visibility = ["//visibility:public"], + deps = [ + "//compiler_gym/service", + "//compiler_gym/service/proto", + "//compiler_gym/service/runtime", + ], +) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py new file mode 100755 index 000000000..7482247bb --- /dev/null +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -0,0 +1,109 @@ +#! /usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""An example CompilerGym service in python.""" +import logging +from pathlib import Path +from typing import Optional, Tuple + +from compiler_gym.service import CompilationSession +from compiler_gym.service.proto import ( + Action, + ActionSpace, + Benchmark, + Observation, + ObservationSpace, + ScalarLimit, + ScalarRange, + ScalarRangeList, +) +from compiler_gym.service.runtime import create_and_run_compiler_gym_service + + +class ExampleCompilationSession(CompilationSession): + """Represents an instance of an interactive compilation session.""" + + compiler_version: str = "1.0.0" + + # The list of actions that are supported by this service. This example uses + # a static (unchanging) action space, but this could be extended to support + # a dynamic action space. + action_spaces = [ + ActionSpace( + name="default", + action=[ + "a", + "b", + "c", + ], + ) + ] + + # A list of observation spaces supported by this service. Each of these + # ObservationSpace protos describes an observation space. + observation_spaces = [ + ObservationSpace( + name="ir", + string_size_range=ScalarRange(min=ScalarLimit(value=0)), + deterministic=True, + platform_dependent=False, + default_value=Observation(string_value=""), + ), + ObservationSpace( + name="features", + int64_range_list=ScalarRangeList( + range=[ + ScalarRange( + min=ScalarLimit(value=-100), max=ScalarLimit(value=100) + ), + ScalarRange( + min=ScalarLimit(value=-100), max=ScalarLimit(value=100) + ), + ScalarRange( + min=ScalarLimit(value=-100), max=ScalarLimit(value=100) + ), + ] + ), + ), + ObservationSpace( + name="runtime", + scalar_double_range=ScalarRange(min=ScalarLimit(value=0)), + deterministic=False, + platform_dependent=True, + default_value=Observation( + scalar_double=0, + ), + ), + ] + + def __init__( + self, working_directory: Path, action_space: ActionSpace, benchmark: Benchmark + ): + super().__init__(working_directory, action_space, benchmark) + logging.info("Started a compilation session for %s", benchmark.uri) + + def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: + logging.info("Applied action %d", action.action) + if action.action < 0 or action.action > len(self.action_spaces[0].action): + raise ValueError("Out-of-range") + return False, None, False + + def get_observation(self, observation_space: ObservationSpace) -> Observation: + logging.info("Computing observation from space %s", observation_space) + if observation_space.name == "ir": + return Observation(string_value="Hello, world!") + elif observation_space.name == "features": + observation = Observation() + observation.int64_list.value[:] = [0, 0, 0] + return observation + elif observation_space.name == "runtime": + return Observation(scalar_double=0) + else: + raise KeyError(observation_space.name) + + +if __name__ == "__main__": + create_and_run_compiler_gym_service(ExampleCompilationSession) From caa1171129fc0ccb2c476fe4eba72bd62bcec940 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 21 Sep 2021 11:49:44 -0400 Subject: [PATCH 072/254] rename from example to unrolling --- examples/example_unrolling_service/BUILD | 7 +++---- examples/example_unrolling_service/__init__.py | 14 +++++++------- examples/example_unrolling_service/env_tests.py | 12 ++++++------ .../example_unrolling_service/service_py/BUILD | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/examples/example_unrolling_service/BUILD b/examples/example_unrolling_service/BUILD index f6cc2e193..c0cf4b838 100644 --- a/examples/example_unrolling_service/BUILD +++ b/examples/example_unrolling_service/BUILD @@ -5,11 +5,10 @@ load("@rules_python//python:defs.bzl", "py_library", "py_test") py_library( - name = "example_compiler_gym_service", + name = "example_unrolling_service", srcs = ["__init__.py"], data = [ - "//examples/example_compiler_gym_service/service_cc:compiler_gym-example-service-cc", - "//examples/example_compiler_gym_service/service_py:compiler_gym-example-service-py", + "//examples/example_unrolling_service/service_py:example-unrolling-service-py", ], visibility = ["//visibility:public"], deps = [ @@ -21,7 +20,7 @@ py_test( name = "env_tests", srcs = ["env_tests.py"], deps = [ - ":example_compiler_gym_service", + ":example_unrolling_service", "//compiler_gym", "//tests:test_main", ], diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index 4549aa3c2..93da58850 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -12,7 +12,7 @@ from compiler_gym.util.runfiles_path import runfiles_path, site_data_path EXAMPLE_PY_SERVICE_BINARY: Path = runfiles_path( - "examples/example_compiler_gym_service/service_py/compiler_gym-example-service-py" + "examples/example_unrolling_service/service_py/example-unrolling-service-py" ) @@ -51,17 +51,17 @@ def update(self, action, observations, observation_view): class ExampleDataset(Dataset): def __init__(self, *args, **kwargs): super().__init__( - name="benchmark://example-v0", + name="benchmark://unrolling-v0", license="MIT", description="An example dataset", site_data_base=site_data_path("example_dataset"), ) self._benchmarks = { - "benchmark://example-v0/foo": Benchmark.from_file_contents( - "benchmark://example-v0/foo", "Ir data".encode("utf-8") + "benchmark://unrolling-v0/foo": Benchmark.from_file_contents( + "benchmark://unrolling-v0/foo", "Ir data".encode("utf-8") ), - "benchmark://example-v0/bar": Benchmark.from_file_contents( - "benchmark://example-v0/bar", "Ir data".encode("utf-8") + "benchmark://unrolling-v0/bar": Benchmark.from_file_contents( + "benchmark://unrolling-v0/bar", "Ir data".encode("utf-8") ), } @@ -79,7 +79,7 @@ def benchmark(self, uri: str) -> Benchmark: # the example-v0 environment will be available to gym.make(...). register( - id="example-py-v0", + id="unrolling-py-v0", entry_point="compiler_gym.envs:CompilerEnv", kwargs={ "service": EXAMPLE_PY_SERVICE_BINARY, diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index 988bfab59..ac13baecb 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -2,7 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Tests for the example CompilerGym service.""" +"""Tests for the unrolling CompilerGym service example.""" import logging import subprocess from pathlib import Path @@ -22,7 +22,7 @@ # Given that the C++ and Python service implementations have identical # featuresets, we can parameterize the tests and run them against both backends. -EXAMPLE_ENVIRONMENTS = ["example-py-v0"] +EXAMPLE_ENVIRONMENTS = ["unrolling-py-v0"] @pytest.fixture(scope="function", params=EXAMPLE_ENVIRONMENTS) @@ -35,7 +35,7 @@ def env(request) -> CompilerEnv: @pytest.fixture( scope="module", params=[example.EXAMPLE_PY_SERVICE_BINARY], - ids=["example-py-v0"], + ids=["unrolling-py-v0"], ) def bin(request) -> Path: yield request.param @@ -130,7 +130,7 @@ def test_reward_before_reset(env: CompilerEnv): def test_reset_invalid_benchmark(env: CompilerEnv): """Test requesting a specific benchmark.""" with pytest.raises(LookupError) as ctx: - env.reset(benchmark="example-v0/foobar") + env.reset(benchmark="unrolling-v0/foobar") assert str(ctx.value) == "Unknown program name" @@ -211,8 +211,8 @@ def test_rewards(env: CompilerEnv): def test_benchmarks(env: CompilerEnv): assert list(env.datasets.benchmark_uris()) == [ - "benchmark://example-v0/foo", - "benchmark://example-v0/bar", + "benchmark://unrolling-v0/foo", + "benchmark://unrolling-v0/bar", ] diff --git a/examples/example_unrolling_service/service_py/BUILD b/examples/example_unrolling_service/service_py/BUILD index 5703fed5b..f2d4c3e25 100644 --- a/examples/example_unrolling_service/service_py/BUILD +++ b/examples/example_unrolling_service/service_py/BUILD @@ -5,7 +5,7 @@ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") py_binary( - name = "compiler_gym-example-service-py", + name = "example-unrolling-service-py", srcs = ["example_service.py"], main = "example_service.py", visibility = ["//visibility:public"], From 60dda7f949a5438a325c97d65007fcaf47327672 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 22 Sep 2021 21:59:04 -0400 Subject: [PATCH 073/254] change name of binary --- examples/example_unrolling_service/__init__.py | 10 +++++----- examples/example_unrolling_service/env_tests.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index 93da58850..f584e636c 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -11,7 +11,7 @@ from compiler_gym.util.registration import register from compiler_gym.util.runfiles_path import runfiles_path, site_data_path -EXAMPLE_PY_SERVICE_BINARY: Path = runfiles_path( +UNROLLING_PY_SERVICE_BINARY: Path = runfiles_path( "examples/example_unrolling_service/service_py/example-unrolling-service-py" ) @@ -53,7 +53,7 @@ def __init__(self, *args, **kwargs): super().__init__( name="benchmark://unrolling-v0", license="MIT", - description="An example dataset", + description="Unrolling example dataset", site_data_base=site_data_path("example_dataset"), ) self._benchmarks = { @@ -75,14 +75,14 @@ def benchmark(self, uri: str) -> Benchmark: raise LookupError("Unknown program name") -# Register the example service on module import. After importing this module, -# the example-v0 environment will be available to gym.make(...). +# Register the unrolling example service on module import. After importing this module, +# the unrolling-py-v0 environment will be available to gym.make(...). register( id="unrolling-py-v0", entry_point="compiler_gym.envs:CompilerEnv", kwargs={ - "service": EXAMPLE_PY_SERVICE_BINARY, + "service": UNROLLING_PY_SERVICE_BINARY, "rewards": [RuntimeReward()], "datasets": [ExampleDataset()], }, diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index ac13baecb..9c4566e62 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -34,7 +34,7 @@ def env(request) -> CompilerEnv: @pytest.fixture( scope="module", - params=[example.EXAMPLE_PY_SERVICE_BINARY], + params=[example.UNROLLING_PY_SERVICE_BINARY], ids=["unrolling-py-v0"], ) def bin(request) -> Path: From 80f1ec59aa511a90ec7a71849e28bdcefea31237 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 22 Sep 2021 22:02:42 -0400 Subject: [PATCH 074/254] change PARAMS name --- examples/example_unrolling_service/env_tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index 9c4566e62..e01568103 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -22,10 +22,10 @@ # Given that the C++ and Python service implementations have identical # featuresets, we can parameterize the tests and run them against both backends. -EXAMPLE_ENVIRONMENTS = ["unrolling-py-v0"] +UNROLLING_ENVIRONMENTS = ["unrolling-py-v0"] -@pytest.fixture(scope="function", params=EXAMPLE_ENVIRONMENTS) +@pytest.fixture(scope="function", params=UNROLLING_ENVIRONMENTS) def env(request) -> CompilerEnv: """Text fixture that yields an environment.""" with gym.make(request.param) as env: @@ -41,7 +41,7 @@ def bin(request) -> Path: yield request.param -@pytest.mark.parametrize("env_id", EXAMPLE_ENVIRONMENTS) +@pytest.mark.parametrize("env_id", UNROLLING_ENVIRONMENTS) def test_debug_level(env_id: str): """Test that debug level is set.""" set_debug_level(3) From 8f6996a74a5eb32922372ad47170eaf02d7ba86e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 22 Sep 2021 22:31:30 -0400 Subject: [PATCH 075/254] change name of CompilationSession --- .../example_unrolling_service/service_py/example_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 7482247bb..ccaaa961d 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -23,7 +23,7 @@ from compiler_gym.service.runtime import create_and_run_compiler_gym_service -class ExampleCompilationSession(CompilationSession): +class UnrollingCompilationSession(CompilationSession): """Represents an instance of an interactive compilation session.""" compiler_version: str = "1.0.0" @@ -106,4 +106,4 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: if __name__ == "__main__": - create_and_run_compiler_gym_service(ExampleCompilationSession) + create_and_run_compiler_gym_service(UnrollingCompilationSession) From c9e2a728ac13ceb50acfd38c8933aeb5f1501607 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 22 Sep 2021 23:10:08 -0400 Subject: [PATCH 076/254] rename example to unrolling_service --- examples/example_unrolling_service/env_tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index e01568103..dc326c8c9 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -13,7 +13,7 @@ from gym.spaces import Box import compiler_gym -import examples.example_unrolling_service as example +import examples.example_unrolling_service as unrolling_service from compiler_gym.envs import CompilerEnv from compiler_gym.service import SessionNotFound from compiler_gym.spaces import NamedDiscrete, Scalar, Sequence @@ -34,7 +34,7 @@ def env(request) -> CompilerEnv: @pytest.fixture( scope="module", - params=[example.UNROLLING_PY_SERVICE_BINARY], + params=[unrolling_service.UNROLLING_PY_SERVICE_BINARY], ids=["unrolling-py-v0"], ) def bin(request) -> Path: From 6f6d20ad3851f01d58b821dbf3f756260c0be223 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 22 Sep 2021 23:56:00 -0400 Subject: [PATCH 077/254] add example --- examples/example_unrolling_service/BUILD | 9 +++++++++ examples/example_unrolling_service/example.py | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 examples/example_unrolling_service/example.py diff --git a/examples/example_unrolling_service/BUILD b/examples/example_unrolling_service/BUILD index c0cf4b838..349863fdd 100644 --- a/examples/example_unrolling_service/BUILD +++ b/examples/example_unrolling_service/BUILD @@ -25,3 +25,12 @@ py_test( "//tests:test_main", ], ) + +py_binary( + name = "example", + srcs = ["example.py"], + deps = [ + ":example_unrolling_service", + "//compiler_gym", + ], +) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py new file mode 100644 index 000000000..e624beea4 --- /dev/null +++ b/examples/example_unrolling_service/example.py @@ -0,0 +1,19 @@ +import compiler_gym + +env = compiler_gym.make( + "unrolling-py-v0", + benchmark="unrolling-v0/foo", + observation_space="ir", + reward_space="runtime", +) + +observation = env.reset() + +observation, reward, done, info = env.step(env.action_space.sample()) + +print("observation: ", observation) +print("reward: ", reward) +print("done: ", done) +print("info: ", info) + +# env.write_bitcode("/tmp/output.bc") From fc63a9da5f8487d7529f37fab5efdbad2a945db3 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Thu, 23 Sep 2021 00:13:33 -0400 Subject: [PATCH 078/254] add necessary import --- examples/example_unrolling_service/README.md | 7 ++++++- examples/example_unrolling_service/example.py | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/example_unrolling_service/README.md b/examples/example_unrolling_service/README.md index b887cb829..4cb39236c 100644 --- a/examples/example_unrolling_service/README.md +++ b/examples/example_unrolling_service/README.md @@ -9,7 +9,12 @@ TBD ## Usage -Rub: +Run Example: +```sh +$ bazel run //examples/example_unrolling_service:example +``` + +Run Tests: ```sh $ bazel test //examples/example_unrolling_service:env_tests diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index e624beea4..15d0ca870 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -1,4 +1,5 @@ import compiler_gym +import examples.example_unrolling_service as unrolling_service env = compiler_gym.make( "unrolling-py-v0", @@ -7,6 +8,8 @@ reward_space="runtime", ) +print(unrolling_service.UNROLLING_PY_SERVICE_BINARY) + observation = env.reset() observation, reward, done, info = env.step(env.action_space.sample()) From 3db5091d98796d8807c6f9de7e1ae946eb7c42b1 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 27 Sep 2021 09:12:01 -0400 Subject: [PATCH 079/254] try to create IR observation --- examples/example_unrolling_service/example.py | 19 +++++-- .../service_py/example_service.py | 57 ++++++++++++++++++- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 15d0ca870..482af41f5 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -1,15 +1,25 @@ import compiler_gym -import examples.example_unrolling_service as unrolling_service +import examples.example_unrolling_service as unrolling_service # noqa Register environments. + +# temporary hack to avoid "isort" pre-hook error +# TODO: remove this line +print(unrolling_service.UNROLLING_PY_SERVICE_BINARY) + +# TODO: avoid using hard-coded paths for benchmark files +# benchmark = compiler_gym.envs.llvm.llvm_env.make_benchmark("/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") +# benchmark = compiler_gym.datasets.benchmark.Benchmark.from_file("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") +# benchmark = compiler_gym.datasets.benchmark.BenchmarkWithSource.create("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") +benchmark = compiler_gym.envs.llvm.llvm_benchmark.make_benchmark( + "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c" +) env = compiler_gym.make( "unrolling-py-v0", - benchmark="unrolling-v0/foo", + benchmark=benchmark, # "unrolling-v0/foo" observation_space="ir", reward_space="runtime", ) -print(unrolling_service.UNROLLING_PY_SERVICE_BINARY) - observation = env.reset() observation, reward, done, info = env.step(env.action_space.sample()) @@ -19,4 +29,5 @@ print("done: ", done) print("info: ", info) +# TODO: implement write_bitcode(..) # env.write_bitcode("/tmp/output.bc") diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index ccaaa961d..f1ce23983 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -6,14 +6,18 @@ # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" import logging +import subprocess +import sys from pathlib import Path -from typing import Optional, Tuple +from signal import Signals +from typing import List, Optional, Tuple from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( Action, ActionSpace, Benchmark, + BenchmarkInitError, Observation, ObservationSpace, ScalarLimit, @@ -84,6 +88,55 @@ def __init__( ): super().__init__(working_directory, action_space, benchmark) logging.info("Started a compilation session for %s", benchmark.uri) + self._benchmark = benchmark + self._update_observations() + + def _update_observations(self): + self._observation = dict() + # FIXME: "llvm-dis" path is not found. Should we add its path, or is there another way to obtain the IR? + ir = self._run_command( + ["llvm-dis", self._benchmark.program.uri, "/dev/stdout"], timeout=5 + ) + self._observation["ir"] = Observation(string_value=ir) + + # TODO: update "features" and "runtime" observations + + # _communicate(...) and _run_command(...) have been copied from llvm_benchmark.py + # TODO: avoid redundancies and reuse code instead of copying + def _communicate(self, process, input=None, timeout=None): + """subprocess.communicate() which kills subprocess on timeout.""" + try: + return process.communicate(input=input, timeout=timeout) + except subprocess.TimeoutExpired: + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + process.kill() + else: + process.terminate() + raise + + def _run_command(self, cmd: List[str], timeout: int): + process = subprocess.Popen( + cmd, + stdout=subprocess.DEVNULL, + stderr=subprocess.PIPE, + universal_newlines=True, + ) + stdout, stderr = self._communicate(process, timeout=timeout) + if process.returncode: + returncode = process.returncode + try: + # Try and decode the name of a signal. Signal returncodes + # are negative. + returncode = f"{returncode} ({Signals(abs(returncode)).name})" + except ValueError: + pass + raise BenchmarkInitError( + f"Compilation job failed with returncode {returncode}\n" + f"Command: {' '.join(cmd)}\n" + f"Stderr: {stderr.strip()}" + ) + return stdout def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: logging.info("Applied action %d", action.action) @@ -94,7 +147,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo def get_observation(self, observation_space: ObservationSpace) -> Observation: logging.info("Computing observation from space %s", observation_space) if observation_space.name == "ir": - return Observation(string_value="Hello, world!") + return self._observation["ir"] elif observation_space.name == "features": observation = Observation() observation.int64_list.value[:] = [0, 0, 0] From ac8578feb9fc931f17e17d2847aa27b424a1d157 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 29 Sep 2021 21:16:36 -0400 Subject: [PATCH 080/254] read c file (into so called ir variable) --- examples/example_unrolling_service/example.py | 10 ++-- .../service_py/example_service.py | 54 +++---------------- 2 files changed, 12 insertions(+), 52 deletions(-) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 482af41f5..d6ed3454d 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -3,15 +3,15 @@ # temporary hack to avoid "isort" pre-hook error # TODO: remove this line -print(unrolling_service.UNROLLING_PY_SERVICE_BINARY) # TODO: avoid using hard-coded paths for benchmark files # benchmark = compiler_gym.envs.llvm.llvm_env.make_benchmark("/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") -# benchmark = compiler_gym.datasets.benchmark.Benchmark.from_file("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") -# benchmark = compiler_gym.datasets.benchmark.BenchmarkWithSource.create("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") -benchmark = compiler_gym.envs.llvm.llvm_benchmark.make_benchmark( - "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c" +benchmark = compiler_gym.datasets.benchmark.Benchmark.from_file( + "unrolling-example-for-now", + "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c", ) +# benchmark = compiler_gym.datasets.benchmark.BenchmarkWithSource.create("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") +# benchmark = compiler_gym.envs.llvm.llvm_benchmark.make_benchmark("/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") env = compiler_gym.make( "unrolling-py-v0", diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index f1ce23983..c6f821040 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -6,18 +6,16 @@ # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" import logging -import subprocess -import sys +import os from pathlib import Path -from signal import Signals -from typing import List, Optional, Tuple +from typing import Optional, Tuple +from urllib.parse import urlparse from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( Action, ActionSpace, Benchmark, - BenchmarkInitError, Observation, ObservationSpace, ScalarLimit, @@ -93,51 +91,13 @@ def __init__( def _update_observations(self): self._observation = dict() - # FIXME: "llvm-dis" path is not found. Should we add its path, or is there another way to obtain the IR? - ir = self._run_command( - ["llvm-dis", self._benchmark.program.uri, "/dev/stdout"], timeout=5 - ) + p = urlparse(self._benchmark.program.uri) + final_path = os.path.abspath(os.path.join(p.netloc, p.path)) + ir = open(final_path).read() + print("ir: ", ir) self._observation["ir"] = Observation(string_value=ir) - # TODO: update "features" and "runtime" observations - # _communicate(...) and _run_command(...) have been copied from llvm_benchmark.py - # TODO: avoid redundancies and reuse code instead of copying - def _communicate(self, process, input=None, timeout=None): - """subprocess.communicate() which kills subprocess on timeout.""" - try: - return process.communicate(input=input, timeout=timeout) - except subprocess.TimeoutExpired: - # kill() was added in Python 3.7. - if sys.version_info >= (3, 7, 0): - process.kill() - else: - process.terminate() - raise - - def _run_command(self, cmd: List[str], timeout: int): - process = subprocess.Popen( - cmd, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE, - universal_newlines=True, - ) - stdout, stderr = self._communicate(process, timeout=timeout) - if process.returncode: - returncode = process.returncode - try: - # Try and decode the name of a signal. Signal returncodes - # are negative. - returncode = f"{returncode} ({Signals(abs(returncode)).name})" - except ValueError: - pass - raise BenchmarkInitError( - f"Compilation job failed with returncode {returncode}\n" - f"Command: {' '.join(cmd)}\n" - f"Stderr: {stderr.strip()}" - ) - return stdout - def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: logging.info("Applied action %d", action.action) if action.action < 0 or action.action > len(self.action_spaces[0].action): From d718b48b3dd255728299ca1a80de9e109bcbcdce Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 29 Sep 2021 21:41:51 -0400 Subject: [PATCH 081/254] load llvm ir from source file --- .../service_py/example_service.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index c6f821040..3d508311e 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -91,10 +91,17 @@ def __init__( def _update_observations(self): self._observation = dict() - p = urlparse(self._benchmark.program.uri) - final_path = os.path.abspath(os.path.join(p.netloc, p.path)) - ir = open(final_path).read() - print("ir: ", ir) + + src_uri_p = urlparse(self._benchmark.program.uri) + src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) + # TODO: populate "timestamp" and "benchmark_name" in the path + # TODO: add "clean_up" function to remove files and save space + benchmark_log_dir = "/tmp/compiler_gym/timestamp/unrolling/benchmark_name/" + os.makedirs(benchmark_log_dir, exist_ok=True) + llvm_path = os.path.join(benchmark_log_dir, "version1.ll") + os.system(f"clang -emit-llvm -S {src_path} -o {llvm_path}") + ir = open(llvm_path).read() + self._observation["ir"] = Observation(string_value=ir) # TODO: update "features" and "runtime" observations From c74707c7ceda0a3813722600361bb23c2f45e021 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 29 Sep 2021 22:20:27 -0400 Subject: [PATCH 082/254] apply optimization when applying action --- examples/example_unrolling_service/example.py | 8 ++--- .../service_py/BUILD | 1 + .../service_py/example_service.py | 35 ++++++++++++------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index d6ed3454d..638d66ef4 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -1,17 +1,11 @@ import compiler_gym import examples.example_unrolling_service as unrolling_service # noqa Register environments. -# temporary hack to avoid "isort" pre-hook error -# TODO: remove this line - # TODO: avoid using hard-coded paths for benchmark files -# benchmark = compiler_gym.envs.llvm.llvm_env.make_benchmark("/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") benchmark = compiler_gym.datasets.benchmark.Benchmark.from_file( "unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c", ) -# benchmark = compiler_gym.datasets.benchmark.BenchmarkWithSource.create("unrolling-example-for-now", "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") -# benchmark = compiler_gym.envs.llvm.llvm_benchmark.make_benchmark("/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c") env = compiler_gym.make( "unrolling-py-v0", @@ -22,6 +16,8 @@ observation = env.reset() +print("observation: ", observation) + observation, reward, done, info = env.step(env.action_space.sample()) print("observation: ", observation) diff --git a/examples/example_unrolling_service/service_py/BUILD b/examples/example_unrolling_service/service_py/BUILD index f2d4c3e25..b8ff53f0a 100644 --- a/examples/example_unrolling_service/service_py/BUILD +++ b/examples/example_unrolling_service/service_py/BUILD @@ -13,5 +13,6 @@ py_binary( "//compiler_gym/service", "//compiler_gym/service/proto", "//compiler_gym/service/runtime", + "//compiler_gym/third_party/llvm", ], ) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 3d508311e..bae468d2d 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -11,6 +11,7 @@ from typing import Optional, Tuple from urllib.parse import urlparse +import compiler_gym.third_party.llvm as llvm from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( Action, @@ -30,16 +31,14 @@ class UnrollingCompilationSession(CompilationSession): compiler_version: str = "1.0.0" - # The list of actions that are supported by this service. This example uses - # a static (unchanging) action space, but this could be extended to support - # a dynamic action space. + # The list of actions that are supported by this service. action_spaces = [ ActionSpace( - name="default", + name="unrolling", action=[ - "a", - "b", - "c", + "-loop-unroll -unroll-count=2", + "-loop-unroll -unroll-count=4", + "-loop-unroll -unroll-count=8", ], ) ] @@ -93,14 +92,17 @@ def _update_observations(self): self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) - src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) + self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) # TODO: populate "timestamp" and "benchmark_name" in the path # TODO: add "clean_up" function to remove files and save space - benchmark_log_dir = "/tmp/compiler_gym/timestamp/unrolling/benchmark_name/" - os.makedirs(benchmark_log_dir, exist_ok=True) - llvm_path = os.path.join(benchmark_log_dir, "version1.ll") - os.system(f"clang -emit-llvm -S {src_path} -o {llvm_path}") - ir = open(llvm_path).read() + self._benchmark_log_dir = ( + "/tmp/compiler_gym/timestamp/unrolling/benchmark_name/" + ) + os.makedirs(self._benchmark_log_dir, exist_ok=True) + self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") + # FIXME: llvm.clang_path() lead to build errors + os.system(f"clang -emit-llvm -S {self._src_path} -o {self._llvm_path}") + ir = open(self._llvm_path).read() self._observation["ir"] = Observation(string_value=ir) # TODO: update "features" and "runtime" observations @@ -109,6 +111,13 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo logging.info("Applied action %d", action.action) if action.action < 0 or action.action > len(self.action_spaces[0].action): raise ValueError("Out-of-range") + + print("applying action") + os.system( + f"{llvm.opt_path()} --loop-unroll -unroll-count=4 {self._llvm_path} -S -o {self._llvm_path}" + ) + ir = open(self._llvm_path).read() + self._observation["ir"] = Observation(string_value=ir) return False, None, False def get_observation(self, observation_space: ObservationSpace) -> Observation: From adc68f7dae59dff58cda70e58ecf4fab8b515e46 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 29 Sep 2021 22:31:22 -0400 Subject: [PATCH 083/254] create initial ir without optimization --- .../example_unrolling_service/service_py/example_service.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index bae468d2d..8e8968e1c 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -101,7 +101,9 @@ def _update_observations(self): os.makedirs(self._benchmark_log_dir, exist_ok=True) self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") # FIXME: llvm.clang_path() lead to build errors - os.system(f"clang -emit-llvm -S {self._src_path} -o {self._llvm_path}") + os.system( + f"clang -Xclang -disable-O0-optnone -emit-llvm -S {self._src_path} -o {self._llvm_path}" + ) ir = open(self._llvm_path).read() self._observation["ir"] = Observation(string_value=ir) @@ -114,7 +116,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo print("applying action") os.system( - f"{llvm.opt_path()} --loop-unroll -unroll-count=4 {self._llvm_path} -S -o {self._llvm_path}" + f"{llvm.opt_path()} --loop-unroll -unroll-count=16 -unroll-threshold=0 {self._llvm_path} -S -o {self._llvm_path}" ) ir = open(self._llvm_path).read() self._observation["ir"] = Observation(string_value=ir) From 4db8db46002856ab07a5d880b61c3a0761148a15 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 1 Oct 2021 20:40:28 -0400 Subject: [PATCH 084/254] apply command_line arguments from provided action --- .../example_unrolling_service/service_py/example_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 8e8968e1c..99c9fcaef 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -86,6 +86,7 @@ def __init__( super().__init__(working_directory, action_space, benchmark) logging.info("Started a compilation session for %s", benchmark.uri) self._benchmark = benchmark + self._action_space = action_space self._update_observations() def _update_observations(self): @@ -114,9 +115,8 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo if action.action < 0 or action.action > len(self.action_spaces[0].action): raise ValueError("Out-of-range") - print("applying action") os.system( - f"{llvm.opt_path()} --loop-unroll -unroll-count=16 -unroll-threshold=0 {self._llvm_path} -S -o {self._llvm_path}" + f"{llvm.opt_path()} {self._action_space.action[action.action]} {self._llvm_path} -S -o {self._llvm_path}" ) ir = open(self._llvm_path).read() self._observation["ir"] = Observation(string_value=ir) From cffd6cc81d700950346dbff5c8cbc60b3fda5c9b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 1 Oct 2021 22:44:08 -0400 Subject: [PATCH 085/254] add llc and llvm-dis paths --- compiler_gym/third_party/llvm/__init__.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/compiler_gym/third_party/llvm/__init__.py b/compiler_gym/third_party/llvm/__init__.py index 80781616f..f82dfaba3 100644 --- a/compiler_gym/third_party/llvm/__init__.py +++ b/compiler_gym/third_party/llvm/__init__.py @@ -99,11 +99,21 @@ def lli_path() -> Path: return download_llvm_files() / "bin/lli" +def llc_path() -> Path: + """Return the path of llc.""" + return download_llvm_files() / "bin/llc" + + def llvm_as_path() -> Path: """Return the path of llvm-as.""" return download_llvm_files() / "bin/llvm-as" +def llvm_dis_path() -> Path: + """Return the path of llvm-as.""" + return download_llvm_files() / "bin/llvm-dis" + + def llvm_link_path() -> Path: """Return the path of llvm-link.""" return download_llvm_files() / "bin/llvm-link" From 55bab9d1ddb9082469ac67c063dc09ab408a107c Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 1 Oct 2021 22:45:35 -0400 Subject: [PATCH 086/254] build program to before getting runtime --- .../service_py/example_service.py | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 99c9fcaef..8368d8f18 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -87,9 +87,9 @@ def __init__( logging.info("Started a compilation session for %s", benchmark.uri) self._benchmark = benchmark self._action_space = action_space - self._update_observations() + self.reset() - def _update_observations(self): + def reset(self): self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) @@ -101,14 +101,12 @@ def _update_observations(self): ) os.makedirs(self._benchmark_log_dir, exist_ok=True) self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") + self._obj_path = os.path.join(self._benchmark_log_dir, "version1.o") + self._exe_path = os.path.join(self._benchmark_log_dir, "version1") # FIXME: llvm.clang_path() lead to build errors os.system( f"clang -Xclang -disable-O0-optnone -emit-llvm -S {self._src_path} -o {self._llvm_path}" ) - ir = open(self._llvm_path).read() - - self._observation["ir"] = Observation(string_value=ir) - # TODO: update "features" and "runtime" observations def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: logging.info("Applied action %d", action.action) @@ -120,17 +118,25 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo ) ir = open(self._llvm_path).read() self._observation["ir"] = Observation(string_value=ir) - return False, None, False + return False, None, False # TODO: return correct values def get_observation(self, observation_space: ObservationSpace) -> Observation: logging.info("Computing observation from space %s", observation_space) if observation_space.name == "ir": - return self._observation["ir"] + ir = open(self._llvm_path).read() + return Observation(string_value=ir) elif observation_space.name == "features": observation = Observation() observation.int64_list.value[:] = [0, 0, 0] return observation elif observation_space.name == "runtime": + # TODO: use perf to measure time as it is more accurate + os.system( + f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" + ) + os.system(f"clang {self._llvm_path} -o {self._exe_path}") + # FIXME: this is a very inaccurate way to measure time + os.system(f"{self._exe_path}") return Observation(scalar_double=0) else: raise KeyError(observation_space.name) From 9da2b1e574f1fbbd080c3ab01660423fb74dfe3e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 1 Oct 2021 23:14:21 -0400 Subject: [PATCH 087/254] measure execution time as a reward --- .../example_unrolling_service/service_py/example_service.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 8368d8f18..427959d20 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -7,6 +7,7 @@ """An example CompilerGym service in python.""" import logging import os +import time from pathlib import Path from typing import Optional, Tuple from urllib.parse import urlparse @@ -136,8 +137,10 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: ) os.system(f"clang {self._llvm_path} -o {self._exe_path}") # FIXME: this is a very inaccurate way to measure time + start_time = time.time() os.system(f"{self._exe_path}") - return Observation(scalar_double=0) + exec_time = time.time() - start_time + return Observation(scalar_double=exec_time) else: raise KeyError(observation_space.name) From dc5f138e26fb79b047fb6847b61bd10175237446 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 2 Oct 2021 15:47:00 -0400 Subject: [PATCH 088/254] add binary size as an observation/reward --- .../example_unrolling_service/__init__.py | 34 ++++++++++++++++++- .../service_py/example_service.py | 25 ++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index f584e636c..f23ba0242 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -48,6 +48,38 @@ def update(self, action, observations, observation_view): return reward +class SizeReward(Reward): + """An example reward that uses changes in the "size" observation value + to compute incremental reward. + """ + + def __init__(self): + super().__init__( + id="size", + observation_spaces=["size"], + default_value=0, + default_negates_returns=True, + deterministic=False, + platform_dependent=True, + ) + self.previous_size = None + + def reset(self, benchmark: str, observation_view): + del benchmark # unused + self.previous_size = None + + def update(self, action, observations, observation_view): + del action + del observation_view + + if self.previous_size is None: + self.previous_size = observations[0] + + reward = float(self.previous_size - observations[0]) + self.previous_size = observations[0] + return reward + + class ExampleDataset(Dataset): def __init__(self, *args, **kwargs): super().__init__( @@ -83,7 +115,7 @@ def benchmark(self, uri: str) -> Benchmark: entry_point="compiler_gym.envs:CompilerEnv", kwargs={ "service": UNROLLING_PY_SERVICE_BINARY, - "rewards": [RuntimeReward()], + "rewards": [RuntimeReward(), SizeReward()], "datasets": [ExampleDataset()], }, ) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 427959d20..2cb6e33fc 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -76,7 +76,16 @@ class UnrollingCompilationSession(CompilationSession): deterministic=False, platform_dependent=True, default_value=Observation( - scalar_double=0, + scalar_double=0, # TODO: get default runtime when compiling with -O3? + ), + ), + ObservationSpace( + name="size", + scalar_double_range=ScalarRange(min=ScalarLimit(value=0)), + deterministic=True, + platform_dependent=True, + default_value=Observation( + scalar_double=0, # TODO: get default runtime when compiling with -Oz? ), ), ] @@ -135,12 +144,24 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: os.system( f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" ) - os.system(f"clang {self._llvm_path} -o {self._exe_path}") + os.system( + f"clang {self._llvm_path} -o {self._exe_path}" + ) # TODO: use -O3 here? # FIXME: this is a very inaccurate way to measure time start_time = time.time() os.system(f"{self._exe_path}") exec_time = time.time() - start_time return Observation(scalar_double=exec_time) + elif observation_space.name == "size": + # TODO: refactor code so that you don't redo code compilation here? + os.system( + f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" + ) + os.system( + f"clang {self._llvm_path} -o {self._exe_path}" + ) # TODO: use -Oz here? + binary_size = os.path.getsize(self._exe_path) + return Observation(scalar_double=binary_size) else: raise KeyError(observation_space.name) From 33dea701a36c858937f1f47c94727d069968b36b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 2 Oct 2021 17:44:27 -0400 Subject: [PATCH 089/254] extract statistical features --- .../service_py/example_service.py | 76 ++++++++++++++++--- 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 2cb6e33fc..f332fd982 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -27,6 +27,64 @@ from compiler_gym.service.runtime import create_and_run_compiler_gym_service +# TODO: move to a utils.py file? +def extract_statistics_from_ir(ir: str): + stats = {"control_flow": 0, "arithmetic": 0, "memory": 0} + for line in ir.splitlines(): + tokens = line.split() + if len(tokens) > 0: + opcode = tokens[0] + if opcode in [ + "br", + "call", + "ret", + "switch", + "indirectbr", + "invoke", + "callbr", + "resume", + "catchswitch", + "catchret", + "cleanupret", + "unreachable", + ]: + stats["control_flow"] += 1 + elif opcode in [ + "fneg", + "add", + "fadd", + "sub", + "fsub", + "mul", + "fmul", + "udiv", + "sdiv", + "fdiv", + "urem", + "srem", + "frem", + "shl", + "lshr", + "ashr", + "and", + "or", + "xor", + ]: + stats["arithmetic"] += 1 + elif opcode in [ + "alloca", + "load", + "store", + "fence", + "cmpxchg", + "atomicrmw", + "getelementptr", + ]: + stats["memory"] += 1 + + return stats + + class UnrollingCompilationSession(CompilationSession): """Represents an instance of an interactive compilation session.""" @@ -58,15 +116,9 @@ class UnrollingCompilationSession(CompilationSession): name="features", int64_range_list=ScalarRangeList( range=[ - ScalarRange( - min=ScalarLimit(value=-100), max=ScalarLimit(value=100) - ), - ScalarRange( - min=ScalarLimit(value=-100), max=ScalarLimit(value=100) - ), - ScalarRange( - min=ScalarLimit(value=-100), max=ScalarLimit(value=100) - ), + ScalarRange(min=ScalarLimit(value=0), max=ScalarLimit(value=1e5)), + ScalarRange(min=ScalarLimit(value=0), max=ScalarLimit(value=1e5)), + ScalarRange(min=ScalarLimit(value=0), max=ScalarLimit(value=1e5)), ] ), ), @@ -100,6 +152,7 @@ def __init__( self.reset() def reset(self): + # TODO: obtain all observations and rewards at the beginning? self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) @@ -114,6 +167,7 @@ def reset(self): self._obj_path = os.path.join(self._benchmark_log_dir, "version1.o") self._exe_path = os.path.join(self._benchmark_log_dir, "version1") # FIXME: llvm.clang_path() lead to build errors + # TODO: throw errors at the user if any command files os.system( f"clang -Xclang -disable-O0-optnone -emit-llvm -S {self._src_path} -o {self._llvm_path}" ) @@ -136,8 +190,10 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: ir = open(self._llvm_path).read() return Observation(string_value=ir) elif observation_space.name == "features": + ir = open(self._llvm_path).read() + stats = extract_statistics_from_ir(ir) observation = Observation() - observation.int64_list.value[:] = [0, 0, 0] + observation.int64_list.value[:] = list(stats.values()) return observation elif observation_space.name == "runtime": # TODO: use perf to measure time as it is more accurate From 2aaa6d262b89ea566f5745ff9bbc75887c6ebc0b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 2 Oct 2021 23:15:31 -0400 Subject: [PATCH 090/254] measure using Timer class --- .../service_py/example_service.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index f332fd982..56417c511 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -7,7 +7,6 @@ """An example CompilerGym service in python.""" import logging import os -import time from pathlib import Path from typing import Optional, Tuple from urllib.parse import urlparse @@ -25,6 +24,7 @@ ScalarRangeList, ) from compiler_gym.service.runtime import create_and_run_compiler_gym_service +from compiler_gym.util.timer import Timer # TODO: move to a utils.py file? @@ -203,10 +203,12 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: os.system( f"clang {self._llvm_path} -o {self._exe_path}" ) # TODO: use -O3 here? - # FIXME: this is a very inaccurate way to measure time - start_time = time.time() - os.system(f"{self._exe_path}") - exec_time = time.time() - start_time + # Running 5 times and taking the average + with Timer() as exec_time: + os.system( + f"{self._exe_path}; {self._exe_path}; {self._exe_path}; {self._exe_path}; {self._exe_path}" + ) + exec_time = exec_time.time / 5 return Observation(scalar_double=exec_time) elif observation_space.name == "size": # TODO: refactor code so that you don't redo code compilation here? From 5c4a404326a37ae6ae927a6a46334a566e988a05 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 2 Oct 2021 23:37:07 -0400 Subject: [PATCH 091/254] populate timestamp and benchmark_name in path --- .../service_py/example_service.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 56417c511..da4a5c3c2 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -5,6 +5,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" +import datetime import logging import os from pathlib import Path @@ -157,10 +158,12 @@ def reset(self): src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) - # TODO: populate "timestamp" and "benchmark_name" in the path + timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + benchmark_name = os.path.basename(self._src_path) # TODO: add "clean_up" function to remove files and save space - self._benchmark_log_dir = ( - "/tmp/compiler_gym/timestamp/unrolling/benchmark_name/" + # TODO: add argument to specify defaut log directory (or use what is used somewhere else in the repo) + self._benchmark_log_dir = os.path.join( + Path.home(), ".compiler_gym_log", "unrolling", timestamp, benchmark_name ) os.makedirs(self._benchmark_log_dir, exist_ok=True) self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") From 3282204d141c053de1cca9900a4a160c5f4b8c20 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 6 Oct 2021 23:15:10 -0400 Subject: [PATCH 092/254] separate date and time directory names for log --- .../service_py/example_service.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index da4a5c3c2..a649ca475 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -158,12 +158,18 @@ def reset(self): src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) - timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + current_date = datetime.datetime.now().strftime("%Y-%m-%d") + current_time = datetime.datetime.now().strftime("%H-%M-%S") benchmark_name = os.path.basename(self._src_path) # TODO: add "clean_up" function to remove files and save space # TODO: add argument to specify defaut log directory (or use what is used somewhere else in the repo) self._benchmark_log_dir = os.path.join( - Path.home(), ".compiler_gym_log", "unrolling", timestamp, benchmark_name + Path.home(), + ".compiler_gym_log", + "unrolling", + current_date, + current_time, + benchmark_name, ) os.makedirs(self._benchmark_log_dir, exist_ok=True) self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") From ab06bf6a8934b8cbadde1a09e96738cf9f2ec07e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 6 Oct 2021 23:58:08 -0400 Subject: [PATCH 093/254] calculate reward as relative difference to baseline --- .../example_unrolling_service/__init__.py | 28 +++++++++++-------- .../service_py/example_service.py | 17 +++++------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index f23ba0242..3bf3f71ca 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -30,21 +30,23 @@ def __init__(self): deterministic=False, platform_dependent=True, ) - self.previous_runtime = None + self.baseline_runtime = 1 def reset(self, benchmark: str, observation_view): del benchmark # unused - self.previous_runtime = None + self.baseline_runtime = observation_view["runtime"] def update(self, action, observations, observation_view): del action del observation_view - if self.previous_runtime is None: - self.previous_runtime = observations[0] + if self.baseline_runtime is None: + self.baseline_runtime = observations[0] - reward = float(self.previous_runtime - observations[0]) - self.previous_runtime = observations[0] + # Here we are using Contextual Bandits: the number of steps the RL agent has to take before + # the environment terminates is one. In Contextual Bandits the learner tries + # to find a single best action in the current state. It involves learning to search for best actions and trial-and-error + reward = float(self.baseline_runtime - observations[0]) / self.baseline_runtime return reward @@ -62,21 +64,23 @@ def __init__(self): deterministic=False, platform_dependent=True, ) - self.previous_size = None + self.baseline_size = None def reset(self, benchmark: str, observation_view): del benchmark # unused - self.previous_size = None + self.baseline_size = None def update(self, action, observations, observation_view): del action del observation_view - if self.previous_size is None: - self.previous_size = observations[0] + if self.baseline_size is None: + self.baseline_size = observations[0] - reward = float(self.previous_size - observations[0]) - self.previous_size = observations[0] + # Here we are using Contextual Bandits: the number of steps the RL agent has to take before + # the environment terminates is one. In Contextual Bandits the learner tries + # to find a single best action in the current state. It involves learning to search for best actions and trial-and-error + reward = float(self.baseline_size - observations[0]) / self.baseline_size return reward diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index a649ca475..0bd40360a 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -129,7 +129,7 @@ class UnrollingCompilationSession(CompilationSession): deterministic=False, platform_dependent=True, default_value=Observation( - scalar_double=0, # TODO: get default runtime when compiling with -O3? + scalar_double=0, ), ), ObservationSpace( @@ -138,7 +138,7 @@ class UnrollingCompilationSession(CompilationSession): deterministic=True, platform_dependent=True, default_value=Observation( - scalar_double=0, # TODO: get default runtime when compiling with -Oz? + scalar_double=0, ), ), ] @@ -153,7 +153,6 @@ def __init__( self.reset() def reset(self): - # TODO: obtain all observations and rewards at the beginning? self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) @@ -172,11 +171,12 @@ def reset(self): benchmark_name, ) os.makedirs(self._benchmark_log_dir, exist_ok=True) + # TODO: use a counter to suffix IR and obj files? Or remove the suffix? self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") self._obj_path = os.path.join(self._benchmark_log_dir, "version1.o") self._exe_path = os.path.join(self._benchmark_log_dir, "version1") # FIXME: llvm.clang_path() lead to build errors - # TODO: throw errors at the user if any command files + # TODO: throw exception if any command fails os.system( f"clang -Xclang -disable-O0-optnone -emit-llvm -S {self._src_path} -o {self._llvm_path}" ) @@ -190,6 +190,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo f"{llvm.opt_path()} {self._action_space.action[action.action]} {self._llvm_path} -S -o {self._llvm_path}" ) ir = open(self._llvm_path).read() + # TODO: it seems that we don't need an _observation dictionary. Perhapse "ir" string is enough self._observation["ir"] = Observation(string_value=ir) return False, None, False # TODO: return correct values @@ -209,9 +210,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: os.system( f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" ) - os.system( - f"clang {self._llvm_path} -o {self._exe_path}" - ) # TODO: use -O3 here? + os.system(f"clang {self._llvm_path} -O3 -o {self._exe_path}") # Running 5 times and taking the average with Timer() as exec_time: os.system( @@ -224,9 +223,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: os.system( f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" ) - os.system( - f"clang {self._llvm_path} -o {self._exe_path}" - ) # TODO: use -Oz here? + os.system(f"clang {self._llvm_path} -Oz -o {self._exe_path}") binary_size = os.path.getsize(self._exe_path) return Observation(scalar_double=binary_size) else: From eabde76661768f69ec68b948be7f59d1823388a6 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 9 Oct 2021 10:37:26 -0400 Subject: [PATCH 094/254] use dataset class to store paths of benchmarks --- examples/example_unrolling_service/__init__.py | 14 ++++++++------ examples/example_unrolling_service/example.py | 10 +++------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index 3bf3f71ca..14e3229e2 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -84,7 +84,7 @@ def update(self, action, observations, observation_view): return reward -class ExampleDataset(Dataset): +class UnrollingDataset(Dataset): def __init__(self, *args, **kwargs): super().__init__( name="benchmark://unrolling-v0", @@ -93,11 +93,13 @@ def __init__(self, *args, **kwargs): site_data_base=site_data_path("example_dataset"), ) self._benchmarks = { - "benchmark://unrolling-v0/foo": Benchmark.from_file_contents( - "benchmark://unrolling-v0/foo", "Ir data".encode("utf-8") + "benchmark://unrolling-v0/offsets1": Benchmark.from_file( + "benchmark://unrolling-v0/offsets1", + "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c", ), - "benchmark://unrolling-v0/bar": Benchmark.from_file_contents( - "benchmark://unrolling-v0/bar", "Ir data".encode("utf-8") + "benchmark://unrolling-v0/conv2d": Benchmark.from_file( + "benchmark://unrolling-v0/conv2d", + "/Users/melhoushi/CompilerGym-Playground/dataset/conv2d.c", ), } @@ -120,6 +122,6 @@ def benchmark(self, uri: str) -> Benchmark: kwargs={ "service": UNROLLING_PY_SERVICE_BINARY, "rewards": [RuntimeReward(), SizeReward()], - "datasets": [ExampleDataset()], + "datasets": [UnrollingDataset()], }, ) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 638d66ef4..8de8d0f5f 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -1,16 +1,12 @@ import compiler_gym import examples.example_unrolling_service as unrolling_service # noqa Register environments. -# TODO: avoid using hard-coded paths for benchmark files -benchmark = compiler_gym.datasets.benchmark.Benchmark.from_file( - "unrolling-example-for-now", - "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c", -) +benchmark = "unrolling-v0/conv2d" env = compiler_gym.make( "unrolling-py-v0", - benchmark=benchmark, # "unrolling-v0/foo" - observation_space="ir", + benchmark=benchmark, + observation_space="features", reward_space="runtime", ) From 7113abd94cb6614eac35c86bc0e2af939a7d3e99 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 9 Oct 2021 10:38:27 -0400 Subject: [PATCH 095/254] make benchmarks part of repo --- examples/example_unrolling_service/BUILD | 3 + .../example_unrolling_service/__init__.py | 10 ++- .../benchmarks/BUILD | 5 ++ .../benchmarks/conv2d.c | 73 +++++++++++++++++++ .../benchmarks/header.h | 54 ++++++++++++++ .../benchmarks/offsets1.c | 23 ++++++ .../example_unrolling_service/env_tests.py | 4 +- examples/example_unrolling_service/example.py | 6 +- .../service_py/example_service.py | 3 + 9 files changed, 171 insertions(+), 10 deletions(-) create mode 100644 examples/example_unrolling_service/benchmarks/BUILD create mode 100644 examples/example_unrolling_service/benchmarks/conv2d.c create mode 100644 examples/example_unrolling_service/benchmarks/header.h create mode 100644 examples/example_unrolling_service/benchmarks/offsets1.c diff --git a/examples/example_unrolling_service/BUILD b/examples/example_unrolling_service/BUILD index 349863fdd..24cefaa91 100644 --- a/examples/example_unrolling_service/BUILD +++ b/examples/example_unrolling_service/BUILD @@ -8,6 +8,9 @@ py_library( name = "example_unrolling_service", srcs = ["__init__.py"], data = [ + "//examples/example_unrolling_service/benchmarks:conv2d.c", + "//examples/example_unrolling_service/benchmarks:header.h", + "//examples/example_unrolling_service/benchmarks:offsets1.c", "//examples/example_unrolling_service/service_py:example-unrolling-service-py", ], visibility = ["//visibility:public"], diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index 14e3229e2..16c6e7793 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """This module demonstrates how to """ +import os from pathlib import Path from typing import Iterable @@ -90,16 +91,19 @@ def __init__(self, *args, **kwargs): name="benchmark://unrolling-v0", license="MIT", description="Unrolling example dataset", - site_data_base=site_data_path("example_dataset"), + site_data_base=site_data_path( + "example_dataset" + ), # TODO: what should we set this to? we are not using it ) + benchmarks_dir_path = os.path.join(os.path.dirname(__file__), "benchmarks") self._benchmarks = { "benchmark://unrolling-v0/offsets1": Benchmark.from_file( "benchmark://unrolling-v0/offsets1", - "/Users/melhoushi/CompilerGym-Playground/dataset/offsets1.c", + os.path.join(benchmarks_dir_path, "offsets1.c"), ), "benchmark://unrolling-v0/conv2d": Benchmark.from_file( "benchmark://unrolling-v0/conv2d", - "/Users/melhoushi/CompilerGym-Playground/dataset/conv2d.c", + os.path.join(benchmarks_dir_path, "conv2d.c"), ), } diff --git a/examples/example_unrolling_service/benchmarks/BUILD b/examples/example_unrolling_service/benchmarks/BUILD new file mode 100644 index 000000000..bd429404d --- /dev/null +++ b/examples/example_unrolling_service/benchmarks/BUILD @@ -0,0 +1,5 @@ +exports_files([ + "offsets1.c", + "conv2d.c", + "header.h", +]) diff --git a/examples/example_unrolling_service/benchmarks/conv2d.c b/examples/example_unrolling_service/benchmarks/conv2d.c new file mode 100644 index 000000000..f0a6f221e --- /dev/null +++ b/examples/example_unrolling_service/benchmarks/conv2d.c @@ -0,0 +1,73 @@ +#include "header.h" + +// TODO: use templates instead of macros +#ifndef N +#define N 32 +#endif + +#ifndef Ih +#define Ih 3 +#endif + +#ifndef Iw +#define Iw 12 +#endif + +#ifndef Ic +#define Ic 12 +#endif + +#ifndef Oc +#define Oc 64 +#endif + +#ifndef Kh +#define Kh 3 +#endif + +#ifndef Kw +#define Kw 3 +#endif + +// TODO: include pad, stride, and dilation + +#define Oh Ih - Kh + 1 +#define Ow Iw - Kw + 1 + +float x[N][Ih][Iw][Ic]; +float w[Oc][Kh][Kw][Ic]; +float y[N][Oh][Ow][Oc]; + +__attribute__((noinline)) +//template +void conv2d(int* ret) { + // loop over output + for (int n = 0; n < N; n++) { + for (int oh = 0; oh < Oh; oh++) { + for (int ow = 0; ow < Ow; ow++) { + for (int oc = 0; oc < Oc; oc++) { + y[n][oh][ow][oc] = 0; +// loop over filter +#pragma unroll(Kh) + for (int kh = 0; kh < Kh; kh++) { + for (int kw = 0; kw < Kw; kw++) { + for (int ic = 0; ic < Iw; ic++) { + // TODO: include pad, stride, and dilation + y[n][oh][ow][oc] += w[oc][kh][kw][ic] * x[n][oh - kh + 1][ow - kw + 1][ic]; + } + } + } + } + } + } + } + *ret = y[N - 1][Oh - 1][Ow - 1][Oc - 1]; +} + +int main(int argc, char* argv[]) { + int dummy = 0; + // TODO: initialize tensors + BENCH("conv2d", conv2d(&dummy), 100, dummy); + + return 0; +} diff --git a/examples/example_unrolling_service/benchmarks/header.h b/examples/example_unrolling_service/benchmarks/header.h new file mode 100644 index 000000000..2f6371168 --- /dev/null +++ b/examples/example_unrolling_service/benchmarks/header.h @@ -0,0 +1,54 @@ +/* +Copyright (c) 2019, Ameer Haj Ali (UC Berkeley), and Intel Corporation +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include + +#define ALIGNED16 __attribute__((aligned(16))) + +typedef int aint __attribute__((__aligned__(16))); + +// Warmup and then measure. +#define BENCH(NAME, RUN_LINE, ITER, DIGEST_LINE) \ + { \ + struct timeval Start, End; \ + RUN_LINE; \ + gettimeofday(&Start, 0); \ + for (int i = 0; i < (ITER); ++i) RUN_LINE; \ + gettimeofday(&End, 0); \ + unsigned r = DIGEST_LINE; \ + long mtime, s, us; \ + s = End.tv_sec - Start.tv_sec; \ + us = End.tv_usec - Start.tv_usec; \ + mtime = (s * 1000 + us / 1000.0) + 0.5; \ + if (print_times) \ + printf("%ld", mtime); \ + } +#define Mi 1048576 // 1<<20 +#define print_times true // argc > 1; +void init_memory(void* start, void* end); +void init_memory_float(float* start, float* end); +unsigned digest_memory(void* start, void* end); +void atimer(const char* title, bool print); diff --git a/examples/example_unrolling_service/benchmarks/offsets1.c b/examples/example_unrolling_service/benchmarks/offsets1.c new file mode 100644 index 000000000..6bf1ea6c3 --- /dev/null +++ b/examples/example_unrolling_service/benchmarks/offsets1.c @@ -0,0 +1,23 @@ +#ifndef N +#define N 1000000 +#endif + +#ifndef n +#define n 3 +#endif + +int A[N]; + +__attribute__((noinline)) void example1(int* ret) { + //#pragma unroll(n) + for (int i = 0; i < N - 3; i++) A[i] = A[i + 1] + A[i + 2] + A[i + 3]; + + *ret = A[N - 1]; +} + +int main(int argc, char* argv[]) { + int dummy = 0; + example1(&dummy); + + return 0; +} diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index dc326c8c9..7f48e2c70 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -211,8 +211,8 @@ def test_rewards(env: CompilerEnv): def test_benchmarks(env: CompilerEnv): assert list(env.datasets.benchmark_uris()) == [ - "benchmark://unrolling-v0/foo", - "benchmark://unrolling-v0/bar", + "benchmark://unrolling-v0/offsets1", + "benchmark://unrolling-v0/conv2d", ] diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 8de8d0f5f..24adbc17f 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -1,21 +1,17 @@ import compiler_gym import examples.example_unrolling_service as unrolling_service # noqa Register environments. -benchmark = "unrolling-v0/conv2d" - env = compiler_gym.make( "unrolling-py-v0", - benchmark=benchmark, + benchmark="unrolling-v0/conv2d", observation_space="features", reward_space="runtime", ) observation = env.reset() - print("observation: ", observation) observation, reward, done, info = env.step(env.action_space.sample()) - print("observation: ", observation) print("reward: ", reward) print("done: ", done) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 0bd40360a..f97adaa27 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -159,9 +159,12 @@ def reset(self): self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) current_date = datetime.datetime.now().strftime("%Y-%m-%d") current_time = datetime.datetime.now().strftime("%H-%M-%S") + # TODO: assert that the path exists benchmark_name = os.path.basename(self._src_path) + # TODO: add "clean_up" function to remove files and save space # TODO: add argument to specify defaut log directory (or use what is used somewhere else in the repo) + # maybe use `with tempfile.TemporaryDirectory() as d:` self._benchmark_log_dir = os.path.join( Path.home(), ".compiler_gym_log", From 4bd776681fda1413222e50235a08e30d6ad34781 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 10 Oct 2021 12:16:37 -0400 Subject: [PATCH 096/254] move extract ir to utils file --- .../benchmarks/BUILD | 1 + .../service_py/example_service.py | 62 +------------------ .../service_py/utils.py | 61 ++++++++++++++++++ 3 files changed, 65 insertions(+), 59 deletions(-) create mode 100644 examples/example_unrolling_service/service_py/utils.py diff --git a/examples/example_unrolling_service/benchmarks/BUILD b/examples/example_unrolling_service/benchmarks/BUILD index bd429404d..ff8828a91 100644 --- a/examples/example_unrolling_service/benchmarks/BUILD +++ b/examples/example_unrolling_service/benchmarks/BUILD @@ -1,3 +1,4 @@ +# TODO: use regular expressions instead of writing each file name manually exports_files([ "offsets1.c", "conv2d.c", diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index f97adaa27..376de4c84 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -12,6 +12,8 @@ from typing import Optional, Tuple from urllib.parse import urlparse +import utils + import compiler_gym.third_party.llvm as llvm from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( @@ -28,64 +30,6 @@ from compiler_gym.util.timer import Timer -# TODO: move to a utils.py file? -def extract_statistics_from_ir(ir: str): - stats = {"control_flow": 0, "arithmetic": 0, "memory": 0} - for line in ir.splitlines(): - tokens = line.split() - if len(tokens) > 0: - opcode = tokens[0] - if opcode in [ - "br", - "call", - "ret", - "switch", - "indirectbr", - "invoke", - "callbr", - "resume", - "catchswitch", - "catchret", - "cleanupret", - "unreachable", - ]: - stats["control_flow"] += 1 - elif opcode in [ - "fneg", - "add", - "fadd", - "sub", - "fsub", - "mul", - "fmul", - "udiv", - "sdiv", - "fdiv", - "urem", - "srem", - "frem", - "shl", - "lshr", - "ashr", - "and", - "or", - "xor", - ]: - stats["arithmetic"] += 1 - elif opcode in [ - "alloca", - "load", - "store", - "fence", - "cmpxchg", - "atomicrmw", - "getelementptr", - ]: - stats["memory"] += 1 - - return stats - - class UnrollingCompilationSession(CompilationSession): """Represents an instance of an interactive compilation session.""" @@ -204,7 +148,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: return Observation(string_value=ir) elif observation_space.name == "features": ir = open(self._llvm_path).read() - stats = extract_statistics_from_ir(ir) + stats = utils.extract_statistics_from_ir(ir) observation = Observation() observation.int64_list.value[:] = list(stats.values()) return observation diff --git a/examples/example_unrolling_service/service_py/utils.py b/examples/example_unrolling_service/service_py/utils.py new file mode 100644 index 000000000..c3ab2ace3 --- /dev/null +++ b/examples/example_unrolling_service/service_py/utils.py @@ -0,0 +1,61 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +def extract_statistics_from_ir(ir: str): + stats = {"control_flow": 0, "arithmetic": 0, "memory": 0} + for line in ir.splitlines(): + tokens = line.split() + if len(tokens) > 0: + opcode = tokens[0] + if opcode in [ + "br", + "call", + "ret", + "switch", + "indirectbr", + "invoke", + "callbr", + "resume", + "catchswitch", + "catchret", + "cleanupret", + "unreachable", + ]: + stats["control_flow"] += 1 + elif opcode in [ + "fneg", + "add", + "fadd", + "sub", + "fsub", + "mul", + "fmul", + "udiv", + "sdiv", + "fdiv", + "urem", + "srem", + "frem", + "shl", + "lshr", + "ashr", + "and", + "or", + "xor", + ]: + stats["arithmetic"] += 1 + elif opcode in [ + "alloca", + "load", + "store", + "fence", + "cmpxchg", + "atomicrmw", + "getelementptr", + ]: + stats["memory"] += 1 + + return stats From f0ce6bc2b69c98b5fc5bcba54083afa14e988721 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 10 Oct 2021 12:26:36 -0400 Subject: [PATCH 097/254] use working_dir member of CompilationSession class --- .../service_py/example_service.py | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 376de4c84..974e53651 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -5,7 +5,6 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" -import datetime import logging import os from pathlib import Path @@ -101,27 +100,12 @@ def reset(self): src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) - current_date = datetime.datetime.now().strftime("%Y-%m-%d") - current_time = datetime.datetime.now().strftime("%H-%M-%S") # TODO: assert that the path exists - benchmark_name = os.path.basename(self._src_path) - - # TODO: add "clean_up" function to remove files and save space - # TODO: add argument to specify defaut log directory (or use what is used somewhere else in the repo) - # maybe use `with tempfile.TemporaryDirectory() as d:` - self._benchmark_log_dir = os.path.join( - Path.home(), - ".compiler_gym_log", - "unrolling", - current_date, - current_time, - benchmark_name, - ) - os.makedirs(self._benchmark_log_dir, exist_ok=True) + # TODO: use a counter to suffix IR and obj files? Or remove the suffix? - self._llvm_path = os.path.join(self._benchmark_log_dir, "version1.ll") - self._obj_path = os.path.join(self._benchmark_log_dir, "version1.o") - self._exe_path = os.path.join(self._benchmark_log_dir, "version1") + self._llvm_path = os.path.join(self.working_dir, "version1.ll") + self._obj_path = os.path.join(self.working_dir, "version1.o") + self._exe_path = os.path.join(self.working_dir, "version1") # FIXME: llvm.clang_path() lead to build errors # TODO: throw exception if any command fails os.system( From 57c1cafb5bba39ab7553474b010990a791ef5a57 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 10 Oct 2021 12:34:05 -0400 Subject: [PATCH 098/254] remove reset() function in CompilationSession to avoid confusion --- .../example_unrolling_service/service_py/example_service.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 974e53651..21275d17a 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -93,9 +93,6 @@ def __init__( logging.info("Started a compilation session for %s", benchmark.uri) self._benchmark = benchmark self._action_space = action_space - self.reset() - - def reset(self): self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) From 6a721b4babd30f07bdda78817d02e979d3fbdc5b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 10 Oct 2021 12:46:31 -0400 Subject: [PATCH 099/254] use benchmark name in compile file outputs --- .../service_py/example_service.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 21275d17a..410cf1c66 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -97,12 +97,12 @@ def __init__( src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) + benchmark_name = os.path.basename(self._src_path).split(".")[0] # noqa # TODO: assert that the path exists - # TODO: use a counter to suffix IR and obj files? Or remove the suffix? - self._llvm_path = os.path.join(self.working_dir, "version1.ll") - self._obj_path = os.path.join(self.working_dir, "version1.o") - self._exe_path = os.path.join(self.working_dir, "version1") + self._llvm_path = os.path.join(self.working_dir, "{benchmark_name}.ll") + self._obj_path = os.path.join(self.working_dir, "{benchmark_name}.o") + self._exe_path = os.path.join(self.working_dir, "{benchmark_name}") # FIXME: llvm.clang_path() lead to build errors # TODO: throw exception if any command fails os.system( From 0892e8ea70cfc38696bc973e3793f1343f2a9127 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 09:46:38 -0400 Subject: [PATCH 100/254] use centralzied run_command function --- compiler_gym/envs/llvm/llvm_benchmark.py | 45 +++---------------- compiler_gym/util/BUILD | 1 + .../service_py/example_service.py | 17 +++++-- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/compiler_gym/envs/llvm/llvm_benchmark.py b/compiler_gym/envs/llvm/llvm_benchmark.py index 0e354749b..2530cecb4 100644 --- a/compiler_gym/envs/llvm/llvm_benchmark.py +++ b/compiler_gym/envs/llvm/llvm_benchmark.py @@ -7,36 +7,21 @@ import os import random import subprocess -import sys import tempfile from concurrent.futures import as_completed from datetime import datetime from pathlib import Path -from signal import Signals from typing import Iterable, List, Optional, Union from compiler_gym.datasets import Benchmark, BenchmarkInitError from compiler_gym.third_party import llvm +from compiler_gym.util.commands import communicate, run_command from compiler_gym.util.runfiles_path import transient_cache_path from compiler_gym.util.thread_pool import get_thread_pool_executor logger = logging.getLogger(__name__) -def _communicate(process, input=None, timeout=None): - """subprocess.communicate() which kills subprocess on timeout.""" - try: - return process.communicate(input=input, timeout=timeout) - except subprocess.TimeoutExpired: - # kill() was added in Python 3.7. - if sys.version_info >= (3, 7, 0): - process.kill() - else: - process.terminate() - process.communicate(timeout=timeout) # Wait for shutdown to complete. - raise - - def get_compiler_includes(compiler: str) -> Iterable[Path]: """Run the system compiler in verbose mode on a dummy input to get the system header search path. @@ -58,7 +43,7 @@ def get_compiler_includes(compiler: str) -> Iterable[Path]: f"Is there a working system compiler?\n" f"Error: {e}" ) from e - _, stderr = _communicate(process, input="", timeout=30) + _, stderr = communicate(process, input="", timeout=30) if process.returncode: raise OSError( f"Failed to invoke {compiler}. " @@ -190,26 +175,6 @@ def from_c_file( ) -def _run_command(cmd: List[str], timeout: int): - process = subprocess.Popen( - cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, universal_newlines=True - ) - _, stderr = _communicate(process, timeout=timeout) - if process.returncode: - returncode = process.returncode - try: - # Try and decode the name of a signal. Signal returncodes - # are negative. - returncode = f"{returncode} ({Signals(abs(returncode)).name})" - except ValueError: - pass - raise BenchmarkInitError( - f"Compilation job failed with returncode {returncode}\n" - f"Command: {' '.join(cmd)}\n" - f"Stderr: {stderr.strip()}" - ) - - def make_benchmark( inputs: Union[str, Path, ClangInvocation, List[Union[str, Path, ClangInvocation]]], copt: Optional[List[str]] = None, @@ -369,10 +334,10 @@ def _add_path(path: Path): # Fire off the clang and llvm-as jobs. futures = [ - executor.submit(_run_command, job.command(out), job.timeout) + executor.submit(run_command, job.command(out), job.timeout) for job, out in zip(clang_jobs, clang_outs) ] + [ - executor.submit(_run_command, command, timeout) + executor.submit(run_command, command, timeout) for command in llvm_as_commands ] @@ -404,7 +369,7 @@ def _add_path(path: Path): llvm_link = subprocess.Popen( llvm_link_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) - bitcode, stderr = _communicate(llvm_link, timeout=timeout) + bitcode, stderr = communicate(llvm_link, timeout=timeout) if llvm_link.returncode: raise BenchmarkInitError( f"Failed to link LLVM bitcodes with error: {stderr.decode('utf-8')}" diff --git a/compiler_gym/util/BUILD b/compiler_gym/util/BUILD index a0a83b572..483cee72e 100644 --- a/compiler_gym/util/BUILD +++ b/compiler_gym/util/BUILD @@ -10,6 +10,7 @@ py_library( srcs = [ "__init__.py", "capture_output.py", + "commands.py", "debug_util.py", "decorators.py", "download.py", diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 410cf1c66..719a3a2a1 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -11,7 +11,7 @@ from typing import Optional, Tuple from urllib.parse import urlparse -import utils +import utils # TODO: return back its contents to this file? import compiler_gym.third_party.llvm as llvm from compiler_gym.service import CompilationSession @@ -26,6 +26,7 @@ ScalarRangeList, ) from compiler_gym.service.runtime import create_and_run_compiler_gym_service +from compiler_gym.util.commands import run_command from compiler_gym.util.timer import Timer @@ -105,8 +106,18 @@ def __init__( self._exe_path = os.path.join(self.working_dir, "{benchmark_name}") # FIXME: llvm.clang_path() lead to build errors # TODO: throw exception if any command fails - os.system( - f"clang -Xclang -disable-O0-optnone -emit-llvm -S {self._src_path} -o {self._llvm_path}" + run_command( + [ + "clang", + "-Xclang", + "-disable-O0-optnone", + "-emit-llvm", + "-S", + self._src_path, + "-o", + self._llvm_path, + ], + timeout=20, ) def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: From 1b925a98db44962bce527e167796fe137eb8133e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 10:22:20 -0400 Subject: [PATCH 101/254] use run_command for one more command --- .../service_py/example_service.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 719a3a2a1..d862b629f 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -105,7 +105,6 @@ def __init__( self._obj_path = os.path.join(self.working_dir, "{benchmark_name}.o") self._exe_path = os.path.join(self.working_dir, "{benchmark_name}") # FIXME: llvm.clang_path() lead to build errors - # TODO: throw exception if any command fails run_command( [ "clang", @@ -117,7 +116,7 @@ def __init__( "-o", self._llvm_path, ], - timeout=20, + timeout=30, ) def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: @@ -146,8 +145,15 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: return observation elif observation_space.name == "runtime": # TODO: use perf to measure time as it is more accurate - os.system( - f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" + run_command( + [ + llvm.llc_path(), + "-filetype=obj", + self._llvm_path, + "-o", + self._obj_path, + ], + timeout=30, ) os.system(f"clang {self._llvm_path} -O3 -o {self._exe_path}") # Running 5 times and taking the average From 38d9aad0b730b8c1dbf7f36aa67ba37f5b1dac54 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 10:23:20 -0400 Subject: [PATCH 102/254] to create binary should run clang on object not llvm --- .../example_unrolling_service/service_py/example_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index d862b629f..2b9d372fe 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -155,7 +155,8 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: ], timeout=30, ) - os.system(f"clang {self._llvm_path} -O3 -o {self._exe_path}") + + os.system(f"clang {self._obj_path} -O3 -o {self._exe_path}") # Running 5 times and taking the average with Timer() as exec_time: os.system( @@ -168,7 +169,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: os.system( f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" ) - os.system(f"clang {self._llvm_path} -Oz -o {self._exe_path}") + os.system(f"clang {self._obj_path} -Oz -o {self._exe_path}") binary_size = os.path.getsize(self._exe_path) return Observation(scalar_double=binary_size) else: From 2f37f455ea14d963007b4cef80fccfb8acc04cec Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 10:30:59 -0400 Subject: [PATCH 103/254] run remaining build commands using run_command --- .../service_py/example_service.py | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 2b9d372fe..484be49d8 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -144,7 +144,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: observation.int64_list.value[:] = list(stats.values()) return observation elif observation_space.name == "runtime": - # TODO: use perf to measure time as it is more accurate + # compile LLVM to object file run_command( [ llvm.llc_path(), @@ -156,7 +156,17 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: timeout=30, ) - os.system(f"clang {self._obj_path} -O3 -o {self._exe_path}") + # build object file to binary + run_command( + [ + "clang", + self._obj_path, + "-O3", + "-o", + self._exe_path, + ], + timeout=30, + ) # Running 5 times and taking the average with Timer() as exec_time: os.system( @@ -165,11 +175,29 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: exec_time = exec_time.time / 5 return Observation(scalar_double=exec_time) elif observation_space.name == "size": - # TODO: refactor code so that you don't redo code compilation here? - os.system( - f"{llvm.llc_path()} -filetype=obj {self._llvm_path} -o {self._obj_path}" + # compile LLVM to object file + run_command( + [ + llvm.llc_path(), + "-filetype=obj", + self._llvm_path, + "-o", + self._obj_path, + ], + timeout=30, + ) + + # build object file to binary + run_command( + [ + "clang", + self._obj_path, + "-Oz", + "-o", + self._exe_path, + ], + timeout=30, ) - os.system(f"clang {self._obj_path} -Oz -o {self._exe_path}") binary_size = os.path.getsize(self._exe_path) return Observation(scalar_double=binary_size) else: From a6254527029cbc659d6cbf10f7a43cf4cbe527ec Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 11:01:39 -0400 Subject: [PATCH 104/254] use run_command and loop to measure average execution time --- .../service_py/example_service.py | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 484be49d8..b6ee301fa 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -11,6 +11,7 @@ from typing import Optional, Tuple from urllib.parse import urlparse +import numpy as np import utils # TODO: return back its contents to this file? import compiler_gym.third_party.llvm as llvm @@ -167,13 +168,20 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: ], timeout=30, ) - # Running 5 times and taking the average - with Timer() as exec_time: - os.system( - f"{self._exe_path}; {self._exe_path}; {self._exe_path}; {self._exe_path}; {self._exe_path}" - ) - exec_time = exec_time.time / 5 - return Observation(scalar_double=exec_time) + + # TODO: use more accurate methods to measure time + # Running 5 times and taking the average of middle 3 + exec_times = [] + for _ in range(5): + with Timer() as exec_time: + run_command( + [self._exe_path], + timeout=30, + ) + exec_times.append(exec_time.time) + exec_times = np.sort(exec_times) + avg_exec_time = np.mean(exec_times[1:4]) + return Observation(scalar_double=avg_exec_time) elif observation_space.name == "size": # compile LLVM to object file run_command( From 99371c826958d2a3d042364c1085d1845b21d03b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 11:04:19 -0400 Subject: [PATCH 105/254] remove unused observation dictionary --- .../example_unrolling_service/service_py/example_service.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index b6ee301fa..80370d698 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -95,7 +95,6 @@ def __init__( logging.info("Started a compilation session for %s", benchmark.uri) self._benchmark = benchmark self._action_space = action_space - self._observation = dict() src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) @@ -128,9 +127,6 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo os.system( f"{llvm.opt_path()} {self._action_space.action[action.action]} {self._llvm_path} -S -o {self._llvm_path}" ) - ir = open(self._llvm_path).read() - # TODO: it seems that we don't need an _observation dictionary. Perhapse "ir" string is enough - self._observation["ir"] = Observation(string_value=ir) return False, None, False # TODO: return correct values def get_observation(self, observation_space: ObservationSpace) -> Observation: From a2090ee0c74f26e715e27480281b13a0081c4e5b Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 11:20:04 -0400 Subject: [PATCH 106/254] return correct values of info when applying action --- examples/example_unrolling_service/example.py | 12 +++++++++++- .../service_py/example_service.py | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 24adbc17f..710fa5945 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -3,7 +3,7 @@ env = compiler_gym.make( "unrolling-py-v0", - benchmark="unrolling-v0/conv2d", + benchmark="unrolling-v0/offsets1", observation_space="features", reward_space="runtime", ) @@ -11,6 +11,16 @@ observation = env.reset() print("observation: ", observation) +print() + +observation, reward, done, info = env.step(env.action_space.sample()) +print("observation: ", observation) +print("reward: ", reward) +print("done: ", done) +print("info: ", info) + +print() + observation, reward, done, info = env.step(env.action_space.sample()) print("observation: ", observation) print("reward: ", reward) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 80370d698..b6d513449 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -5,8 +5,11 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" +import filecmp import logging import os +import shutil +import tempfile from pathlib import Path from typing import Optional, Tuple from urllib.parse import urlparse @@ -124,10 +127,20 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo if action.action < 0 or action.action > len(self.action_spaces[0].action): raise ValueError("Out-of-range") + # make a tmp copy of the LLVM file to compare its contents after applying the action + llvm_path_before = tempfile.NamedTemporaryFile().name + shutil.copyfile(self._llvm_path, llvm_path_before) + os.system( f"{llvm.opt_path()} {self._action_space.action[action.action]} {self._llvm_path} -S -o {self._llvm_path}" ) - return False, None, False # TODO: return correct values + + end_of_session = False # TODO: this needs investigation: for how long can we apply loop unrolling? e.g., detect if there are no more loops in the IR? + new_action_space = None + action_had_no_effect = filecmp.cmp( + llvm_path_before, self._llvm_path, shallow=False + ) + return (end_of_session, new_action_space, action_had_no_effect) def get_observation(self, observation_space: ObservationSpace) -> Observation: logging.info("Computing observation from space %s", observation_space) From c829c7bd66525275937012039f16b11b7ae5ddd8 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 11:26:40 -0400 Subject: [PATCH 107/254] update TODO comments --- .../example_unrolling_service/service_py/example_service.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index b6d513449..16cce298b 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -15,7 +15,7 @@ from urllib.parse import urlparse import numpy as np -import utils # TODO: return back its contents to this file? +import utils import compiler_gym.third_party.llvm as llvm from compiler_gym.service import CompilationSession @@ -102,12 +102,11 @@ def __init__( src_uri_p = urlparse(self._benchmark.program.uri) self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) benchmark_name = os.path.basename(self._src_path).split(".")[0] # noqa - # TODO: assert that the path exists self._llvm_path = os.path.join(self.working_dir, "{benchmark_name}.ll") self._obj_path = os.path.join(self.working_dir, "{benchmark_name}.o") self._exe_path = os.path.join(self.working_dir, "{benchmark_name}") - # FIXME: llvm.clang_path() lead to build errors + # FIXME: llvm.clang_path() lead to build errors if the source file includes a header file run_command( [ "clang", From b717648790d2853d8e9b0c05c95463dc16247668 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 12:32:38 -0400 Subject: [PATCH 108/254] obtain reward from execution time printed by program --- .../benchmarks/offsets1.c | 5 ++++- .../service_py/example_service.py | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/example_unrolling_service/benchmarks/offsets1.c b/examples/example_unrolling_service/benchmarks/offsets1.c index 6bf1ea6c3..973d38c19 100644 --- a/examples/example_unrolling_service/benchmarks/offsets1.c +++ b/examples/example_unrolling_service/benchmarks/offsets1.c @@ -1,3 +1,5 @@ +#include "header.h" + #ifndef N #define N 1000000 #endif @@ -17,7 +19,8 @@ __attribute__((noinline)) void example1(int* ret) { int main(int argc, char* argv[]) { int dummy = 0; - example1(&dummy); + // TODO: initialize tensors + BENCH("example1", example1(&dummy), 100, dummy); return 0; } diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 16cce298b..5260f7209 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -18,6 +18,7 @@ import utils import compiler_gym.third_party.llvm as llvm +from compiler_gym.datasets import BenchmarkInitError from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( Action, @@ -31,7 +32,6 @@ ) from compiler_gym.service.runtime import create_and_run_compiler_gym_service from compiler_gym.util.commands import run_command -from compiler_gym.util.timer import Timer class UnrollingCompilationSession(CompilationSession): @@ -177,16 +177,22 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: timeout=30, ) - # TODO: use more accurate methods to measure time + # TODO: add documentation that benchmarks need print out execution time # Running 5 times and taking the average of middle 3 exec_times = [] for _ in range(5): - with Timer() as exec_time: - run_command( - [self._exe_path], - timeout=30, + stdout = run_command( + [self._exe_path], + timeout=30, + ) + try: + exec_times.append(int(stdout)) + except ValueError: + raise BenchmarkInitError( + f"Error in parsing execution time from output of command\n" + f"Please ensure that the source code of the benchmark measures execution time and prints to stdout\n" + f"Stdout of the program: {stdout}" ) - exec_times.append(exec_time.time) exec_times = np.sort(exec_times) avg_exec_time = np.mean(exec_times[1:4]) return Observation(scalar_double=avg_exec_time) From db26b6d54e42daa192c8dc54edbab188a9546b38 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 13:03:33 -0400 Subject: [PATCH 109/254] add commands.py to repo --- compiler_gym/util/commands.py | 43 +++++++++++++++++++ .../service_py/example_service.py | 3 +- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 compiler_gym/util/commands.py diff --git a/compiler_gym/util/commands.py b/compiler_gym/util/commands.py new file mode 100644 index 000000000..4997119e6 --- /dev/null +++ b/compiler_gym/util/commands.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import subprocess +import sys +from signal import Signals +from typing import List + + +def run_command(cmd: List[str], timeout: int): + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True + ) + stdout, stderr = communicate(process, timeout=timeout) + if process.returncode: + returncode = process.returncode + try: + # Try and decode the name of a signal. Signal returncodes + # are negative. + returncode = f"{returncode} ({Signals(abs(returncode)).name})" + except ValueError: + pass + raise OSError( + f"Compilation job failed with returncode {returncode}\n" + f"Command: {' '.join(cmd)}\n" + f"Stderr: {stderr.strip()}" + ) + return stdout + + +def communicate(process, input=None, timeout=None): + """subprocess.communicate() which kills subprocess on timeout.""" + try: + return process.communicate(input=input, timeout=timeout) + except subprocess.TimeoutExpired: + # kill() was added in Python 3.7. + if sys.version_info >= (3, 7, 0): + process.kill() + else: + process.terminate() + raise diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 5260f7209..a5823b0a6 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -18,7 +18,6 @@ import utils import compiler_gym.third_party.llvm as llvm -from compiler_gym.datasets import BenchmarkInitError from compiler_gym.service import CompilationSession from compiler_gym.service.proto import ( Action, @@ -188,7 +187,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: try: exec_times.append(int(stdout)) except ValueError: - raise BenchmarkInitError( + raise ValueError( f"Error in parsing execution time from output of command\n" f"Please ensure that the source code of the benchmark measures execution time and prints to stdout\n" f"Stdout of the program: {stdout}" From 6a95e46a14bb85f10d46605b827e2a84793744ee Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 19:23:50 -0400 Subject: [PATCH 110/254] apply action using run_command --- .../service_py/example_service.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index a5823b0a6..b8e34f660 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -129,10 +129,20 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo llvm_path_before = tempfile.NamedTemporaryFile().name shutil.copyfile(self._llvm_path, llvm_path_before) - os.system( - f"{llvm.opt_path()} {self._action_space.action[action.action]} {self._llvm_path} -S -o {self._llvm_path}" - ) + # separate arguments string to list of string, because `run_command` requires each argument to be passed as a separate item in a list + action_arguments_list = self._action_space.action[action.action].split() + run_command( + [ + str(llvm.opt_path()), + *action_arguments_list, + self._llvm_path, + "-S", + "-o", + self._llvm_path, + ], + timeout=30, + ) end_of_session = False # TODO: this needs investigation: for how long can we apply loop unrolling? e.g., detect if there are no more loops in the IR? new_action_space = None action_had_no_effect = filecmp.cmp( From 5a1a13572bb22ba8d94912687e113c29f86e4e25 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 19:55:00 -0400 Subject: [PATCH 111/254] disable optimizations on main function that is being used for benchmarking --- examples/example_unrolling_service/benchmarks/conv2d.c | 2 +- examples/example_unrolling_service/benchmarks/offsets1.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/benchmarks/conv2d.c b/examples/example_unrolling_service/benchmarks/conv2d.c index f0a6f221e..9848d9529 100644 --- a/examples/example_unrolling_service/benchmarks/conv2d.c +++ b/examples/example_unrolling_service/benchmarks/conv2d.c @@ -64,7 +64,7 @@ void conv2d(int* ret) { *ret = y[N - 1][Oh - 1][Ow - 1][Oc - 1]; } -int main(int argc, char* argv[]) { +__attribute__((optnone)) int main(int argc, char* argv[]) { int dummy = 0; // TODO: initialize tensors BENCH("conv2d", conv2d(&dummy), 100, dummy); diff --git a/examples/example_unrolling_service/benchmarks/offsets1.c b/examples/example_unrolling_service/benchmarks/offsets1.c index 973d38c19..b5206cabf 100644 --- a/examples/example_unrolling_service/benchmarks/offsets1.c +++ b/examples/example_unrolling_service/benchmarks/offsets1.c @@ -17,7 +17,7 @@ __attribute__((noinline)) void example1(int* ret) { *ret = A[N - 1]; } -int main(int argc, char* argv[]) { +__attribute__((optnone)) int main(int argc, char* argv[]) { int dummy = 0; // TODO: initialize tensors BENCH("example1", example1(&dummy), 100, dummy); From 6cf9b9395ce474df7be68eb361387cbfd71c7acd Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 19:55:33 -0400 Subject: [PATCH 112/254] dont include braces in name of file --- .../example_unrolling_service/service_py/example_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index b8e34f660..b5c07fe24 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -102,9 +102,9 @@ def __init__( self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) benchmark_name = os.path.basename(self._src_path).split(".")[0] # noqa - self._llvm_path = os.path.join(self.working_dir, "{benchmark_name}.ll") - self._obj_path = os.path.join(self.working_dir, "{benchmark_name}.o") - self._exe_path = os.path.join(self.working_dir, "{benchmark_name}") + self._llvm_path = os.path.join(self.working_dir, f"{benchmark_name}.ll") + self._obj_path = os.path.join(self.working_dir, f"{benchmark_name}.o") + self._exe_path = os.path.join(self.working_dir, f"{benchmark_name}") # FIXME: llvm.clang_path() lead to build errors if the source file includes a header file run_command( [ From f015350330a981d09771070ede81514a6fb746c4 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 19:56:25 -0400 Subject: [PATCH 113/254] add action arguments to log --- .../example_unrolling_service/service_py/example_service.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index b5c07fe24..27129ffe0 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -121,7 +121,11 @@ def __init__( ) def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: - logging.info("Applied action %d", action.action) + logging.info( + "Applied action %d, equivalent command-line arguments: '%s'", + action.action, + self._action_space.action[action.action], + ) if action.action < 0 or action.action > len(self.action_spaces[0].action): raise ValueError("Out-of-range") From cd28c501c3043a497079d2cc78011c4e23bdd805 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Mon, 11 Oct 2021 22:49:04 -0400 Subject: [PATCH 114/254] use llvm_diff to check if action had an effect --- examples/example_unrolling_service/example.py | 3 ++- .../service_py/example_service.py | 14 +++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/example.py b/examples/example_unrolling_service/example.py index 710fa5945..af2298ba0 100644 --- a/examples/example_unrolling_service/example.py +++ b/examples/example_unrolling_service/example.py @@ -7,6 +7,7 @@ observation_space="features", reward_space="runtime", ) +compiler_gym.set_debug_level(4) # TODO: check why this has no effect observation = env.reset() print("observation: ", observation) @@ -27,5 +28,5 @@ print("done: ", done) print("info: ", info) -# TODO: implement write_bitcode(..) +# TODO: implement write_bitcode(..) or write_ir(..) # env.write_bitcode("/tmp/output.bc") diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 27129ffe0..d0675b5af 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -5,7 +5,6 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """An example CompilerGym service in python.""" -import filecmp import logging import os import shutil @@ -136,9 +135,10 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo # separate arguments string to list of string, because `run_command` requires each argument to be passed as a separate item in a list action_arguments_list = self._action_space.action[action.action].split() + # apply action run_command( [ - str(llvm.opt_path()), + llvm.opt_path(), *action_arguments_list, self._llvm_path, "-S", @@ -147,11 +147,15 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo ], timeout=30, ) + + # compare the IR files to check if the action had an effect + diff_res = os.system( + f"{llvm.llvm_diff_path()} {llvm_path_before} {self._llvm_path} >/dev/null 2>&1" + ) + end_of_session = False # TODO: this needs investigation: for how long can we apply loop unrolling? e.g., detect if there are no more loops in the IR? new_action_space = None - action_had_no_effect = filecmp.cmp( - llvm_path_before, self._llvm_path, shallow=False - ) + action_had_no_effect = diff_res == 0 return (end_of_session, new_action_space, action_had_no_effect) def get_observation(self, observation_space: ObservationSpace) -> Observation: From 77b8501fc154f51dc423abecafb679debbb25b7c Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 12 Oct 2021 00:14:34 -0400 Subject: [PATCH 115/254] fix as many env_tests as possible --- .../example_unrolling_service/env_tests.py | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index 7f48e2c70..752b845f2 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -82,8 +82,12 @@ def test_action_space(env: CompilerEnv): """Test that the environment reports the service's action spaces.""" assert env.action_spaces == [ NamedDiscrete( - name="default", - items=["a", "b", "c"], + name="unrolling", + items=[ + "-loop-unroll -unroll-count=2", + "-loop-unroll -unroll-count=4", + "-loop-unroll -unroll-count=8", + ], ) ] @@ -91,22 +95,25 @@ def test_action_space(env: CompilerEnv): def test_observation_spaces(env: CompilerEnv): """Test that the environment reports the service's observation spaces.""" env.reset() - assert env.observation.spaces.keys() == {"ir", "features", "runtime"} + assert env.observation.spaces.keys() == {"ir", "features", "runtime", "size"} assert env.observation.spaces["ir"].space == Sequence( size_range=(0, None), dtype=str, opaque_data_format="" ) assert env.observation.spaces["features"].space == Box( - shape=(3,), low=-100, high=100, dtype=int + shape=(3,), low=0, high=1e5, dtype=int ) assert env.observation.spaces["runtime"].space == Scalar( min=0, max=np.inf, dtype=float ) + assert env.observation.spaces["size"].space == Scalar( + min=0, max=np.inf, dtype=float + ) def test_reward_spaces(env: CompilerEnv): """Test that the environment reports the service's reward spaces.""" env.reset() - assert env.reward.spaces.keys() == {"runtime"} + assert env.reward.spaces.keys() == {"runtime", "size"} def test_step_before_reset(env: CompilerEnv): @@ -168,10 +175,10 @@ def test_default_ir_observation(env: CompilerEnv): """Test default observation space.""" env.observation_space = "ir" observation = env.reset() - assert observation == "Hello, world!" + assert len(observation) > 0 observation, reward, done, info = env.step(0) - assert observation == "Hello, world!" + assert len(observation) > 0 assert reward is None assert not done @@ -183,7 +190,7 @@ def test_default_features_observation(env: CompilerEnv): assert isinstance(observation, np.ndarray) assert observation.shape == (3,) assert observation.dtype == np.int64 - assert observation.tolist() == [0, 0, 0] + assert all(obs >= 0 for obs in observation.tolist()) def test_default_reward(env: CompilerEnv): @@ -192,21 +199,21 @@ def test_default_reward(env: CompilerEnv): env.reset() observation, reward, done, info = env.step(0) assert observation is None - assert reward == 0 + assert reward is not None assert not done def test_observations(env: CompilerEnv): """Test observation spaces.""" env.reset() - assert env.observation["ir"] == "Hello, world!" - np.testing.assert_array_equal(env.observation["features"], [0, 0, 0]) + assert len(env.observation["ir"]) > 0 + np.testing.assert_array_less([-1, -1, -1], env.observation["features"]) def test_rewards(env: CompilerEnv): """Test reward spaces.""" env.reset() - assert env.reward["runtime"] == 0 + assert env.reward["runtime"] is not None def test_benchmarks(env: CompilerEnv): From 856d9d97782abb90e2d1d4e1fc3a0888bab6c601 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 15:15:54 +0100 Subject: [PATCH 116/254] [util] Block until process quits on communicate() timeout. --- compiler_gym/util/commands.py | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler_gym/util/commands.py b/compiler_gym/util/commands.py index 4997119e6..e3377376e 100644 --- a/compiler_gym/util/commands.py +++ b/compiler_gym/util/commands.py @@ -40,4 +40,5 @@ def communicate(process, input=None, timeout=None): process.kill() else: process.terminate() + process.communicate(timeout=timeout) # Wait for shutdown to complete. raise From 46ae52257ac869258dcce0468297cfb7995ee24c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:10:51 +0100 Subject: [PATCH 117/254] [examples] Add support for multi-file unrolling benchmarks. Also move the neuro-vectorizer header into third-party. --- .../third_party/neuro-vectorizer/BUILD | 5 +++ .../third_party/neuro-vectorizer/LICENSE | 29 +++++++++++++ .../third_party/neuro-vectorizer}/header.h | 23 +++++----- examples/example_unrolling_service/BUILD | 5 +-- .../example_unrolling_service/__init__.py | 42 ++++++++++++++++--- .../benchmarks/BUILD | 18 +++++--- 6 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 compiler_gym/third_party/neuro-vectorizer/BUILD create mode 100644 compiler_gym/third_party/neuro-vectorizer/LICENSE rename {examples/example_unrolling_service/benchmarks => compiler_gym/third_party/neuro-vectorizer}/header.h (81%) diff --git a/compiler_gym/third_party/neuro-vectorizer/BUILD b/compiler_gym/third_party/neuro-vectorizer/BUILD new file mode 100644 index 000000000..d2f7ae0e8 --- /dev/null +++ b/compiler_gym/third_party/neuro-vectorizer/BUILD @@ -0,0 +1,5 @@ +filegroup( + name = "header", + srcs = ["header.h"], + visibility = ["//visibility:public"], +) diff --git a/compiler_gym/third_party/neuro-vectorizer/LICENSE b/compiler_gym/third_party/neuro-vectorizer/LICENSE new file mode 100644 index 000000000..584fa041f --- /dev/null +++ b/compiler_gym/third_party/neuro-vectorizer/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Ameer Haj Ali (UC Berkeley), and Intel Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/examples/example_unrolling_service/benchmarks/header.h b/compiler_gym/third_party/neuro-vectorizer/header.h similarity index 81% rename from examples/example_unrolling_service/benchmarks/header.h rename to compiler_gym/third_party/neuro-vectorizer/header.h index 2f6371168..ee52bc865 100644 --- a/examples/example_unrolling_service/benchmarks/header.h +++ b/compiler_gym/third_party/neuro-vectorizer/header.h @@ -26,11 +26,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#define ALIGNED16 __attribute__((aligned(16))) - -typedef int aint __attribute__((__aligned__(16))); - -// Warmup and then measure. +/** + * Warmup and then measure. + * + * Adapted from Neurovectorizer's implementation: + * https://github.com/intel/neuro-vectorizer/blob/d1b068998c08865c59f1586845bb947229f70a51/training_data/header.h + * + * Which was in turn adapted from LLVM: + * https://github.com/llvm/llvm-test-suite/blob/7eca159e29ca4308256ef6e35560a2d884ac6b01/SingleSource/UnitTests/Vectorizer/gcc-loops.cpp#L330-L336 + */ #define BENCH(NAME, RUN_LINE, ITER, DIGEST_LINE) \ { \ struct timeval Start, End; \ @@ -43,12 +47,5 @@ typedef int aint __attribute__((__aligned__(16))); s = End.tv_sec - Start.tv_sec; \ us = End.tv_usec - Start.tv_usec; \ mtime = (s * 1000 + us / 1000.0) + 0.5; \ - if (print_times) \ - printf("%ld", mtime); \ + printf("%ld", mtime); \ } -#define Mi 1048576 // 1<<20 -#define print_times true // argc > 1; -void init_memory(void* start, void* end); -void init_memory_float(float* start, float* end); -unsigned digest_memory(void* start, void* end); -void atimer(const char* title, bool print); diff --git a/examples/example_unrolling_service/BUILD b/examples/example_unrolling_service/BUILD index 24cefaa91..bf1f3c409 100644 --- a/examples/example_unrolling_service/BUILD +++ b/examples/example_unrolling_service/BUILD @@ -8,13 +8,12 @@ py_library( name = "example_unrolling_service", srcs = ["__init__.py"], data = [ - "//examples/example_unrolling_service/benchmarks:conv2d.c", - "//examples/example_unrolling_service/benchmarks:header.h", - "//examples/example_unrolling_service/benchmarks:offsets1.c", + "//examples/example_unrolling_service/benchmarks", "//examples/example_unrolling_service/service_py:example-unrolling-service-py", ], visibility = ["//visibility:public"], deps = [ + "//compiler_gym/envs/llvm", "//compiler_gym/util", ], ) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index 16c6e7793..c542bcb14 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -3,12 +3,14 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """This module demonstrates how to """ -import os from pathlib import Path from typing import Iterable +import subprocess from compiler_gym.datasets import Benchmark, Dataset +from compiler_gym.envs.llvm.llvm_benchmark import get_system_includes from compiler_gym.spaces import Reward +from compiler_gym.third_party import llvm from compiler_gym.util.registration import register from compiler_gym.util.runfiles_path import runfiles_path, site_data_path @@ -16,6 +18,12 @@ "examples/example_unrolling_service/service_py/example-unrolling-service-py" ) +BENCHMARKS_PATH: Path = runfiles_path("examples/example_unrolling_service/benchmarks") + +NEURO_VECTORIZER_HEADER: Path = runfiles_path( + "compiler_gym/third_party/neuro-vectorizer/header.h" +) + class RuntimeReward(Reward): """An example reward that uses changes in the "runtime" observation value @@ -95,18 +103,40 @@ def __init__(self, *args, **kwargs): "example_dataset" ), # TODO: what should we set this to? we are not using it ) - benchmarks_dir_path = os.path.join(os.path.dirname(__file__), "benchmarks") + self._benchmarks = { - "benchmark://unrolling-v0/offsets1": Benchmark.from_file( + "benchmark://unrolling-v0/offsets1": Benchmark.from_file_contents( "benchmark://unrolling-v0/offsets1", - os.path.join(benchmarks_dir_path, "offsets1.c"), + self.preprocess(BENCHMARKS_PATH / "offsets1.c"), ), - "benchmark://unrolling-v0/conv2d": Benchmark.from_file( + "benchmark://unrolling-v0/conv2d": Benchmark.from_file_contents( "benchmark://unrolling-v0/conv2d", - os.path.join(benchmarks_dir_path, "conv2d.c"), + self.preprocess(BENCHMARKS_PATH / "conv2d.c"), ), } + @staticmethod + def preprocess(src: Path) -> bytes: + """Front a C source through the compiler frontend.""" + # TODO(github.com/facebookresearch/CompilerGym/issues/325): We can skip + # this pre-processing, or do it on the service side, once support for + # multi-file benchmarks lands. + cmd = [ + str(llvm.clang_path()), + "-E", + "-o", + "-", + "-I", + str(NEURO_VECTORIZER_HEADER.parent), + src, + ] + for directory in get_system_includes(): + cmd += ["-isystem", str(directory)] + return subprocess.check_output( + cmd, + timeout=300, + ) + def benchmark_uris(self) -> Iterable[str]: yield from self._benchmarks.keys() diff --git a/examples/example_unrolling_service/benchmarks/BUILD b/examples/example_unrolling_service/benchmarks/BUILD index ff8828a91..f565b5020 100644 --- a/examples/example_unrolling_service/benchmarks/BUILD +++ b/examples/example_unrolling_service/benchmarks/BUILD @@ -1,6 +1,12 @@ -# TODO: use regular expressions instead of writing each file name manually -exports_files([ - "offsets1.c", - "conv2d.c", - "header.h", -]) +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +filegroup( + name = "benchmarks", + srcs = glob(["*.c"]) + [ + "//compiler_gym/third_party/neuro-vectorizer:header", + ], + visibility = ["//visibility:public"], +) From aa38d686a14d724a0c33ff4c6d6ce2460d7ce1a9 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:14:12 +0100 Subject: [PATCH 118/254] [examples] Update unrolling example to new action space schema. --- .../service_py/example_service.py | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index d0675b5af..314f3634d 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -22,6 +22,8 @@ Action, ActionSpace, Benchmark, + ChoiceSpace, + NamedDiscreteSpace, Observation, ObservationSpace, ScalarLimit, @@ -41,10 +43,17 @@ class UnrollingCompilationSession(CompilationSession): action_spaces = [ ActionSpace( name="unrolling", - action=[ - "-loop-unroll -unroll-count=2", - "-loop-unroll -unroll-count=4", - "-loop-unroll -unroll-count=8", + choice=[ + ChoiceSpace( + name="unroll_choice", + named_discrete_space=NamedDiscreteSpace( + value=[ + "-loop-unroll -unroll-count=2", + "-loop-unroll -unroll-count=4", + "-loop-unroll -unroll-count=8", + ], + ), + ) ], ) ] @@ -120,26 +129,33 @@ def __init__( ) def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], bool]: + num_choices = len(self._action_space.choice[0].named_discrete_space.value) + + if len(action.choice) != 1: + raise ValueError("Invalid choice count") + + # This is the index into the action space's values ("a", "b", "c") that + # the user selected, e.g. 0 -> "a", 1 -> "b", 2 -> "c". + choice_index = action.choice[0].named_discrete_value_index + if choice_index < 0 or choice_index >= num_choices: + raise ValueError("Out-of-range") + + cmd = self._action_space.choice[0].named_discrete_space.value[choice_index] logging.info( - "Applied action %d, equivalent command-line arguments: '%s'", - action.action, - self._action_space.action[action.action], + "Applying action %d, equivalent command-line arguments: '%s'", + choice_index, + cmd, ) - if action.action < 0 or action.action > len(self.action_spaces[0].action): - raise ValueError("Out-of-range") # make a tmp copy of the LLVM file to compare its contents after applying the action llvm_path_before = tempfile.NamedTemporaryFile().name shutil.copyfile(self._llvm_path, llvm_path_before) - # separate arguments string to list of string, because `run_command` requires each argument to be passed as a separate item in a list - action_arguments_list = self._action_space.action[action.action].split() - # apply action run_command( [ llvm.opt_path(), - *action_arguments_list, + *cmd.split(), self._llvm_path, "-S", "-o", From ea4510fd701269d5caae5cb8201a29e32dff71d5 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:15:39 +0100 Subject: [PATCH 119/254] [examples] Resolve LLVM paths once. --- .../service_py/example_service.py | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 314f3634d..1c0750c80 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -11,7 +11,6 @@ import tempfile from pathlib import Path from typing import Optional, Tuple -from urllib.parse import urlparse import numpy as np import utils @@ -106,17 +105,24 @@ def __init__( self._benchmark = benchmark self._action_space = action_space - src_uri_p = urlparse(self._benchmark.program.uri) - self._src_path = os.path.abspath(os.path.join(src_uri_p.netloc, src_uri_p.path)) - benchmark_name = os.path.basename(self._src_path).split(".")[0] # noqa + # Resolve the paths to LLVM binaries once now. + self._clang = str(llvm.clang_path()) + self._llc = str(llvm.llc_path()) + self._llvm_diff = str(llvm.llvm_diff_path()) + self._opt = str(llvm.opt_path()) + + # Dump the benchmark source to disk. + self._src_path = str(self.working_dir / "benchmark.c") + with open(self.working_dir / "benchmark.c", "wb") as f: + f.write(benchmark.program.contents) + + self._llvm_path = str(self.working_dir / "benchmark.ll") + self._obj_path = str(self.working_dir / "benchmark.o") + self._exe_path = str(self.working_dir / "benchmark.exe") - self._llvm_path = os.path.join(self.working_dir, f"{benchmark_name}.ll") - self._obj_path = os.path.join(self.working_dir, f"{benchmark_name}.o") - self._exe_path = os.path.join(self.working_dir, f"{benchmark_name}") - # FIXME: llvm.clang_path() lead to build errors if the source file includes a header file run_command( [ - "clang", + self._clang, "-Xclang", "-disable-O0-optnone", "-emit-llvm", @@ -154,7 +160,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo # apply action run_command( [ - llvm.opt_path(), + self._opt, *cmd.split(), self._llvm_path, "-S", @@ -189,7 +195,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: # compile LLVM to object file run_command( [ - llvm.llc_path(), + self._llc, "-filetype=obj", self._llvm_path, "-o", @@ -233,7 +239,7 @@ def get_observation(self, observation_space: ObservationSpace) -> Observation: # compile LLVM to object file run_command( [ - llvm.llc_path(), + self._llc, "-filetype=obj", self._llvm_path, "-o", From 7ca1541054dda9d874c25c4776c84a2c8cdd375e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:17:38 +0100 Subject: [PATCH 120/254] [examples] Refactor the os.system() call. --- .../service_py/example_service.py | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 1c0750c80..7d99ee3b7 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -8,7 +8,7 @@ import logging import os import shutil -import tempfile +import subprocess from pathlib import Path from typing import Optional, Tuple @@ -117,6 +117,7 @@ def __init__( f.write(benchmark.program.contents) self._llvm_path = str(self.working_dir / "benchmark.ll") + self._llvm_before_path = str(self.working_dir / "benchmark.previous.ll") self._obj_path = str(self.working_dir / "benchmark.o") self._exe_path = str(self.working_dir / "benchmark.exe") @@ -153,9 +154,8 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo cmd, ) - # make a tmp copy of the LLVM file to compare its contents after applying the action - llvm_path_before = tempfile.NamedTemporaryFile().name - shutil.copyfile(self._llvm_path, llvm_path_before) + # make a copy of the LLVM file to compare its contents after applying the action + shutil.copyfile(self._llvm_path, self._llvm_before_path) # apply action run_command( @@ -171,13 +171,19 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo ) # compare the IR files to check if the action had an effect - diff_res = os.system( - f"{llvm.llvm_diff_path()} {llvm_path_before} {self._llvm_path} >/dev/null 2>&1" - ) + try: + subprocess.check_call( + [self._llvm_diff, self._llvm_before_path, self._llvm_path], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + timeout=60, + ) + action_had_no_effect = True + except subprocess.CalledProcessError: + action_had_no_effect = False end_of_session = False # TODO: this needs investigation: for how long can we apply loop unrolling? e.g., detect if there are no more loops in the IR? new_action_space = None - action_had_no_effect = diff_res == 0 return (end_of_session, new_action_space, action_had_no_effect) def get_observation(self, observation_space: ObservationSpace) -> Observation: From 2097af2694376f57b9739a35d4a89c0aec7767a3 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:17:56 +0100 Subject: [PATCH 121/254] [examples] Define a convenience property. --- .../service_py/example_service.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 7d99ee3b7..8a4173827 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -186,14 +186,17 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo new_action_space = None return (end_of_session, new_action_space, action_had_no_effect) + @property + def ir(self) -> str: + with open(self._llvm_path) as f: + return f.read() + def get_observation(self, observation_space: ObservationSpace) -> Observation: - logging.info("Computing observation from space %s", observation_space) + logging.info("Computing observation from space %s", observation_space.name) if observation_space.name == "ir": - ir = open(self._llvm_path).read() - return Observation(string_value=ir) + return Observation(string_value=self.ir) elif observation_space.name == "features": - ir = open(self._llvm_path).read() - stats = utils.extract_statistics_from_ir(ir) + stats = utils.extract_statistics_from_ir(self.ir) observation = Observation() observation.int64_list.value[:] = list(stats.values()) return observation From 8f18f6823ecd1ef9984057dc62230fcc2279257e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:18:29 +0100 Subject: [PATCH 122/254] [examples] Update tests to the new API. --- .../example_unrolling_service/env_tests.py | 49 ++++++------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/examples/example_unrolling_service/env_tests.py b/examples/example_unrolling_service/env_tests.py index 752b845f2..dc5555c94 100644 --- a/examples/example_unrolling_service/env_tests.py +++ b/examples/example_unrolling_service/env_tests.py @@ -3,50 +3,31 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Tests for the unrolling CompilerGym service example.""" -import logging import subprocess from pathlib import Path import gym import numpy as np import pytest -from gym.spaces import Box import compiler_gym import examples.example_unrolling_service as unrolling_service from compiler_gym.envs import CompilerEnv from compiler_gym.service import SessionNotFound -from compiler_gym.spaces import NamedDiscrete, Scalar, Sequence -from compiler_gym.util.debug_util import set_debug_level +from compiler_gym.spaces import Box, NamedDiscrete, Scalar, Sequence from tests.test_main import main -# Given that the C++ and Python service implementations have identical -# featuresets, we can parameterize the tests and run them against both backends. -UNROLLING_ENVIRONMENTS = ["unrolling-py-v0"] - -@pytest.fixture(scope="function", params=UNROLLING_ENVIRONMENTS) -def env(request) -> CompilerEnv: +@pytest.fixture(scope="function") +def env() -> CompilerEnv: """Text fixture that yields an environment.""" - with gym.make(request.param) as env: - yield env - - -@pytest.fixture( - scope="module", - params=[unrolling_service.UNROLLING_PY_SERVICE_BINARY], - ids=["unrolling-py-v0"], -) -def bin(request) -> Path: - yield request.param + with gym.make("unrolling-py-v0") as env_: + yield env_ -@pytest.mark.parametrize("env_id", UNROLLING_ENVIRONMENTS) -def test_debug_level(env_id: str): - """Test that debug level is set.""" - set_debug_level(3) - with gym.make(env_id) as env: - assert env.logger.level == logging.DEBUG +@pytest.fixture(scope="module") +def bin() -> Path: + return unrolling_service.UNROLLING_PY_SERVICE_BINARY def test_invalid_arguments(bin: Path): @@ -97,16 +78,16 @@ def test_observation_spaces(env: CompilerEnv): env.reset() assert env.observation.spaces.keys() == {"ir", "features", "runtime", "size"} assert env.observation.spaces["ir"].space == Sequence( - size_range=(0, None), dtype=str, opaque_data_format="" + name="ir", size_range=(0, None), dtype=str, opaque_data_format="" ) assert env.observation.spaces["features"].space == Box( - shape=(3,), low=0, high=1e5, dtype=int + name="features", shape=(3,), low=0, high=1e5, dtype=int ) assert env.observation.spaces["runtime"].space == Scalar( - min=0, max=np.inf, dtype=float + name="runtime", min=0, max=np.inf, dtype=float ) assert env.observation.spaces["size"].space == Scalar( - min=0, max=np.inf, dtype=float + name="size", min=0, max=np.inf, dtype=float ) @@ -157,9 +138,7 @@ def test_double_reset(env: CompilerEnv): """Test that reset() can be called twice.""" env.reset() assert env.in_episode - env.step(env.action_space.sample()) env.reset() - env.step(env.action_space.sample()) assert env.in_episode @@ -178,9 +157,9 @@ def test_default_ir_observation(env: CompilerEnv): assert len(observation) > 0 observation, reward, done, info = env.step(0) + assert not done, info assert len(observation) > 0 assert reward is None - assert not done def test_default_features_observation(env: CompilerEnv): @@ -198,9 +177,9 @@ def test_default_reward(env: CompilerEnv): env.reward_space = "runtime" env.reset() observation, reward, done, info = env.step(0) + assert not done, info assert observation is None assert reward is not None - assert not done def test_observations(env: CompilerEnv): From 5d4520eef20f53c1a6a0e9017d85897ea0e53202 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:21:26 +0100 Subject: [PATCH 123/254] [examples] Simplify reward implementations. --- .../example_unrolling_service/__init__.py | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/examples/example_unrolling_service/__init__.py b/examples/example_unrolling_service/__init__.py index c542bcb14..19aa30de2 100644 --- a/examples/example_unrolling_service/__init__.py +++ b/examples/example_unrolling_service/__init__.py @@ -3,9 +3,9 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """This module demonstrates how to """ +import subprocess from pathlib import Path from typing import Iterable -import subprocess from compiler_gym.datasets import Benchmark, Dataset from compiler_gym.envs.llvm.llvm_benchmark import get_system_includes @@ -39,24 +39,16 @@ def __init__(self): deterministic=False, platform_dependent=True, ) - self.baseline_runtime = 1 + self.baseline_runtime = 0 def reset(self, benchmark: str, observation_view): del benchmark # unused self.baseline_runtime = observation_view["runtime"] def update(self, action, observations, observation_view): - del action - del observation_view - - if self.baseline_runtime is None: - self.baseline_runtime = observations[0] - - # Here we are using Contextual Bandits: the number of steps the RL agent has to take before - # the environment terminates is one. In Contextual Bandits the learner tries - # to find a single best action in the current state. It involves learning to search for best actions and trial-and-error - reward = float(self.baseline_runtime - observations[0]) / self.baseline_runtime - return reward + del action # unused + del observation_view # unused + return float(self.baseline_runtime - observations[0]) / self.baseline_runtime class SizeReward(Reward): @@ -73,24 +65,16 @@ def __init__(self): deterministic=False, platform_dependent=True, ) - self.baseline_size = None + self.baseline_size = 0 def reset(self, benchmark: str, observation_view): del benchmark # unused - self.baseline_size = None + self.baseline_runtime = observation_view["size"] def update(self, action, observations, observation_view): - del action - del observation_view - - if self.baseline_size is None: - self.baseline_size = observations[0] - - # Here we are using Contextual Bandits: the number of steps the RL agent has to take before - # the environment terminates is one. In Contextual Bandits the learner tries - # to find a single best action in the current state. It involves learning to search for best actions and trial-and-error - reward = float(self.baseline_size - observations[0]) / self.baseline_size - return reward + del action # unused + del observation_view # unused + return float(self.baseline_size - observations[0]) / self.baseline_size class UnrollingDataset(Dataset): From b2b25b839248bb74f06ece250d120fe33529b581 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 13 Oct 2021 17:21:49 +0100 Subject: [PATCH 124/254] [service] Log benchmark cache size after add(), note before. --- compiler_gym/service/runtime/BenchmarkCache.cc | 5 +++-- compiler_gym/service/runtime/benchmark_cache.py | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/compiler_gym/service/runtime/BenchmarkCache.cc b/compiler_gym/service/runtime/BenchmarkCache.cc index eb032592f..4eeeb7ec6 100644 --- a/compiler_gym/service/runtime/BenchmarkCache.cc +++ b/compiler_gym/service/runtime/BenchmarkCache.cc @@ -27,8 +27,6 @@ const Benchmark* BenchmarkCache::get(const std::string& uri) const { void BenchmarkCache::add(const Benchmark&& benchmark) { const size_t benchmarkSize = benchmark.ByteSizeLong(); - VLOG(3) << "Caching benchmark " << benchmark.uri() << " (" << benchmarkSize - << " bytes). Cache size = " << sizeInBytes() << " bytes, " << size() << " items"; // Remove any existing value to keep the cache size consistent. const auto it = benchmarks_.find(benchmark.uri()); @@ -52,6 +50,9 @@ void BenchmarkCache::add(const Benchmark&& benchmark) { benchmarks_.insert({benchmark.uri(), std::move(benchmark)}); sizeInBytes_ += benchmarkSize; + + VLOG(3) << "Cached benchmark " << benchmark.uri() << " (" << benchmarkSize + << " bytes). Cache size = " << sizeInBytes() << " bytes, " << size() << " items"; } void BenchmarkCache::evictToCapacity(std::optional targetSize) { diff --git a/compiler_gym/service/runtime/benchmark_cache.py b/compiler_gym/service/runtime/benchmark_cache.py index add4eea2b..9d4660f46 100644 --- a/compiler_gym/service/runtime/benchmark_cache.py +++ b/compiler_gym/service/runtime/benchmark_cache.py @@ -46,13 +46,6 @@ def __contains__(self, uri: str): def __setitem__(self, uri: str, benchmark: Benchmark): """Add benchmark to cache.""" - logger.debug( - "Caching benchmark %s. Cache size = %d bytes, %d items", - uri, - self.size_in_bytes, - self.size, - ) - # Remove any existing value to keep the cache size consistent. if uri in self._benchmarks: self._size_in_bytes -= self._benchmarks[uri].ByteSize() @@ -80,6 +73,13 @@ def __setitem__(self, uri: str, benchmark: Benchmark): self._benchmarks[uri] = benchmark self._size_in_bytes += size + logger.debug( + "Cached benchmark %s. Cache size = %d bytes, %d items", + uri, + self.size_in_bytes, + self.size, + ) + def evict_to_capacity(self, target_size_in_bytes: Optional[int] = None) -> None: """Evict benchmarks randomly to reduce the capacity below 50%.""" evicted = 0 From aa24d2c783ad7f822e0e9a835a8db4be24cace7a Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Thu, 14 Oct 2021 10:28:47 -0400 Subject: [PATCH 125/254] update readme --- examples/example_unrolling_service/README.md | 25 +++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/example_unrolling_service/README.md b/examples/example_unrolling_service/README.md index 4cb39236c..628dae3ef 100644 --- a/examples/example_unrolling_service/README.md +++ b/examples/example_unrolling_service/README.md @@ -1,20 +1,29 @@ # Unrolling CompilerGym Service Example -TBD - -# Features: - -TBD - +This is an example of how to create your own CompilerGym environment. All paths listed below are relative to the path of this README file. + +* Actions: this environment focuses on the unrolling optimization. The actions are the different unrolling factors. + - The actions are listed in `action_spaces` struct in `service_py/example_service.py` + - The actions are implemented in `apply_action(...)` function in `service_py/example_service.py` +* Observations: the observations are: textual form of the LLVM IR, statistical features of different types of IR instructions, runtime execution, or code size + - The observations are listed in `observation_spaces` struct in `service_py/example_service.py`. + - The observations are implemented in `get_observation(...)` function in `service_py/example_service.py` +* Rewards: the rewards could be runtime or code size. + - The rewards are implemented in `__init__.py` and they reuse the runtime and code size observations mentioned above +* Benchmarks: this environment expects your benchmarks to follow the templates from the [Neruovectorizer repo](https://github.com/intel/neuro-vectorizer/tree/master/training_data) repo, that was in turn adapted from the [LLVM loop test suite](https://github.com/llvm/llvm-test-suite/blob/main/SingleSource/UnitTests/Vectorizer/gcc-loops.cpp). + - To implement your benchmark, you need to: include the `header.h` file, implement your benchmark in a custom function, then invoke it using `BENCH` macro inside the `main()` function. + - Following this template is necessary in order for the benchmark to measure the execution runtime and write it to stdout, which is in turn parsed by this environment to measure the runtime reward. + - You can view and add examples of benchmarks in `benchmarks` directory + - Also, when adding your own benchmark, you need to add it to the `UnrollingDataset` class in `__init__.py` ## Usage -Run Example: +Run `example.py` example: ```sh $ bazel run //examples/example_unrolling_service:example ``` -Run Tests: +Run `env_tests.py` unit tests: ```sh $ bazel test //examples/example_unrolling_service:env_tests From f26d394d862a7b06b699ff98ecf4e59af9dd85d3 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 14 Oct 2021 18:27:02 +0100 Subject: [PATCH 126/254] [examples] Update docstrings and API usage. --- examples/brute_force.py | 20 +++++----- examples/random_walk.py | 28 +++++-------- .../action_sensitivity_analysis.py | 35 +++++++---------- .../benchmark_sensitivity_analysis.py | 39 ++++++++----------- examples/tabular_q.py | 4 +- 5 files changed, 52 insertions(+), 74 deletions(-) diff --git a/examples/brute_force.py b/examples/brute_force.py index d5cb1b448..2f281d585 100644 --- a/examples/brute_force.py +++ b/examples/brute_force.py @@ -9,14 +9,15 @@ Example usage: - $ $ python -m compiler_gym.bin.brute_force \ - --env=llvm-ic-v0 --benchmark=cbench-v1/dijkstra \ - --episode_length=10 --actions=-sroa,-mem2reg,-newgvn - Enumerating all episodes of 3 actions x 10 steps - Started 24 brute force workers for benchmark cbench-v1/dijkstra using reward IrInstructionCountOz. - === Running 59,049 trials === - Runtime: 3 minutes. Progress: 100.00%. Best reward found: 101.1905%. - Ending jobs ... completed 59,049 of 59,049 trials (100.000%) + $ python brute_force.py --env=llvm-ic-v0 --benchmark=cbench-v1/dijkstra \ + --episode_length=8 --brute_force_action_list=-sroa,-mem2reg,-newgvn + + Enumerating all episodes of 3 actions x 8 steps + Started 24 brute force workers for benchmark benchmark://cbench-v1/dijkstra using reward IrInstructionCountOz. + === Running 6,561 trials === + Runtime: 8 seconds. Progress: 100.00%. Best reward found: 0.8571428571428572. + Ending jobs ... I1014 12:04:51.671775 3245811 CreateAndRunCompilerGymServiceImpl.h:128] Service "/dev/shm/compiler_gym_cec/s/1014T120451-646797-5770" listening on 37505, PID = 3245811 + completed 6,561 of 6,561 trials (100.000%), best sequence -mem2reg -mem2reg -sroa -sroa -mem2reg -sroa -sroa -newgvn Use --help to list the configurable options. """ @@ -306,8 +307,7 @@ def main(argv): with env_from_flags(benchmark) as env: env.reset() - benchmark = env.benchmark - sanitized_benchmark_uri = "/".join(benchmark.split("/")[-2:]) + sanitized_benchmark_uri = "/".join(str(env.benchmark).split("/")[-2:]) logs_dir = Path( FLAGS.output_dir or create_logging_dir(f"brute_force/{sanitized_benchmark_uri}") ) diff --git a/examples/random_walk.py b/examples/random_walk.py index bba6bdc8a..44c1a6f33 100644 --- a/examples/random_walk.py +++ b/examples/random_walk.py @@ -7,8 +7,8 @@ Example usage: # Run a random walk on cBench example program using instruction count reward. - $ python3 examples/random_walk.py --env=llvm-v0 --step_min=100 --step_max=100 \ - --benchmark=cbench-v1/dijkstra --reward=IrInstructionCount + $ python3 random_walk.py --env=llvm-v0 --step_min=100 --step_max=100 \ + --benchmark=cbench-v1/dijkstra --reward=IrInstructionCount """ import random @@ -39,7 +39,7 @@ def run_random_walk(env: CompilerEnv, step_count: int) -> None: fewer steps will be performed if any of the actions lead the environment to end the episode. """ - rewards, actions = [], [] + rewards = [] step_num = 0 with Timer() as episode_time: @@ -48,14 +48,13 @@ def run_random_walk(env: CompilerEnv, step_count: int) -> None: action_index = env.action_space.sample() with Timer() as step_time: observation, reward, done, info = env.step(action_index) - print(f"\n=== Step {humanize.intcomma(step_num)} ===") print( + f"\n=== Step {humanize.intcomma(step_num)} ===\n" f"Action: {env.action_space.names[action_index]} " - f"(changed={not info.get('action_had_no_effect')})" + f"(changed={not info.get('action_had_no_effect')})\n" + f"Reward: {reward}" ) rewards.append(reward) - actions.append(env.action_space.names[action_index]) - print(f"Reward: {reward}") if env.observation_space: print(f"Observation:\n{observation}") print(f"Step time: {step_time}") @@ -71,27 +70,18 @@ def reward_percentage(reward, rewards): print( f"\nCompleted {emph(humanize.intcomma(step_num))} steps in {episode_time} " - f"({step_num / episode_time.time:.1f} steps / sec)." - ) - print(f"Total reward: {sum(rewards)}") - print( + f"({step_num / episode_time.time:.1f} steps / sec).\n" + f"Total reward: {sum(rewards)}\n" f"Max reward: {max(rewards)} ({reward_percentage(max(rewards), rewards)} " f"at step {humanize.intcomma(rewards.index(max(rewards)) + 1)})" ) - def remove_no_change(rewards, actions): - return [a for (r, a) in zip(rewards, actions) if r != 0] - - actions = remove_no_change(rewards, actions) - print("Effective actions from trajectory: " + ", ".join(actions)) - def main(argv): """Main entry point.""" assert len(argv) == 1, f"Unrecognized flags: {argv[1:]}" - benchmark = benchmark_from_flags() - with env_from_flags(benchmark) as env: + with env_from_flags(benchmark=benchmark_from_flags()) as env: step_min = min(FLAGS.step_min, FLAGS.step_max) step_max = max(FLAGS.step_min, FLAGS.step_max) run_random_walk(env=env, step_count=random.randint(step_min, step_max)) diff --git a/examples/sensitivity_analysis/action_sensitivity_analysis.py b/examples/sensitivity_analysis/action_sensitivity_analysis.py index aefdf67e9..52c4e409a 100644 --- a/examples/sensitivity_analysis/action_sensitivity_analysis.py +++ b/examples/sensitivity_analysis/action_sensitivity_analysis.py @@ -2,12 +2,11 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Determine the typical reward delta of different actions using random trials. +"""Estimate the immediate reward of different actions using random trials. -This script estimates the change in reward that running a specific action has -by running trials. A trial is a random episode that ends with the determined -action. Reward delta is the amount that the reward signal changes from running -that action: (reward_after - reward_before) / reward_before. +This script estimates the immediate reward that running a specific action has by +running trials. A trial is a random episode that ends with the determined +action. Example Usage ------------- @@ -20,7 +19,7 @@ --benchmark=cbench-v1/crc32 --num_trials=100 \ --action=AddDiscriminatorsPass,AggressiveDcepass,AggressiveInstCombinerPass -Evaluate the single-step reward delta of all actions on LLVM codesize: +Evaluate the single-step immediate reward of all actions on LLVM codesize: $ bazel run -c opt //compiler_gym/bin:action_ensitivity_analysis -- \ --env=llvm-v0 --reward=IrInstructionCountO3 @@ -81,7 +80,7 @@ def get_rewards( max_warmup_steps: int, max_attempts_multiplier: int = 5, ) -> SensitivityAnalysisResult: - """Run random trials to get a list of num_trials reward deltas.""" + """Run random trials to get a list of num_trials immediate rewards.""" rewards, runtimes = [], [] benchmark = benchmark_from_flags() num_attempts = 0 @@ -109,24 +108,18 @@ def run_one_trial( env: CompilerEnv, reward_space: str, action: int, max_warmup_steps: int ) -> Optional[float]: """Run a random number of "warmup" steps in an environment, then compute - the reward delta of the given action. + the immediate reward of the given action. - :return: The ratio of reward improvement. + :return: An immediate reward. """ num_warmup_steps = random.randint(0, max_warmup_steps) - for _ in range(num_warmup_steps): - _, _, done, _ = env.step(env.action_space.sample()) - if done: - return None - # Force reward calculation. - init_reward = env.reward[reward_space] - assert init_reward is not None - _, _, done, _ = env.step(action) + warmup_actions = [env.action_space.sample() for _ in range(num_warmup_steps)] + env.reward_space = reward_space + _, _, done, _ = env.step(warmup_actions) if done: return None - reward_after = env.reward[reward_space] - assert reward_after is not None - return reward_after + _, (reward,), done, _ = env.step(action, rewards=[reward_space]) + return None if done else reward def run_action_sensitivity_analysis( @@ -139,7 +132,7 @@ def run_action_sensitivity_analysis( nproc: int = cpu_count(), max_attempts_multiplier: int = 5, ): - """Estimate the reward delta of a given list of actions.""" + """Estimate the immediate reward of a given list of actions.""" with env_from_flags() as env: action_names = env.action_space.names diff --git a/examples/sensitivity_analysis/benchmark_sensitivity_analysis.py b/examples/sensitivity_analysis/benchmark_sensitivity_analysis.py index a2a3dc56f..065b5bc52 100644 --- a/examples/sensitivity_analysis/benchmark_sensitivity_analysis.py +++ b/examples/sensitivity_analysis/benchmark_sensitivity_analysis.py @@ -2,13 +2,11 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Determine the typical reward delta of a benchmark using random trials. +"""Estimate the cumulative reward of random episodes on benchmarks. -This script estimates the change in reward that running a random episode has -on a benchmark by running trials. A trial is an episode in which a random -number of random actions are performed. Reward delta is the amount that the -reward signal changes from the initial to final action: -(reward_end - reward_init) / reward_init. +This script estimates the cumulative reward for a random episode on a benchmark +by running trials. A trial is an episode in which a random number of random +actions are performed and the total cumulative reward is recorded. Example Usage ------------- @@ -20,7 +18,7 @@ --env=llvm-v0 --reward=IrInstructionCountO3 \ --benchmark=cBench-crc32 --num_trials=50 -Evaluate the LLVM codesize reward delta on all benchmarks: +Evaluate the LLVM codesize episode reward on all benchmarks: $ bazel run -c opt //compiler_gym/bin:benchmark_sensitivity_analysis -- \ --env=llvm-v0 --reward=IrInstructionCountO3 @@ -49,7 +47,7 @@ flags.DEFINE_integer( "num_benchmark_sensitivity_trials", 100, - "The number of trials to perform when estimating the reward delta of each benchmark. " + "The number of trials to perform when estimating the episode reward of each benchmark. " "A trial is a random episode of a benchmark. Increasing this number increases the " "number of trials performed, leading to a higher fidelity estimate of the reward " "potential for a benchmark.", @@ -83,7 +81,7 @@ def get_rewards( max_steps: int, max_attempts_multiplier: int = 5, ) -> SensitivityAnalysisResult: - """Run random trials to get a list of num_trials reward deltas.""" + """Run random trials to get a list of num_trials episode rewards.""" rewards, runtimes = [], [] num_attempts = 0 while ( @@ -110,21 +108,18 @@ def get_rewards( def run_one_trial( env: CompilerEnv, reward_space: str, min_steps: int, max_steps: int ) -> Optional[float]: - """Run a random number of "warmup" steps in an environment, then compute - the reward delta of the given action. + """Run a random number of random steps in an environment and return the + cumulative reward. - :return: The ratio of reward improvement. + :return: A cumulative reward. """ num_steps = random.randint(min_steps, max_steps) - init_reward = env.reward[reward_space] - assert init_reward is not None - for _ in range(num_steps): - _, _, done, _ = env.step(env.action_space.sample()) - if done: - return None - reward_after = env.reward[reward_space] - assert reward_after is not None - return reward_after + warmup_actions = [env.action_space.sample() for _ in range(num_steps)] + env.reward_space = reward_space + _, _, done, _ = env.step(warmup_actions) + if done: + return None + return env.episode_reward def run_benchmark_sensitivity_analysis( @@ -138,7 +133,7 @@ def run_benchmark_sensitivity_analysis( nproc: int = cpu_count(), max_attempts_multiplier: int = 5, ): - """Estimate the reward delta of a given list of benchmarks.""" + """Estimate the cumulative reward of random walks on a list of benchmarks.""" with ThreadPoolExecutor(max_workers=nproc) as executor: analysis_futures = [ executor.submit( diff --git a/examples/tabular_q.py b/examples/tabular_q.py index 5f6c8b83a..da7419c25 100644 --- a/examples/tabular_q.py +++ b/examples/tabular_q.py @@ -2,9 +2,9 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. - """Simple compiler gym tabular q learning example. -Usage python tabular_q.py --benchmark= + +Usage: python tabular_q.py --benchmark= Using selected features from Autophase observation space, given a specific training program as gym environment, find the best action sequence using online q learning. From c12b77253c0a2acfb540ed7f4cad8cdca95f9824 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 14 Oct 2021 18:27:53 +0100 Subject: [PATCH 127/254] [examples] Add a top-level README file. --- examples/README.md | 226 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 000000000..809001dd1 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,226 @@ +# CompilerGym Examples + +This directory contains code samples for everything from implementing simple +RL agents to adding support for entirely new compilers. Is there an example that +you think is missing? If so, please [contribute](/CONTRIBUTING.md)! + + +**Table of contents:** + +- [Autotuning](#autotuning) + - [Performing a random walk of an environment](#performing-a-random-walk-of-an-environment) + - [GCC Autotuning (genetic algorithms, hill climbing, + more)](#gcc-autotuning-genetic-algorithms-hill-climbing--more) + - [Makefile integration](#makefile-integration) + - [Random search using the LLVM C++ API](#random-search-using-the-llvm-c-api) +- [Reinforcement learning](#reinforcement-learning) + - [PPO and integration with RLlib](#ppo-and-integration-with-rllib) + - [Actor-critic](#actor-critic) + - [Tabular Q learning](#tabular-q-learning) +- [Extending CompilerGym](#extending-compilergym) + - [Example CompilerGym service](#example-compilergym-service) + - [Example loop unrolling](#example-loop-unrolling) +- [Miscellaneous](#miscellaneous) + - [Exhaustive search of bounded action spaces](#exhaustive-search-of-bounded-action-spaces) + - [Estimating the immediate and cumulative reward of actions and benchmarks](#estimating-the-immediate-and-cumulative-reward-of-actions-and-benchmarks) + + +## Autotuning + +### Performing a random walk of an environment + +The [random_walk.py](random_walk.py) script runs a single episode of a +CompilerGym environment, logging the action taken and reward received at each +step. Example usage: + +```sh +$ python random_walk.py --env=llvm-v0 --step_min=100 --step_max=100 \ + --benchmark=cbench-v1/dijkstra --reward=IrInstructionCount + +=== Step 1 === +Action: -lower-constant-intrinsics (changed=False) +Reward: 0.0 +Step time: 805.6us + +=== Step 2 === +Action: -forceattrs (changed=False) +Reward: 0.0 +Step time: 229.8us + +... + +=== Step 100 === +Action: -globaldce (changed=False) +Reward: 0.0 +Step time: 213.9us + +Completed 100 steps in 91.6ms (1091.3 steps / sec). +Total reward: 161.0 +Max reward: 111.0 (+68.94% at step 31) +``` + +For further details run: `python random_walk.py --help`. + + +### GCC Autotuning (genetic algorithms, hill climbing, + more) + +The [gcc_search.py](gcc_search.py) script contains implementations of several +autotuning techniques for the GCC environment. It was used to produce the +results for the GCC experiments in the [CompilerGym +whitepaper](https://arxiv.org/pdf/2109.08267.pdf). For further details run: +`python gcc_search.py --help`. + + +### Makefile integration + +The [makefile_integration](makefile_integration/) directory demonstrates a +simple integration of CopmilerGym into a C++ Makefile config. For details see +the [Makefile](makefile_integration/Makefile). + + +### Random search using the LLVM C++ API + +While not intended for the majority of users, it is entirely straightforward to +skip CompilerGym's Python frontend and interact with the C++ APIs directly. The +[RandomSearch.cc](RandomSearch.cc) file demonstrates a simple parallelized +random search implemented for the LLVM compiler service. Run it using: + +``` +bazel run -c opt //examples:RandomSearch -- --benchmark=benchmark://cbench-v1/crc32 +``` + +For further details run: `bazel run -c opt //examples:RandomSearch -- --help` + + +## Reinforcement learning + + +### PPO and integration with RLlib + + + Colab + + +The [rllib.ipynb](rllib.ipynb) notebook demonstrates integrating CompilerGym +with the popular [RLlib](https://docs.ray.io/en/master/rllib.html) reinforcement +learning library. In notebook covers registering a custom environment using a +constrained subset of the LLVM environment's action space a finite time horizon, +and trains a PPO agent using separate train/val/test datasets. + + +### Actor-critic + +The [actor_critic](actor_critic.py) script contains a simple actor-critic +example using PyTorch. The objective is to minimize the size of a benchmark +(program) using LLVM compiler passes. At each step there is a choice of which +pass to pick next and an episode consists of a sequence of such choices, +yielding the number of saved instructions as the overall reward. For +simplification of the learning task, only a (configurable) subset of LLVM passes +are considered and every episode has the same (configurable) length. + +For further details run: `python actor_critic.py --help`. + + +### Tabular Q learning + +The [tabular_q](tabular_q.py) script contains a simple tabular Q learning +example for the LLVM environment. Using selected features from Autophase +observation space, given a specific training program as gym environment, find +the best action sequence using online Q learning. + +For further details run: `python tabular_q.py --help`. + + +## Extending CompilerGym + + +### Example CompilerGym service + +The [example_compiler_gym_service](example_compiler_gym_service) directory +demonstrates how to extend CompilerGym with support for new compiler problems. +The directory contains bare bones implementations of backends in Python or C++ +that can be used as the basis for adding new compiler environments. See the +[README.md](example_compiler_gym_service/README.md) file for further details. + + +### Example loop unrolling + +The [example_unrolling_service](example_unrolling_service) directory +demonstrates how to implement support for a real compiler problem by integrating +with commandline loop unrolling flags for the LLVM compiler. See the +[README.md](example_unrolling_service/README.md) file for further details. + + +## Miscellaneous + + +### Exhaustive search of bounded action spaces + +The [brute_force.py](brute_force.py) script runs a parallelized brute force of +an action space. It enumerates all possible combinations of actions up to a +finite episode length and evaluates them, logging the incremental rewards of +each. Example usage: + +``` +$ python brute_force.py --env=llvm-ic-v0 --benchmark=cbench-v1/dijkstra \ + --episode_length=8 --brute_force_action_list=-sroa,-mem2reg,-newgvn + +Enumerating all episodes of 3 actions x 8 steps +Started 24 brute force workers for benchmark benchmark://cbench-v1/dijkstra using reward IrInstructionCountOz. +=== Running 6,561 trials === +Runtime: 8 seconds. Progress: 100.00%. Best reward found: 0.8571428571428572. +Ending jobs ... I1014 12:04:51.671775 3245811 CreateAndRunCompilerGymServiceImpl.h:128] Service "/dev/shm/compiler_gym_cec/s/1014T120451-646797-5770" listening on 37505, PID = 3245811 +completed 6,561 of 6,561 trials (100.000%), best sequence -mem2reg -mem2reg -sroa -sroa -mem2reg -sroa -sroa -newgvn +``` + +For further details run: `python brute_force.py --help`. + +The [explore.py](explore.py) script evaluates all possible combinations of +actions up to a finite limit, but partial sequences of actions that end up in +the same state are deduplicated, sometimes dramatically reducing the size of the +search space. This script can also be configured to do a beam search. + +Example usage: + +``` +$ python explore.py --env=llvm-ic-v0 --benchmark=cbench-v1/dijkstra \ + --episode_length=8 --explore_actions=-simplifycfg,-instcombine,-mem2reg,-newgvn + +... + +*** Processing depth 6 of 8 with 11 states and 4 actions. + + unpruned self_pruned cross_pruned back_pruned dropped sum + added this depth 0 33 0 11 0 44 + full nodes this depth 0 2,833 1,064 199 0 4,096 + added across depths 69 151 23 34 0 277 +full added across depths 69 3,727 1,411 254 0 5,461 + +Time taken for depth: 0.05 s +Top 3 sequence(s): + 0.9694 -mem2reg, -newgvn, -simplifycfg, -instcombine + 0.9694 -newgvn, -instcombine, -mem2reg, -simplifycfg + 0.9694 -newgvn, -instcombine, -mem2reg, -simplifycfg, -instcombine + + +*** Processing depth 7 of 8 with 0 states and 4 actions. + +There are no more states to process, stopping early. +``` + +For further details run: `python brute_force.py --help`. + + +### Estimating the immediate and cumulative reward of actions and benchmarks + +The [sensitivity_analysis](sensitivity_analysis/) directory contains a pair of +scripts for estimating the sensitivity of the reward signal to different +environment parameters: + +* [action_sensitivity_analysis.py](sensitivity_analysis/action_sensitivity_analysis.py): + This script estimates the immediate reward that running a specific action has + by running trials. A trial is a random episode that ends with the determined + action. +* [benchmark_sensitivity_analysis.py](sensitivity_analysis/benchmark_sensitivity_analysis.py): + This script estimates the cumulative reward for a random episode on a + benchmark by running trials. A trial is an episode in which a random number of + random actions are performed and the total cumulative reward is recorded. From ab6d57536cd925124ffd3c83d5dd0f00b701f98a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 14 Oct 2021 18:29:08 +0100 Subject: [PATCH 128/254] [README] Rejig the link to the examples doc. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4bd12d056..b67ec63dc 100644 --- a/README.md +++ b/README.md @@ -97,9 +97,9 @@ In Python, import `compiler_gym` to use the environments: >>> env.close() # closes the environment, freeing resources ``` -See the [documentation website](http://facebookresearch.github.io/CompilerGym/) -for tutorials, further details, and API reference. See the [examples](/examples) -directory for pytorch integration, agent implementations, etc. +See the [examples](/examples) directory for agent implementations, environment +extensions, and more. See the [documentation +website](http://facebookresearch.github.io/CompilerGym/) for the API reference. ## Leaderboards From 9eedc0f5beb721a58fc9f80a268af830f883d048 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 10 Sep 2021 12:27:30 +0100 Subject: [PATCH 129/254] [tests] Add a benchmark attribute setter test. --- tests/wrappers/core_wrappers_test.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/wrappers/core_wrappers_test.py b/tests/wrappers/core_wrappers_test.py index 6e47d9fa6..8dc2a18b8 100644 --- a/tests/wrappers/core_wrappers_test.py +++ b/tests/wrappers/core_wrappers_test.py @@ -143,6 +143,26 @@ def observation(self, observation): assert ir_a != ir_b +def test_wrapped_set_benchmark(env: LlvmEnv, wrapper_type): + """Test that the benchmark attribute can be set on wrapped classes.""" + + class MyWrapper(wrapper_type): + def observation(self, observation): + return observation # pass thru + + env = MyWrapper(env) + + # Set the benchmark attribute and check that it propagates. + env.benchmark = "benchmark://cbench-v1/dijkstra" + env.reset() + assert env.benchmark == "benchmark://cbench-v1/dijkstra" + + # Repeat again for a different benchmark. + env.benchmark = "benchmark://cbench-v1/crc32" + env.reset() + assert env.benchmark == "benchmark://cbench-v1/crc32" + + def test_wrapped_env_in_episode(env: LlvmEnv, wrapper_type): class MyWrapper(wrapper_type): def observation(self, observation): From 3460c24acc50f6d9035259f568e1756fc9961e39 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 22 Sep 2021 16:41:14 +0100 Subject: [PATCH 130/254] [util] Add a shell_format.indent() function. --- compiler_gym/util/shell_format.py | 5 +++++ tests/util/BUILD | 9 +++++++++ tests/util/shell_format_test.py | 17 +++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 tests/util/shell_format_test.py diff --git a/compiler_gym/util/shell_format.py b/compiler_gym/util/shell_format.py index abf1b18ce..add683a93 100644 --- a/compiler_gym/util/shell_format.py +++ b/compiler_gym/util/shell_format.py @@ -28,3 +28,8 @@ def emph(stringable: Any) -> str: def plural(quantity: int, singular: str, plural: str) -> str: """Return the singular or plural word.""" return singular if quantity == 1 else plural + + +def indent(string: str, n=4) -> str: + """Indent a multi-line string by given number of spaces.""" + return "\n".join(" " * n + x for x in str(string).split("\n")) diff --git a/tests/util/BUILD b/tests/util/BUILD index d92b1ad08..1ea676530 100644 --- a/tests/util/BUILD +++ b/tests/util/BUILD @@ -85,6 +85,15 @@ py_test( ], ) +py_test( + name = "shell_format_test", + srcs = ["shell_format_test.py"], + deps = [ + "//compiler_gym/util", + "//tests:test_main", + ], +) + py_test( name = "statistics_test", timeout = "short", diff --git a/tests/util/shell_format_test.py b/tests/util/shell_format_test.py new file mode 100644 index 000000000..3d23325d2 --- /dev/null +++ b/tests/util/shell_format_test.py @@ -0,0 +1,17 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Unit tests for compiler_gym/util/shell_format.py""" +from compiler_gym.util import shell_format as fmt +from tests.test_main import main + + +def test_indent(): + assert fmt.indent("abc") == " abc" + assert fmt.indent("abc", indent=2) == " abc" + assert fmt.indent("abc\ndef") == " abc\n def" + + +if __name__ == "__main__": + main() From 8a92a60c754298cf2c217905c5c18388e87fd1f1 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 14 Oct 2021 19:10:35 +0100 Subject: [PATCH 131/254] [examples] Update C++ API usage. --- examples/RandomSearch.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/RandomSearch.cc b/examples/RandomSearch.cc index c1129f868..0073cd9d6 100644 --- a/examples/RandomSearch.cc +++ b/examples/RandomSearch.cc @@ -57,6 +57,7 @@ class Environment { } StartSessionRequest startRequest; + startRequest.mutable_benchmark()->set_uri(benchmark_); StartSessionReply startReply; RETURN_IF_ERROR(service_.StartSession(nullptr, &startRequest, &startReply)); sessionId_ = startReply.session_id(); @@ -138,8 +139,9 @@ Status runSearch(const fs::path& workingDir, std::vector* bestActions, int6 void runThread(std::vector* bestActions, int64_t* bestCost) { const fs::path workingDir = fs::unique_path(); fs::create_directories(workingDir); - if (!runSearch(workingDir, bestActions, bestCost).ok()) { - LOG(ERROR) << "Search failed"; + const auto status = runSearch(workingDir, bestActions, bestCost); + if (!status.ok()) { + LOG(ERROR) << "ERROR " << status.error_code() << ": " << status.error_message(); } fs::remove_all(workingDir); } From 6a5a0208b25f014b63ca15c6fa40f41cc037f488 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 14 Oct 2021 19:11:01 +0100 Subject: [PATCH 132/254] [examples] Improve the test for random walks. --- examples/random_walk_test.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/random_walk_test.py b/examples/random_walk_test.py index ffa0e0f71..028c594b9 100644 --- a/examples/random_walk_test.py +++ b/examples/random_walk_test.py @@ -3,14 +3,24 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Unit tests for //compiler_gym/bin:random_walk.""" -import gym +import re + from absl.flags import FLAGS from random_walk import run_random_walk +import compiler_gym +from compiler_gym.util.capture_output import capture_output + def test_run_random_walk_smoke_test(): FLAGS.unparse_flags() FLAGS(["argv0"]) - with gym.make("llvm-autophase-ic-v0") as env: - env.benchmark = "cbench-v1/crc32" - run_random_walk(env=env, step_count=5) + with capture_output() as out: + with compiler_gym.make("llvm-autophase-ic-v0") as env: + env.benchmark = "cbench-v1/crc32" + run_random_walk(env=env, step_count=5) + + print(out.stdout) + # Note the ".*" before and after the step count to ignore the shell + # formatting. + assert re.search(r"Completed .*5.* steps in ", out.stdout) From d9dd503ac609650a808579501b020988bdce7bef Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 13:14:15 +0100 Subject: [PATCH 133/254] [docs] Add new logo assets. --- docs/source/_static/img/logo-symbol-only.png | Bin 0 -> 113819 bytes docs/source/_static/img/logo-vertical.png | Bin 0 -> 52593 bytes docs/source/_static/img/logo.png | Bin 311995 -> 52542 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/source/_static/img/logo-symbol-only.png create mode 100644 docs/source/_static/img/logo-vertical.png diff --git a/docs/source/_static/img/logo-symbol-only.png b/docs/source/_static/img/logo-symbol-only.png new file mode 100644 index 0000000000000000000000000000000000000000..9933cac1400f9be73a02e1f0ceea36e145eaadf9 GIT binary patch literal 113819 zcmeFZc|4VC+Xj5osG>npNwx+mV+a|Wl?-K`Ng)}QA+v?%K~jm53?*bHv5d>2D03ym zVl6V$G7nj%@4Rli_u23JKJWMa`~C4ezu)uQ?Y-7@-{*A>$9Wv*b*=85(@QT`^2_H~K$|XPmM-hW&+|IdN3S^X0EL zQ>`8PF9JGZo3R#_`(Id9xkY?S_bp>!-YZU~ANh5p<(iaGjP(jjy}x$levKSeH+Gkg zJtTD5XT_n%dX^W%uQMy6#U!H>K5(~P>;Adt3kQu!9>1JtA^`72|NHq{td4c*kAHFT zbN~IPt^fJcU;ps|_8%WWA^s;1{^J9H#sB2Ne|&(tl}fTQwdU6ya2@@D*7SuvT8m+st!^?yh1F%*k65p!R-eosAVz6< zcaE@NSpMEFR_utdre5KTD{W(wyqpD?Lq1z>`oLRQc0>g?qMLl~U9?udu&eXWa2AK; z4~(y={tvcP!P9v+xv*e=h3RtU$xLaf4p*7H^m05>MK(()B$P?OdJlZPm4A)?I5I73 zS&P#rsi7eK93)t-c7AoqyZRl&HXPyAP_qB6N=|P)s66jE8ECUwDz3V$`~D;2ne3LG z?Y$iEr~)-)=#KTNy5uV1xT~f;Kf`-hOLauqw(>OG_uzr8U`7J?SEx5zbDZRzWSet3ullC`d}B_%lb8vFI= z34_J&kD#z_je0+EAc^8))?-OMBX6Nzc!ZO`u1QxVEB~usqGnRol;-J*T=L z7mNEaJ=Xsz*{*J9d}>^@@}ehmRP_ra(t3 z)nB-w3q`*=w&)z3F04MuvvJkd0J)r6W6wBzCsIpam^_>}l@D1^lqY`1f&94hZFO0= zm=J~qFxc|I`^9AaN40~xRhFV^C+6pAHWsT;RZQ&r@xH}OG2CZ+dp0JLnBZJs-NFNJ`M6#%k&7xXx`40cT3XvBZ;Kpvkh?r~5b_P* zl>KQG9>0_3GID446GdG&9+q8Z*JrzZT3RR!d@lVL%Ee;qWwMJ!-V)PN6g!rjrY5N& z_J4e;xl+2@XvOn!32p*wA(zE*mUw4^LFPIP%Md`B$dvrJB{sdvM7T9#?Tz|r^9JhGemCw(clEcbOwgw!j&m|e6g(DcgaNLDrW8TJ?ZPwvkS85vrCQBx_fKfw& z$SD8YxkfWNxK*`hS%)@EYP2-b)67NTy;;*~L>bB!H>!E~= zS!E@9yHIaNwBb@41agDMgpA>m$xCkB$~5XOsK%qXTs+{9uUe1dzIt%5OAkfx^}3tl zZ_eoBPbKd{CMlQa{L7^4w%fk^anzrWl`@UWT3s)!^p^ZMtcWjk+=$G%ILZ6Yhx73C zfokNXwr%a;B|JRe@yOA>3)J@Dk;^~Wb;c84cm<`)Rl@z`<2GPRWBjp#l}bTAu`jy# z#ua};I@{q7_R$pZ?(vztG-Mml#Cp+9`bk}tDhzcj#+IJ@G(ju*xsRjU0jcyT%gCUv z%hRjKySBsUHu%%)ygS5_wZ+t0kH(gBDVgK3QEQIvcIk&q#^ki_R4vL5(}~eqa$d~Q z0oO-O%Wmkbs$0L?*LzXFXr>#A&>S)XN<$+YdCoDsd_L<6`!BcfwY{tb+XlB=qMZa( zAoPtfZoIjm>qZ#zuoBgXEfU{)-Fy4=<&W#D?puL5PjGV^IeUw~d4&gh95v@TA${v! z!!7x2Sf7aR)cDxYd{RZh+LD!xlGpx3EMzwd3n_ksiM!iN1pWNpA3nrymPthgDR2@Q z^>B3vPk7wZv?>z?o-cN{HPkQvo%;b5c&5l78?uI`Ko8B6<^2|Tn?v2XAp;>F<u+Kif8#%f63`(u*EQnz~Xpb|#<+67|agl*joO)kmh1oLn!&9he)k|EYr4 zq_{Wk;ZIk(+jb;86>U3I{k?&{Z2TVI@oaD6#&$RG@B358zM<-uleI~bg=tNdr8;@L zrvfkHPCMxH-b7T<0#MPAcW1F{Z4mQQeXzd3*z>30H+mFv*e^AQR{@ayEJOt?*~*Em zWgiTP@Ico7P}=Vad994Mg{>mEnHRP=$(x1d6 zxdB@fyHL_agrnk~C}!{9avYqkmAwggHyrP`dfk27*0vp?c^gV06-&I)mK5PNXTk%o zq>ioX<*8iM^LU6_Y}NPm*K-GCuK9Agcud);_BTVkqE{_=ffG3|?SedM>2_@Ne5kGZ zY^ZLJY<+G`25Jjig;8u;_Hva=o!xKxEN?>#+o!hNpryF&S^8{qxvu&EQNQQs)qzz< zW#gSArpq@gfw@w+xo1BI4FhK?NaSNZ_`KX92v6R2Jb9nUeSV(Ab6ej^RCK^*B~c=X zx)YDgQM{rQ-XA_s1ME;@^=EI2tl4<-!znK zB^EdFs=6%kIDdFK?`vWQ@1GBA-sy#>M?T9lklk{k^N15 z;t`{bKj2eag8dbMxNlGCZ`u4iEm78f*@o7>==3wmafVP024TCkH9Kn){5W=B!arxj zKi~Z^GZh@9&I}5)ZFR;2(svVir)Hx|a~TR&c%XKItS^{chriJce`AbUR$i~LEd@H$ zts6TOI3qeemMq5U&x;G&p9$1dnV8%^@!`^T4~Zn1Vb6MCqhGe;@8s|L_8y#MVs8B5 z;&upbLvjv;Ukc|^)<;#^y3?m@Nz2^{1ZEbk`_K@|?k`i+5PzOFviNurc;iD>p8ZFf(J@Uf6?E3fp z*~2ohSafNzSlhO&E6fR)5mbDSb|Laj2~*BqXiYH?co5BD_HyCsNa-6{>Px zDK&IH;904ZL8jXBKxUA_Y{R8A^hGiJi@n?owHoM?Zi+!ldj+fjRxkZ^ot4cg%Xg=!J6ziKNxm1A8dCKtQ)%ANe7A5KX9p4QvPKhrh z<#o13zyLrFuUl)i!IJqTA4Trt#;c5bUVDd>D^Si}D_A$=bN>tNdp#{e0y*Izazdlj zYxyIu9LBvH#vYZ1oRQp>Wf^|TK2vMPE+K09-{TsC=vHS;o~s-!E1sj;Br9{bduu)n`p?xb+@)u{jxm2XhJ*9>qHorS^tC8~-s5lNSz2%D4<+?(%>{i`%vdPP~ zJ}7Yx59HK*!V}HG5#8ottHuS?slb0qYMy40dK3RUfmf3$bDRP9% z-z!U161K6hRU1lE1O>94#Y!|q_qOA&hLAjmG)3v4s;%H3f)eizaw2`}_{l8zx{kSj zJdkxGG}@qifNu}!9EFgU4P?g{O9WMYHq2CTo>c8_649imG2fQ^TQ9@#ugcvt>7xxw zaI2>W9tx`ZA>x-~>GecOH#z8;?bnhCMpAIgV#f^0!BHE-p5vTyr**c(#6`1oBidm# zK<{ctbq%9T1yg^s#KKqX2?Tv&K%xm2a2plsNQO=AYH#gZ_h2sMKCdJdRMnSq`pPF| z<4lG9(NTPQ1X-W#{@&Jeg+(6qbD5PoX~qmaDA$dqZiYC z3km`|9t1zlm+Nmzrt6C+Z*?7XtB!Zx_7wIzJR4J1M=u;%ytw-+UA3D7Ja8DV>2;{4 zhirCnTY`pEdY0$e=kxv2)*Bg};8bK=As31MX479ZznVHTEMO(77$-pYpDoFPuA0N% zw-l*v zG-ZR?q@p)4#k77g&I>ocw-0o=*@)BUs_u86f2(&uOxx%LWcn6DaS!`)ASigQA1a=> z-Qj84W9jUQobkH3Y(%>_RV{JUOfdix3sFI3&b!!2rfL z-Jjx}@4dbQ?t8dkRW=qgKQfo$?Wf{DzvCD<{in@AjKYCeZOvx3b#=mV6MXf#6N$b3 z)LD4JIb{W9-?65B+pjR)L-SDH;N!-O7v>7A8DXNG4lPO@khms+Vs&B@6O020g>v?w z48P)$BDOq0c_LHJ>r)uxj`8TF1+gKIiK`%|^3?i_t@?I~ZAWqre#Uu12+7=ICvL$qsI)C+*HG8}ofIr4S@Voc(E* zsyO$np+NuB@Nz6e_&QXA=fR_**xBb~#q_56bo)#N+h}@z!Hi=wPebqXH3Vv%e^mN& zw9)9lAkoa!9<9yLYP&X|5Kj;rnEajGWH#+3bCfC)N>7!`8kt~tDc1+9b+cl>RFGf9 zdJ2}Y=vk+mxSQ3JdMDqNjV&ko4c^HZpMPZ&wvJ#-uggNwP-Md`t|Un;xA5jFbaNr3 z^OzS+F*_;yzY@lMO$vT>y4@Xd4|Yd^nfeR$Tbq|Vc&XN#EIRbwxw)i!IAkiYgWa<+ z*;BP-LCMFdAwKr;E_@ID!!WE0U(nmEx6R_38r|$OSJkSVHZ8C8-V2t-g425MiX^Zj zg5U#8p-yKL<@$3nggAw(c5()INfLb$ zj}7~|QMsz_jLf7K5ONx6`EMuH5(st4UBRH7;+^{wnS^DfL~`(6Jl?j)Kc) zyH}{u$-nQ`yEE$baewVXyXs}MHf{*$H()ka>{h2oed4O}ir6q+S)X>6oj@JeF7vC! zF!v28F}De-e9F;X`JBaAFxUvT#1A3xZwn*2jcKa9LXvtt3bHlc6Vq0N_u zDG}vEk0mg^b5-r0ooj3xOh{l<93yEAvB&eVEAe6hD>(5lLo@`+CmiCx^oK7>8w>k; z%|@jXRNk{W*EuFCgdJC-4|Oagq_<}BtidRUad)^n3b3kCv_4Svnv)%wIg#YtF9qf_ zvQ1$3#<|gkf`~KUXD>EH_kknlN+3i3UL@ec!g0CZSWxpSb86QxyoT2BDxpSm;rBq> z;KiHIvi%>4SHcqHo|nf_IvK;JBX}B`6n0{UIT{*U@|~Dd3QcNiVM1+Mc}j)6Zt$;u z<&dRE(6^N{iF=NG`IbOP(7GJlPaQ8D?`HT22&_dG1q(r7n;R<>rM2_iPqJX1w^4Tc zK@hfv_fyqgT_2e;)P!QF<})uUFtjO@fAd)l9Hq#EQlJixfTr4Y>_LoZp#zcSX+QP8 zq<5G|*c~62@HJ~+k`;&TY0Qt%Y$$bj1_;7d*EA3!?U_?$R+W$*Z#vAuKm<__^{Y6)pS&W#l)=1^!Do;PdubleYR{_yPRa>J>N`< zQ1)e#7RQvyfrp~=l*!&6oPLYib-LdbV|mk~+t*&M(-T|l9$uJ<$gEv~S!kdm9!fC( zkS@O{rMp3s&LOP*#&@u5MvWfjQJG^v`v4pDacc^zJliIhXS$F-=gWfG<7KG=Y4$_A z&4b<|H}g|s)p|noWGy$zKC`udRC>;@_8UoK=a-=xO|v}L?6H>^)}xC1-sSlAm=NSi z9Z#z0v~HOuIoD0|hx;|y@$gGU%fxz8ng8X?X8!K;>ie+(FFf&r(|mSdwKhy??aM9z z7krljyVoid#En4+RYpF8Hv>?Rq9CIcE+%$3B>&2u=%)rYTh91uY8V$-GpD|xR7oa{ z2G)O%?qk6yHzRlO8gE@@?^eXm#rxEETx3vJXWy3AoNv7ohv|-Fn+5v9;Now`&od$w zHt95CR`wMAj;YosJHbMi!<1wFvo(Az^WekgIxZ~32ttS%6otfItk0zkG|L^<-k0a* zk{n4^tjo?aUY*`%Q)i!8SZwPU=^In*PF3qxQc$zQ0&G#P1UQ6V+mgJNDaX3cSWy4v zd6o2}bL4`ibmd~V;hGDfT%8rt0j-PYO_~}jitN+ZVJR=rMvcbj{U}M#$u*l*HRwD4 zDkSDqhXCFe$fb-G0vff|O!TEs`|lBx{fX6+v@>Vqa_j5s?f4cO9s{OYWTV3T(xM*B zl5rK#!`Lc)8$@0CvQxT{9nEqkOMlqWecF>S{TP7!9XrAQw?}#By_Y+&BQMdr?NiqY z|A5d+6Xm;NUYjZNP7cDWO$WKEXIil z{t(gU>v>J3VmA+6fDdHqbS}+*!T%!Ec`sz#Cx~T+Dr!D@jIO>PIh7PkVItH0z%7oA zG!3Zf!ex5dWn=DVyCwN!N8Fz&mQu5zPVFM6R$_Y4fG|o6;Mwy-^`!7)gEYB32Gw5O zSh#rcqNl@PSKzP1M4u>?JF*^Fz;OhA8SVlu*P74VCW-7=6HZQ*efzd4MMvX^n)n25AXx~z!KOCtR^9tM6Sn)OU z9*2dN8r^!0$e}`qHY*qB_I}#}7w;BYu+-Y$usS09gZ!P<1btbe4=o!SKzc9@vmQrKs(i%pHb@S}fbf5WW5@8nSISDxTs_4-35ii!@J_K`dKNV6^K zsFYCWw5VC0M=ANWWg?u+d#=2(V$~WzfZxICw8+`sq0Y?WCnb#)ZB2_|$X52Hm!*bY zgG3)bZ|@XtrAa^aV)CWtBG(6fY5FsHCRir_eCsUS3ZU z8**#0CYj2>WESxUyKec0fTLmCX*rc zWI8e0Pmhl{Aq3roB7x_c5N94GPMA1&sh)J4%Z$xjee?>>OQL5wrGESX?rzqMmkMDg_DCEB3nnt zy_tQn=0%9g8|*;#CcC;^^>w4CZo1}X#GGL0Ecr&>C4C|J#ZRuPUg-AOBRQ!SO!rUc zHR})nXPn0U@>xpMN%T+kt%#nffSR`9q!dLTE@;a!K0x=Mq9ooX2>~_^KiK)u+Xb%6 zQ+t$_FMQbPpgp@!}F<_8X4fS2yW zUwZn{+PU@(c)dJ>ZzvLd&c}Hu`%KopQjYfjf&98{8FW_H5oH)jzTJZ|HzKj}w7+{cQ6c29Gdjop!vy1VQ8^o-4rwXj`v83bhrEXhh6B3gKTbH5 z>fi{N77p$+?k@+$q~So|#cGxQ~o9lCC(P@0wfK6%9%UaalpauJTcC-C=nvU9E+2l-)|+ztCh75X;%M=#d-1p}W8qG*cg>6S*mFfZ$uI8W z=6WOAXMEX{INM(>$-l(H*HesrL1TrpXVRYIB<=lZ$`1Df{c3zYKgs zCN*1V%Vdjmq56HY=3euZPB&&ly3$DQutL!-Abc#NI;PS6Ni;#}Yxd5A0C$q}oURDj?X^_LSR}aOENL zuGr_RSLEhWMfMw@$LYe_iWcazZ<7PPdi-b5KrJPavM8w zyj7Kf$XYucP_)hyM->?Gucf>4Pm+0z%4O-L*aPTEiaE z!11bQmeXZOcaTW5?&VIrwI9QFe5?36YAs*xKep$HSrZ}hYFJb@3vX4_t9c!x)L**t{b@$ zqx?W@HiIjt{zgokV`S?ApBhi5`|qPCi#Rge-t|)t*2PnmjD?jCi+wa5XsoE2V4S?8 zkR%IgXfy6i{?E4p;s}unx#rDWAM%FD*=}RMj@6P?oWtn-vo@vxonw`epTt_Uyg;0! zLzt!+lYP@N<^{i|;ZoK|JS_uPMcHosqy^%F3-zASe(LG;u@QG?;H_T0P)aXnn-`#> z9YGP!kIx8SWx8i}I1CD1y=R8YJy$#{MAW*DWyWdJHR2xi8w2nk5D_jUHl762ZH1nb z+njZVg87o@GIsHVIyBRJ&W@Y!TqDW;AslF-(G^c>e${g_uaRvJC|U0gt}0-EUps*Y z^28HVl%m^btw;HkO>7z80lUT5A{gZw#tE1B5r;1}%&DIeRWzL5gmNhX;zm1U&W)P$ z&fA~u&P2R(`)DxV&akH|u&vEvTGT4gC$B(u6XHb|A_TFi`bnzg*P|75wJPr|TU1v7 zm@HM*2qQS(9f^=^b%yA-DRLtzH9La3m>yi-a%=a0g>((sowkr1ywH8dP#z1|SlD$G z%47wU$<Ncu z#O1k~AE+PoZ=9qj|?b6@CnC@}c@!{9LPIXP&{JCwn%LhU18vWu(J9~$pt zep>%*crSp60HWHIZ)`4xsY|m2=s%oAfV@DB#_iwPqfT%+?z-8uzsLC0jSG9>ehELq zp8n-|DH^6jpcLd12)9TGPu1KI*^tLU;t2u?;WoEAal4G~{nSHuNHr6wsUd;2 z<)}XbNGE`PMg=Z#2DhPYdR^9~v(e;8)mP9fAlHVnzw}cRZ^1GLU#9f=w@QVPANkfJ zfgpe&0etfYv=|}Yd6Bd#Dz2X?lGYc~MR;IUbbn3Ub*diorCw+SP3Sc3#aq-E!@J!Y zPSXfW=v$$|d+T+2xGxSjrjKR`$T;mQ#}rv z{qZJ8rnHl^AyTs8WYf~din?jn)WKm=}k$4zaj%}l?@Wb*Xs&fj0Nw|F*3 z^r_f@)nJ!mlBv^2;o^EyIjEnhHd3eb+1q2hb^XT0Mb1<{R#q$o_i07z-HTyia(I6W zCr4iRYzxxnEJWAdlgeC^3OZkbECdz14pr<~fzMWYOT!o7=MdCZp~H%~KmSmxJY~PP zesn2f!FtrdE}?;e!MoWg)A(96gUKgpIF{J>4b_vlcU(XbyBMuGLUcv?*C+J_a&QNC zV)5(cSiqZ**v^R5?DdL$YUi5>7u;5zT=wdn*~wd4A*9r){X+k0c)xwZnsj%274IW5 zh|i=y3=Z$xOq_o@+2U}MuW49DzMznK$A2bm!JY+UqN`^XiT3wCbzN28vxWB((>=AG zRMKD4&h-I8UA?3b9kcq?b^Xjy zED=w5CQU5(K9Y0GJXsOES*VMO;GTnS+h}UtTu-{E zI{xxN8g%Q4PwUr$6#m^igTb&A4GUJG!m>zo^t3+HN4^H5tC;F{IOlWRi}s#T!Bc^5IXMfM-#SxArndBX|O zXGl`@ZRkktr#|)(fzAc$NRr4CO;+EWv>wuz{F$P>6Y=GxPWaj`N_XlXR0s#KuXQ$X zMpjBSy|3hxHa}QgFxk^5xE6ClW43^kOO7-BUrH&S@JS&e1;7n*3tFGR^vj;7^P^wt z%y$IGyWYYm+wt1iPCelIDnEu`Df300p60@IC-Vb51uluFPHE%u3C3w8=NBjGZDT4o zupq2sZ;>3HHfg@r|I{q(I@m?){f^k`LEPV`9#usH z#a)_A0L6^&{;E#PX-P(Yy3&rM8fH`-Id>ITGR@DlCh^&q$=!c#ubRU??%yhfbb_u z8%8xK6c2j16V2h0mW3LwAnqz)T%GH2H!k3bs__y>V+yA9#VF3C`WJ}fyB5JX;6*B&EhdJLu{T4Wh{ljOEMm)mdzM&v4r zk(HCgJnYDRPGAYuJFA6r+C8gB9NNab{vEVY`SoYdd=PsQ~^rOoArJ{i;Sa?xJwC z82LbNRr=qq85JR}$lbVVjZ-v2+^1-oyuleZWWhrtcW;a)16an*FV9_Jr3QUtPa*r{ zeYch=&h}F;!pS20b(~L!FS|pkV}5EU`hKoF?X>B)8qt`H_G!;0 z7y0*yP-?`9@-IiE(HKr8u_jGw{XjkoW(R`?Ea0epw1OB)QP}8w-16MxLg8ez$xXEQ z7jgbkD{{9KfugtG-~PJ*}}bi%WC5}LkZm=8X?$;+Yp&pH+C zeK}klDbC^;|7b+|xTo>)0Gp^FDUBJKfWh{~E@peC@S z!J>T~Knc4_sYM(q`*u@!jVdNk9fXWXH>w2~>!QUV9GAeGfa3K#%OPO)$246d0$l$2 zzhbK%z#{}`0q@q@r`sbjZ$?J?^2ZJIHfffj8x8@3vjjm^&xrkd3TrmDbHJI*_p_cn zwmEp2C$EXCT-QH&d3HVUX;>1lMIOc0NAgU7{82b-I6KScw6+rI(ld}3TLz_yMsnUq zU>*`Tp-#1|lDvs@4eF$P^ukoZ#~BP8hsz6?#Vy>Sf==mP3kjcq`2JhhXtB1Y-AJ=v zygN4fqjxzbj0_Igvawy`*~roq7!`HKlYZ*CbOXT-2VRz;lWO#^&8ne^gOfjRkO}Di z#}~M%gHcLBj+iTs6HW9L==Hn)QL_G5{*{k49S$DFf$LG_U6q6mnsJV`wI31$AjEZf zE@*J}$xSo>Ss1FYwk91*lyEDWlD`bdClAO+xrOpe_yOke0^lYLijoV4$pEk;(%*#| zZK;|8Jhs-%oHysn_^ob|VtL;i#ufuAOY|K2;}ZVmx%ChwR4NDQkF*1PHrA82EhY4j zvjH26V^<7e*q2!_c+qSvChiY89T3jht`Yp-e6jSlk`4!(r5t^Nn^|sHP(+-rr=zw| zi#YJ}{VYQhtDPhfg0CjriTFvNvbL_PCw&04jOU_pJxl68G}OYN79gU%7U7mPbPEww znQnJTx7dB;*qmVK&NHyLFi7g`qQY7yNq7>+K%ppdMIORZNq$P?!!CBpLhO~*PC^_> z2X+_!$&mK|>_Jj6v&ZwllzRULGl}8lfZpYb#w`LG0rI?vz}_Tn>o;EkRS*Ailk`DE z8hQR)c)nS^K|zr-Y=|hH0v8)jhI$zX6~RsPp)AsPs3y&!Gxf@EurvtJIf9STN#$2OREWIq0+xk8qr!9-9FI^ zLlNKMo%PmGu7CBx0Swcfby_6Y=iwhTPvxhuPf8GZYy}GO-m{;@u_uNtt!*bk(3J&4 z@7x39BXfsT#Ve^rgDiC${@GVy9YDpN!qnZAA|QxMY1)|OE(ygqM?od~86gDWc&pIP z!O=Xn=ZNkc_mpqlym-|xAmRekUADua{KW_Akl&zj0m^GX3xq3s@VLlaNb`E|se7db z!WESOd1&kB#5x?_G{XV`O6mdRpelTqureSU75lkgu*DK-O3`p8Z=Dta`~Rxo@Ect3 z+fv;DcPW=tcoD zDV_3hg4nYMn~R{g!fUvsfA#O7@K!^o0hIkFOpZ&(WJ)I-dSbSuwL$(dRk^drVInegM!DA5Fs$5ODxGI&%n3^Aqo?p14eh9O0L>R$a z>$`qvH+5gr!IH`c0(hIGW-4Y!dac#VH9Iv~=jUIP#)*k@ zBlL8&C!MFwbzhL7E;KRE#`eNLL0! z0ejltc3vj_Z)!i$xR?YRga7RNuivBF9< zeW7D2*&GW9MOrYW#hs^HB{kclX~DqcHcvpFo)~q0UuCprPKoUOfteQ<(#M8;0Xvn7P6KwEtl~cnk8cMugo$vN~vATe7_q|H`UyqtvJ!#q^d^LYw>_U2iUHksY z(EV2$U6m4)=Xr|sn{^p!Qgwq#nQ%_L5IAv`tm&qhkSD21CN!Grei{_~y-xrpOB!`^ zG8tcLR~=-^>Jz6&cjs{k9d8l?B+P8~_+o{-M#)aw_iz+e0;eW5Hfv zJC0Y155FMSoF)@anaf)hxkvnT;6}=T+_j9CCc}fO-pb zM@O);+=IiO@nSjOc>PYrEqpvk_ySZ0E#>r$Pcv=V?W@ZHEqc4`L0 z?pOg_7^I*ULekFFSE%ZhTq+#{$ob{DdEm-;f_4p}ULcX6n08!ZgdJ=@Oq}^0T)ZgY z{u*w4K;N@)26Rm)0HM9%vxGM?7;wfWA%i6j_kIXCTr@U)EdKANfND^(Ae(v-`g?{w z$_F&oL7nr$n&}lN9sY=*V)iwN3_u~)7{KhMt*!-PnbPElK&J$OP9U6_`l3YoAjx!f z#QrC}D!Xxr#qlPbGePNW+wH#t=FkBvP!?4qRoT;1RuEMYEj+o>!d6*^<)6Isf3gbn zfI#B{BHgIKZ|)P_UnX}GCVm*14%d0){Jt3Z)NLNp{5MeD3SB~xLx_LLdCmdZ)E*(L zD8Hh0ScW*h9Cl95FFHT^(58-^V)75Z0c==45Dqi`uuv<8p3ap+b|gUD#Ug0q1~1LM zRapWKH*0kG?fE!Ay0W&`=jh2*ZlU|NVA6mt;FY_#xVD(Cnlx!rs`G7c(e!7^c&EQh zZZWluYSOjgY>z+I+Bd7yY`ddXqUH$Xn$^D+=W0hFt>fWmaKcoaa0v z5A5)(&0C~sjrsL>hv(AeU0$OgEJhN`KV%qc zkSDED+T@DnhZlc$guKXFhHEUF}-*0RR&*Lka`fli{AGD z$_+;C(@he$27yz2>2kz|+$>IR`#<^K=N6HRC3fgoJ7Yuf#0l2F?+KL7JF)W*+14?_ zU*E{D+`J#|r}bT(H7_;OY@%on2x)(Zqjin{7V(RmG^Kg&{%5|?1Kt|0Hcx%&DFsRU zi9 zkxFjjyZ{V-ch8Ww5gF((;6CZ#KeF~*d5gnGvqjIvU_P?>x8*SEKtNc6fUrfQLsa4; zgIU0QeM8`I_$FbgX10eX(z_;N`l*!WOM4RtvGq4h>ujf*0U8@k8$QOb5|r|y*7{BX zXzIM}^SxqF(7nd6pdr;sbmX!VC)VDM%yb5HZvsf0e)hXB0{WXo$>R%SIpyE|1_4+e z!_E^gvO09{AjHB7hGq$2TppA9*r2TB%X8G1P?-7eHTJW z$7QYNV*MLEIK{O;FIPe1lKl(rI8DK)7)UiL+mTSFJ~kt!B8v0?QKVC7UT4Ac)6BRu zmVuZkPrzZ|5^D6@-fVCPur#L7{Tt+0K(1QOPuY>+d=92q)lX4@=%9wjD1@6=v4wcA zXk9M+&vDrQU|5o?3=0ekPI|N3O^(giDbHD-TYGq%&?l7!bqa0-PPjDx4NFapd5~@Vrs?;3 zbY=WGKeFN;Dnn}O)AXADjc$l|waH*>d8V#zYUhAd#wQkG3tn9KEC;o{%&u(eN2LMj zR5L&Hn;PrxXHlY<#anm^P@(m`n|?+`&2Y=U?Yt|84kjZV7ti*|b-x=ND4LJ(nvyB0 zsP~VZK2VU<7TV)wdPus1f&N{!_#ZT);iHnzbvTMiuvy?SxZJxe+;{#LX<+N(8$l07 zo8TpeyYn_X(kpg5f3rJ2@eQ$~@~l`WipR5@Hr1Ikc8n%h&&}!}6`K9Tb{9QJN2BEm zjd(RsuYcg!j#Q>W%b6HAY7p}H7E<8;C(l6tqQ17!KEA%VDvBL*GDMB(ENaPLjApF| z_#NBKKMpHh_SQaJaZEr~%cJ*+Ho;AKCvQ3*T>Xe3Gki3%>Q1?gr4A(tNGr;|s-Wu4 zG}n*D$`;klw4Tu%YDsNNX2rIA4b2Yv!BnK1Vm5m6}A z4j+P@8bbyiy{%%prf)C-+C6z%I<{DU=%b*=JYuq_P~(emc_%sc1kQ%~vcU)QjV<&0 zl`bO^AOanINkRW9(ef8;PRWQ<#{UZErg4aAe{4zp8B^-V+G+zMYNEooL>3Gmx|rq| z?=LQ%FY}kk*Ozc)g}F<~O#A@C)x7weP!|Z;blWlY{R~~{{zpE`pM-D_t*$ri{QL44IwQ|;bI~v)p|b`} zIBS4;%Tt`O-Y80GyI*Mll`mq)m}1fZ;wcKVs<1F{rAsU!91bm*p!u>71n+jKq%PAj&G;L z$5iS!`{|<D#zj`Z_T_uxG@pp-Qy5x0=FqEUPU=ZzFh4bJFK0fQCsA9UAYea z**Ckba$a1+G3X-0njxL5rk>U178i-m^j#9J!Nds)W&=!k&- zbJ)JE!=dLdI~hCDX%LuMG|$e!V5QtSFBa?~8W9Nr{ui=2(a$KZL2VZt|D5o7KR)e1 zrl2DcM_5jRDRp^uqa$iO;%`|o@ikyYh8A`B0}B&BT) zWI!1Rk4bTWTl_D{(7QZK%;kGf6#6a#Bp2AQgte#t_e5X`YoBFP$*6lRhwc>++U&Z}>H+fk=0&4rDtss9STIvSIm&&+7Hm_CbctmZ zJOT464NjaHKVy<4O5wf>nw)29P@$Gj!>4KDz3fV%B25?;djf6VNcWEb@D31~i}*Wm{dcf^#K0v>RK?4)1+ zSC#-PD(p!{mw%`~-2Woq_lD%thUujtN^J|zzPMFdH8uFm%3Nh6Rf=@u&WXR=&9E?QUE!364%d2qfsBr3o#^DEgwl#2lBb=;$ z2FXfgkd;|(E~on8fOK5^M-?b3)D$657Ct#>GQf$B6}bkw`aC(?7pza;MRdAvqT2sr zvX92J&)owLlbm3?-?@k1oLsuQ z6AgEF;Amyv?5}%%T(^CY7G4SpPfAR~bZYkCVn<*wxhnDyHnIzO<|y(^iPf>zqJ>?w z<)6?chjsuJpPmr9 znie>?yLszqufevKLaP$~2#WCrV~^vsUZtD=M!Lt^Lvio*&mZL6fllcnS_rG4OC_Wj ztGrt3Suj$qRPuQpeG8FGBp-GGw65gI3`G3CTl~)RbLddX!I7AL_3mHi zKO?L2GVgbF8Mo=WsVUdEC*_v&!*O#_epG$yw!MP%*Kj{BRyMnz3Lfus&8P2YS4!$b zG@;S4(eXy*cd4^x`pq+&b&c9_*`XEy{O>tpU4p6EBzM!3f0_d*2KccI4?4XS@SM+r z%<-JB9?QQ1r&ow=n*k&77nov|fYJIs-T1U;*~UkKf*1fkm2ixFMW;R-zxHavv2Hzh zrU4L_+m9~|!9xzc>L2I2U@im^=3&56-KVoa`(I>m^;~=tFtk6J+Fa>e*uSDFQx;l?$$-S$UkGQL zOAN^7Zw7=M5uV;go=1*g=E7e#setYqa-sp%TNsI0=``v-B!EZBQHS8^R35$3VMqtNvR zM+_aPJHVOY?iwUGlVsmK7(tJV_#4^QLJ^aNrjMTF$6|s}8N@i;EtommD^wR5*-yPL z;fM)TPoIKcxNyVC3OaVL>0s=<6AG6TIG`25Ap^+E2N}3yjuuZ?ETg>lC0?By$=fhJ zQC;lHP&&qb3@c$F{ z7bZjc8l0s|rek&j3-M7%sGoT`Ec=g2uKK%@f9Y1VFixI=ON={X_hBQJ2)QY9-%c_R1i=Ux`zJN2xGoBGwmh_RD2xSY6 z15&~H+y!Npp?1|q$5&>`^TC=Pk6E!(=)gyyeXt2k)No`qGbvxLavj|fpkwx|t^YWl zax2Q$g!#}S{)WnWIkjhF$FY)(hai``-1`K(%|R(Y)qCMMds(&Ct$ ztTU%LoR=dhU3QxU35AYh;P(vxRftM$f|-wZVPrKhLnIqHx_)l(cm+}~5RQS+!H*0E zQ)^FsWBgnP=+nPQSV>CT6cQ@<9ynkR4+)NNf}}j`c)jx{${ZM2=dx}6AII|0bKOG07BmYuN^ zV|dR!>iI6e-}}D*^iOrqy`1};>s;qL_vbg|vuZlE*Xc|@eT0f=Haikllvm4$yRyOd z{`^MW0>o zF!8{A$Hd$+x>ykD#9$>3+kTV}{@5~Q`oMiL!iWTc`mdxtPn)=ar)M?4v;Ujm!Zmg0 zVNijt5B0%abGUZQ-=1K-mP;dR!DL#^(>V5CXRn=$2v08KB6czpa>ypms zW&DGWkGZ=F&e=Zdu)5Yngy7VcHta%U^o~xF@-#SaF@Uyw z-mU-R%GJn@-AS-X2=ixjMSR@XVuRGsPQP;6Ls}4a-U(H$qfgCGcbx9{j?~f}*tzSc zZiqJoe3x>~OCe#m%x%`3aZ?u_WLcg(J>i+Xynaz>O>&o2&V7)Ra*}h&#>#XSCy*@o zYYn)w%ad(mR|mDRD>~4kiB*+&jm?5wkWJr8{AtWv#9F}B{y10tUfo(5T73S+8XQ`d z%KtX@tmZdWh6cTH#C1$8D_F{kxW$Sn?@rAqUHny@%)bs3+z;Dx3L4KHxq1?L^u!rZ zv7V#ISsY_>SbG$TmY@T{^yu1=#Prrp@7uq6p^V=0CE$ZMB>VMmAc~A+$d&NO8DW=B z0DHA+`2 zpEVD+;J^GSM^tYv``_rLt>hgcKr}SdFfuM3_{IMcN$sRcLOk#q&6&h&voIW85_dQH4%C#mIXYkaEQ zsyXc5%VAoTdTt@Do6G=O>ysFM{KkPkd- zdNMz??RFj|LEt4jh?@ zmo@o0_W0&A>>NH>Uf4!wC83rl%7i2cEjIape!-jjxvB3j@+?;0- zL??;l%oq%BdjMT*RQo>GEkz}b#LbH2#R7d>8YE&JnG<|%MO zvF~r3GF&xOq$&X;xl(#vgu&)@I4WY&6*f8`q7xDR4O?I27-Y5kOf0rtiVt zAR*KDt1(+zH<$VQrhYymT4Zgr=EIAwPk@5Ot4xL%^H!;0X6T?@wU3ZYXO`KQ<}TDD zTIf(=7F}y(_t^}I6w)atB=uQ6+NR%%uvNJgTp1`QRa`?M_V>2>dB?78Mdf5+ggqlo z_5QE>N~Z|udXP<4#63X%86VJ@vz(jiT&jlR#OO#E&oRt}>`KpQeYb6wlASg=)p`iJ z1HHrJ%wz`u%3RgO>l6xd_Y@@B@3(bWJ26z+=)Nw4Hss(od84mRV4>u)yAEpJsdt#l zY3m(I(o}pE#ddARjyw|1yK?{7BDt|CZ7{alNG}td>>uXl0CIqe#ZT*proW&Z@c?k; zKITONl|s~aM-E@Vvmg2_ZM6(E2T4l;Fh=*u>6O>`QvM6RJb{XvccOirnk~kk} zh7{Wfdqd*DyNreo&S~dswJ}=F9bn_S&9~7ur{cz(``+cKJcO|iAb!R`^K{2s%@1*i z8G*nko}<%OkR+}@H_LHkwLbz>>1U8MIs52$*n*kh>>PtCMV%YNe0As3gyE8@85QPG z22TE3OnJMa(huDn-d1p?1t{3GwCQCOFHgMVtAr%6NN)o7@!2z6j^2$sy?iM{fjdf2 znEbWKtWnZj?-XTn6IfbF#A*#VmTK+x&~8KoYyhiNr4x81$>e0c3v|Y;p4==fQPC#U zGy*hThz7jm@F@gY(cCpYPM>D#@Vd^2g<)~QUm=$mksW($#UeH`w9O-VMBhniOLkHE z?hhJV9+qovoX^Koz=WEBIE}5!(6B8kF}Zk%o58FweefYNSr~*j04Y%DR^p%=$uXb{d`2VplYiBFFaGp>+XU~&z|AP@ zk>%_u_}7M(dsV~F{u@t6kUEd#wyR(rAom?O?k8r_K`tHo?&qDQRtwIT-enlO(=4sV z;+@;lbqtfZe0B}>J&f?#wHmh6C-wgN!^BoVR=2vQ18+#D=n`@FIYe&_fOe(q8f{BY z^zzY%(h`+UC~a8XT=j|cTnsNk_l>oR*_&`I0spv@9mCs~Z|~@$paO2>dvLJV_+r~?YnK(+;f9Y`4b$F7z2)fj!1C2WEeIk2xyaxr-z-sK!WYQAipy7 z3}>mzP-c%d*zVrlyk~_Bd9Am%{|6qR7Zm@fv*@AtUyy(qXSz8+o&$&zwlvi>Wf$q= zloZew4^|eJ);mEJh0eWj`TU1aHxcT4#D56C7MpT(3fWKO*^HO#P2e2`pKS2GnF1yx zFWOlgf+#?BOQ3jK(f)TfD7w`_B1|WNCUVgziD4M=&hJA%^2-%f#G-*d^r`xOFAq0X zzys9*Ac+4bCQ!FemAC}C#W$b~j#?4VXG{Ru%XQOf?s3>k9qjPZ4-wgI*pYHQqKWr- z9Llo2O{Hb0#|@2`##;0elP}jVL@v+ZW{hv>H7^K6_uDX7gOgFf zwT$>;KPKjJXu{KKY_ZdmR*lz5V#FK(Q~6wWzwjX9CE0={x@%A>#!sWOZn|LjMc0cT zIrwca`xsT~f4~iusnc1lSQr)iv%c(bTE_xz9T!@Z{&xCMDm{D4)0>hs8g3&vAF{1N zJBlRd*|W`Kt(~_BwE5g(h8JI(QwALuKVO%xfrc^hoaQj*phs{2bV_>COF_#@@@&57 z7sw7T1%XH(H6IfL+>@*~!6da9DeN@Xa(VD64J9d|fPKt{(%Lg%cv;Cx#*Y)e{%-45 zoI6m|j_7icDt?j&Jx-&#Gc}mIF&30T)xvgT6 zzt;e)i^!e7FHiqOG>!musaj4cAJQOtOhPhI;O-#meG~k3n%h$&tiU^cenn|Oy9W? zJv(i`pLh*WMo?6zAuOxWmfw|(SJp&bxD0(nPI@_o7pEkxQ7iM?amuL6miSI+ z^Q%9L<3}C5^fO|9x}P@*j~fr94Ci#@80dv`Mck(+4HKgN=_cTHBEB!)7-?IfdN23A zzomw~*a2BcZABPyTsCEsU7^>)k;Tn98RsaiS3&QsKGbhw^#frNFEslmcMXR>GLUA^ zQylKJbEuQzJR*>hqrW5ntx?4euG~X{Ngaq!eRQTl6LgLYgBQ2zyPFTXZp1l&8Z47$ z{2%NNFbmzl_lSLL6M7F-485}<1!fiPkD$YH&U;}|>#8u82I;@gSt^|4{nMunLH`57 z{{O_&zdI}njG=#s1yok25jmd?pnT(s0*mc_LgLOYIT|lgDqSHUM{v1)%e;7)q&(^! z%KYk)L9!43h@UKzV-ck?R5EF;A5w)zRA>9AB$XU(B0B}*n(19|-709KKTHgRfdG|b*=>vHU9b&q2P0ZWK zy|+k9YHUII-AF8H@$A=5ibwF}f zYRt*4zx1}Bv)tpx)_UXmrC*2$7m*U6xjyz_8y0lf&0+@^w|%7G4e5+b#1SiE*GST5 zU~C#kQZKx7E?ikziYU#KdsVZ>rxD=umE$Evp5xU4r#iZL{qUjHG^txi3ADVC#Hd35 z;ne~-^vr9`EpX6eHq9NDvakmwD9{NIr3iQFUhn>@*ApwBtr6Z&Afez}qqze+_!)@O zqs*{-#DyE9r0fAcP_b{+eM>W@L(tqHY@RPyLzpf@MZ0&9dJQU#|H8zrw{ihKQ38sV zOf=+ZiHXeEIn=eoN&y?;k=y(~-39cE(;JaM)9bY=_TRs1xHaruW?*q@8)x?bXX(?7 zz>cCPI8AszNUp<`m1Q%u$^Ac0m22d;hetZ?TOf9j9tBBzsdxxW*~X=>&o-64^01?l zXJN3sOxn#axHQij{_r+a{gCF$nQjrVA`@*@L_(*LkwHaAj0Cqe|-n zBY)@c${G^m$ABYFcj6(y2|0ZAu4Yhh#JIL1p{fnbkm+ za#O7S7ue(;+_SS;Aduj--_pvB?Nbk05{s`r4$#l+$aJR8!C4i{Y23slWPmGVH|Z$A z!%KYSb0TK*sNXD~d8aA07|}`r$o|E(6VpNIjpQ5F0LuZKuOf4Bv@C{&#k6_;7`a`g zo3WqJH?)()Nu(H&?&XQkjX{H*)^F}`$d8ynV$6H?PdC8-jsQe=6v5mt)r^%>7zFJ{ za!Ci0n!L{_^K*NS4-V-#HvCK%yktS@^fYLqo6_$Cu+8}CQ1E+abl*A`&Uvpyl)CJ+ zV8QG}Tt6}FY=Y%LRHZs;29%i0*_X1y+i^Ck;w$NHAB=;(>=vj4cTY-efeiVK}U%@hFh z7nq0n=^0q@T9+jC-?D}<`@4v!E&^S-2g{;1iDSPzm*B;iOXpB~ZmMoQ=C^w6XD zc7qJL33`ouE`sS2e`qXlL*LjxsW!a_(e^pL2QjCAsC^f`zGaGt2i=CW*Q!R@KhnV% zPqQ5o?P(he^!{Z6>HnqmfY6>VEVUHh2O7S|4Jl;)E&o66DZR@ETdm)&c0~V!IN_)N zP@bot-wWTj5k_M~qy2)>BHB%!r^}d#$Q1V+?7DJLVl}r$Xd%K!hu)}w=uPO&q5Vcu zf7%;cY(nlsfLm!b@7yG3he;fT5jV{(z%dXz1E}X7z&jikzwz~)tHwHdn=ZWv3`wG5 z&uVOEV)+N3(Zk$7?aArA9a z#y<@us8;wt52SHT2YS`xs5=kbOZgZz@2giZvZ9;avjsa83uI zpmu|k{S89f0H49he%hxA60$3EU>3IMJ!C3~8A|zi6zPhwN)Y}c)&byZiXX8m!P0HD z-8B$oMqIUEB+$M3=L`<+Cd;AsJF@50pdmeM5*`VLPCv~LUK3*CIv3{yG}LhQhK5MW zZ~6}xyYichO-3=I0F?fR79#0S8$hY>&M9f$%E8_aPpY`X*T(svXp|RG3hwx!ww2t1 zfp-H18%^ZhXIS2)O2@?g$%$iHp@b*JqE49wyOX%iiQxZBz$kNYf`xFABF3wVk9~+Y zM=Eg70ud*-cqjP`(W2#lQx^UfE*4J|-*Bt9O8-|1U=O+G%P$V<`ml-ipX5q#1f!LV zm67am%bGO`=%a(ey~V>@h~pwX0dC=456-IN-p!cAMwCRgqHLHE38pmI(p~PvQ#>pk zXAet(zJXcOU`#k0?#gd{IHHW^;3w6To&iTKTTS}IxpXn7Xh`jAS<*s%ey%=K3lt@ZFuca-x-JJNi~inLmN zHFfl0KJz|~@frb1Oy(@#;U%0J1=wM^7N2!)N*c-Wt z-?!}9&%Y$alzl`GvHJWKkQigwvwg;Bo!F;?J`^%(HqB%#b1e zsbET|d|4ck zfW)K&-7ZxoAsCl*EgACpkhh>u&Tw z(&N`F#vRXY$PvtJw8Cr;)y%nvM))kO^DNnZa{5g8L}sOuG)oUWt2S^E{#X z<(0-zg>$DlAN0*m_bzci7gLvh-~M;>hn)($yj^W6{pI-v3)?T(o3wdQLQNXPcMRC{ z)ss2~Rw8O!wRT`W_NbpYB}k<*{j9tY%rtG`8lGifbJ?fkgVTiMaPiMuZDLy|qP}_> z5Z>vRD4XxH_g~+KH*FPvB3QK9;nN}N!iDDJ%a|Sdp@=!naAkvf(iGcbZdV6kDNb}z z15f+etGT5gRyV+2avUp@2#b-;+`=xB;B}r-rle=HbgoGLi*}7}O4WFY`ioDC+56K@ z8rzH)2QI5CG%ES;JAO0ABcP7*UD6Nr_J}ID^&(vHQj(ana6CAsyt6f*x60E&R4bN&>F+~y#+Yg4LDf|{B(DR`gyhE z0qO9UOanGi8*Rnkc#ZW}?dpYhIR*Ss7up#~$s?6cB@S=-i)BUK5~YF!!vc&4s7;X{ zqvteaI>ETM9{kFqQ&As0S?{2+x-Zp%Wp~*c7bP`kzUZyoZ(J5Xa_hDzrty>&`-mkei};$)}hmI)>9z*@-F@xAV)JAV)Q}8oM;qWH zPS=NvCe1Adi>~NJ79y3 z)3NjA7P2Z+Bf8OyWGFhh{GGx1(Y<)AGa&67*RQ0=ci}G=G)y+P7B*FQjNa@_p=iD& zT&z&4i{b6$f3c_`!~3I9n$S6PUG1=}>bt?wAfpq>LA~}%tf~my`4O?9*LPTForx~I;k^9x4#=ps2=?Z;dnjeX8(4d-iuQA2 znUt?3YqQzya{V=-{Zp=kamE5}Mn(IDJO+XAPbUL&c^J~KysY(F*-8%mkRQP|U~@1D?%xbC}*3)il>6lh~hlKyx}oB3#|^`y?9$G4Wsy(vS+DHo}F30 zoZ@zHfO^8|V?x#><;2H8h50Pax#bh@-L%nV;BNjEKKx6=b>2GXtL4IuC{k9y`XAo> zyS5!oi40m5!fCb0EG? z;-QV6`wUN>B(DYTtidj9j$0sFM%J)jtHF5F!HzTNDC}Pq-ezTGyPRhw^yxExu;+k^JvM*PTDb_Lz!bNM-lD+*N~DYzCWgU{v(TR&j)Qbee9yjk3$!ZZn9uzM_o ztd!gNX6Nnj<-i{gZ9Hr;$(3E}W0OJ&7X#oa#Oe*UvfsTlk3X^6Z3NFjDAufH7`@UZ z^{X_a$aeBv8hP`)NDN7|oz2%&OQ0xQe4?aD2zC| zWf%OK?_mk&0k@bIS(Yr(s5g~qE>b$R;-*2mtbj$Z?ZtpsD+u02oRNW#x`C;7@` zWw*4XGZ94$CHA`y9FfuRo(m7Wg72jjbFENqD%z)z$Kxx@*%nXLJ^tj{gH7FpYv_<=t&rB=7Hm?QnYZY!HN3Wm4VSKc{Ts-K+qxte8-(;8whHmAK=Bp zqg#P^aI8%5WHMV6e~E7>?*`in&b>!$b7RigU@HV(Z&T`E-UjOn0el@}fgAAr@AKOQ zA`6)<&zd!Ew;IjoVzBwK?>OB!Tr}K%HhexnKWikz4a&^W?=NlD0Tz}3`DehdB+)B2p&+B#`j6uu7MF>!gR zR@7l_H^op1_c5;r8R?J1?BoJ}C&{ACbtJ>nZ#LkF%E)Y3klEOC&T|Xc3`Rv!1ekFu z-Roo7AZo%Aw~*b|GY46@X7_IW%lX7);$gSeKE!GRUnlJtaa zB;r974L6h6`)6K-s5$u0V%Yihu-WfAsyvzexta@`f{$lRh~+U4ru`RwiQW3~Js{*jYU=f zmGy{HCEM4a#}pJ&1{*uLpfnrbP`(cZmvr6Y_VMlGd9r6e3LWiG$aJ@uk#=qZ_misZ zVkP*u4}I`^6D^|2>$=DGqJzvqg1FFvym1A)tjW5;c#s$YXaHvrssgd4Z$d2J*pq=W z6gUxz?^yH9eV{4({`vx^XU-1Y9bfKaty+I9HSB%+-ZGt6;8xEIqKUqOiH?qzQgN+w zD)1=DMsW-v8yw$>pg+gg?6B6>wD2d4Joc2~30_WCTC{;c{n~#S06RU9jo7csMGJchT(059jnVs?O@-DD5?vy;KYpYbtpKCe=MyZ?MR z%Eh&BswjgG!`P4^2grQCm@l5Ib!Vc54#c~yd#)pYYy0;>d-eFVzG8+vu`M0Z=cszv zx9*s6>++&W8hLW3fG1I*@Hw-S zB%b5j)7m(}mhTSY;IK|#M_z@mNc|MtxUwJsV)|V@B{Z5)Nbhp!XLwW>2BWzFX1oU9 z`#N}W)02HgIh%Kjr+yb(kmwd_;6C(9_`i<}d4I+{4%d;skQ$bf?eIBg5bzU@<|Q0w zNKXkRZ0#nbK@M>1c-58x`wh11e79B@kX>1>Ohgq_wLCBUGruz~Bjt35rg)dAC0J)= zZfun)cL$0kv9@cGPnd)PlNl8BCnvA?G@W7=f7*j1>c0_o3QmW+AP*X|N|NOE|! zJ!j{w7j7!)w|Gi#0`G{Wsr<@gh;7`Fy2*|ir=A1Av1)^@4vO~(5}q)twDcbNY04xV zdHIm%6-;V?m@X_bEA0?)9`E&y>Uba0fNlTb*V)OsmMSabZ%j+#*I@Ym4@T}9(GVbK< zX&G+}qqDX%Vvf7PkWQS3jcxL@LQd#V3yhe@oct1btI&bjvr7AF!kABIHXoKM}D_3iU0%*xcYPh z<|~`s1aVtO(6s?(Is`8?X(O^>cYg($Ru%fWkl*NJHz8$5H-WI1AswZ$yU+~o>L>YQ zVQAcmU^a4s!QBGsgGR@@2^s(PkM>p=m=`}}B9y#U1;dKfM{a5_oQ}zZ2fVM-B|dge z(C_0v-a6W%;RU|*9u@R+_{r=x<@cA z%oW>;o!^E0_5&98c}`7Nvg&0abnEXDL$5*p?i=BgO3xz~Y%t;ZLfnt7tO{22vFD^6 z+1Pj>j3-@!5CFO5$x8o;miVjPW3f#cZ;Yckj;e+>MD zXrt#p0SR2J#!Mk@hzD!X=Yr2FxgBa3=I9EIdPrHlH7M48A+eu{FK3|816K$G2{Tp(JPAyuSRipdE_4GtUZkjP-UAI+! z9l`dxSACi1mXvcojgmHNSGe@~e#D-X6FEx^lr`g}>wK6>JjObzA4n{)#dx@-^A47r zsQ!2w7?Ew=gtPRpn{)FjbYS1~FV*Tl32%Q)U~q*WXTd?%&+?J0Z^FxR{|52ZZ4HyC zBqD#3lmIsP*!$PdCQ+JD7#o|kWrcy-A!}LoI?@pYmt>{3k!|J%)4(|Vm@x(9(T+PU zli@2`Y^5L5c&s<$e6d#DNBLxIE6Rfu| zq!SQ1_;U6Fzp+s<3Jt#p^%`I9IrEim*pQpfF!be!6>VN)*aXbctfOt@FurSR*BXVh zE4|M&$47C&u8#W~2v8scpNjw_kQ_Q{C;vYAB{!bO(`gpLM~r@W4GXK6nOksw(d=Vg zcn5Jk_nuWUq#3_>whlVK9WQbMqE0BM_T7Y9ppHeFPIW_U}8&kR;+Ppo|j zlnM$~;gY3z?@753UP)bL7f2$~6n`h_&p#^ruwW;{4>wp({~Ou{^lF*1o_R!FZ-Stw zmvQ9Wv$ulNo%Bv8cw zK|$tm@@I$jVa7av#nhXsobh1bd#43Go@0+gOyQdz%043-?cCR{Xd9=^cg5_{{VVPH z(I=GT5A}!zX&zZgS}G4** zT0VT8Scl3REN{eEpq%OMaw+BCIhnNeQHAP%<%il`aO~8*Xf>PDEGYW4ngNSCgAPKX z6u)v&X;k;kJ-}5HxiS?7ypW^DKK+-aNg z9z~;b<9feFu~_Gi2RGXVV6EGG=70n$(j70CmwfZL?xCxEqzi#Dhf2r4rM0eTF8Fe- z>?@EPm;pYz)o!%U+v$?G7uo;8u2T>nk~&?-J9@^8@acmUQeVAo%{TOR%Cf z4A__s1*zry$4Q6E)C?*{j<3a35$9ov?o`iN8vdeg!x-V&`+~#2xt|{#gW*xee{z{n zi^snpC=f3gH)^n8pPD=6mmRa#);BK8)0iXzy;rXPq2SWi#}wWi-o*)NR!YnD1Y?ge znqWXvIuq7l4dL>9{IvVLh;k+6f?(IGgJCBx0)MvtVep8fd|BUmR?P7mjQ#Cgsp!Z= zrl!wo?!686{k&-X*^}^DgPcSWr^TH4j9PUXG;c`-f-khRM{9Vv#A~A$HPQ0kHU6AC zfck&sVI|yq(r8%N{51xw1sT8>WB^<%@@ov~AP|MKyTm%TRJf75;T2jGbdGL^pp#q< zek)+CSy!x-D-7%tcw+Fykcu2^t#M~5>5ngXK?}EXigqyu1Qv z@y7j6j*#!JG2}w0Kf@~u&d?_Xnbc-5DQ^!`wUZSFY!wFZFTg&4w~+^+xxCLc@}Y9-9~&Z6_u@i4Ta2|edb6jAJHb0CG$!U@$pU-4(rSI=+((^T@iJ=Q?#}-r&DX^o zSvJ1xU0*O8sqO1PoEosH>s4*6a3Id;_lumKn|`J(*qy2LFYMu`@HB(c zAiS0I%)vccgzTL&)6g`_*OC+>>i$kgw|Y^@!%Q>Q-1%@BssU&>7lE@o_c5o$+oDuu+bHgSrnv)7%+ZWXsQY^xcUj%w3as`a4J1o56}>#!5s0oQb8oj-_{cW$0A z@uTZpw1VcMhUaU|SbU!EX(G>N6366aXWMN?=W!*r-L-r60c2(^#nYBZorPW{gI#V} zrNyP2fe2QX4i;3dsVCjyPVQ}Os-v{OyLqC@o~m(L%TmR=RSaGcj{`?_*x9Cjy2{yN z{G5K(;%j@G;GDy0|18h{&+>p}+#NikUCI)Mzr=vOZ5Xc;TI0j3ozFw}^iuW|-D{8S z)l2Tw^`b2_JLZ+Ky+eEu-)EeFED<8m{#)6#nu}Fx^XPw zqGC5jwNHCw(S8Jf(18s0+|Nz8oY}3G>|OdOO?+N%7d3o8PllTf`$X=PoBMX^2gUHe zLeo8r`14$viTBFzqc`v|_z;wNof?>vF}YQhZ*^(ie-gXa#d95uuUR;;hQFH}2ka5! ztwKjQDY{TF{n9$6QZiZI-1~M4^JziQ-9NH@dMQ`)0|(jdAY{(n2Y*)!#|jz#=7eLL zyjb8M`8%!NTjbO{d=Bx0T)e1ayc2N>hi&0-r1!@Seju@Pv*8k&H`uQ7<_Ib5c3FG$ z6^~IKY{idsX<+VZwxqGf6sjNn8&IounnCxN8RB^FEpC_FjU_8h{@ZmBN0(^7Y*cG)uVPpUz$fjBvKufe3caXjw!J@^4~ zYqtZjgYw*IvExhLUh@I#7r`cT)A28>7K<0n4!a7i^oYyl6$t1b!D5xsT`e}%@lMQl z?v$dJc#bm1oExs(a`>9D z=S58eHXqhOS=v-~WPUgzC2qtO0VRV5DBb8!@e2%<%x=q;yB&RDzt8V>S&S-{#`2foAu4}$>m*+D92LKhS zSN?>*IF0jc`)xw37_r#1%l#ahb@L|7*`|dzh_f9+MCmJ0a(Gc;!0O0j4@Z4*mF*00 znTg;vG@8_5#C`^W88jSf9txSeo;04NdvmoOw!EkGbUKN6=i$@Rrd%i6!It>O7FJe8 zLe2x11#qT8=)5K}J4@}lT}q|#Am_Fi$&Z-MyXXjJv2>%s)1ZWYO5qlX?DF!>_)b=X z&EtRwW$q%Qy97ozsYDG<42L{h^VkUBFIw|wcQ~t*R97o{6*|aC%FS-jFMu%*!yZj{ z%1>Tr-@Oz&%=X!n6538mhppVjsRY0)bXI!y%XJDs&~&IDdm`ZVbt-xQf2I+jlzSYVOI^c7S0yo@^;fKJU;^V7mJcFwg@SP=dnAK(j{dzJ$_e|@VP)?1HRtO1NB@TxP=-SOKdg6BM8 zHc_=g`Gx2uD=QZ+%6a3rdq(0S01Vo5=_JN=Dkk|y)QcF(WLrou0&p5)voXx0GKmXs zi^|8TyL;3*5F;zvlYe#yJ+q1#y(8D1Q~zDR#8fjPF{<18Z?yv+{vWIso_;(zWz2!a zN`HsfXH?<9mU73ReYPICelrKvOGBNxKKT)z$^KKS?VFF%kYzVGv=-YdR;^nDztKUt zf_%i%jR|CVz4MmExQ0)?`ki(b{a|~=X%Sno1|_HrmOT%hmyyq2V6HYKYV5$5=oknR z`5WN<*m&VDmD?Zg7#p2xz}r5LJfoy*MSb{PbrmgDr%3%cT; ze~M#5;yNcB#dVIm|02p0V)C;e6o}`#mo?Wk=62YsaEH?%_J$w<|jBW+u6KQ zplmqNZf$cb-kBAWG;Vi8Yak+5*9OpAu9N*H89(6{7NhqEN9`ZW-nQ}NGd7Lm?`dx- ze-)AZU3CFkxiM^MdE$d#k7s^%l_-IYvo*3%vc86XU-R~Y8sFpyas0&VgspN_X1J(G zf4yo<;bS9sI}Uv}Ga4x`qQI`WR4p(HM^3W1k@F#*+H!i1v0(P0iz(d=X)Ro@Qtw^h z6pp@pF_Z}`ePKjXCSNoTe}s=Uc!^U~nqR$f0gg!}KH~+&T}M4WKtes?>7{Y56H|Gr zh#8Q21dicFM;6n{z47pK<^vIw+oalPh59#CUGzKBQMb+}s61Si1t42HdSUT;65q9; zE$~H?MOt?t3w~wdL)8MG_IKxFB~8-d;2;`3)#k06AyE7*39YBhYiFnc`Qx|~oa@os z3Fgr;0fWW8i?!EFUyW&2n$K->1GNQW2I=*z2x*Dbh(Q9Zr#o>SP&(v7l z>+Xy^u{AzH2p4V@lAX@ae~|o!ix>{)b+s=JR!X%DPxXO4I?2+fkL^hqWc z+6|Qm1<#Wg5#amQNNHa_F~Sk`YpDu9a8eXL-7d8R+Oa+U58|ZpqwWrAkZ~~~&Np!E zd;-;ZTY2#>mD1VnoDfw`X6(~OIIYKtGg`rKljJ%0zslZxN%kFjY&B1~!q(1Q=5gVJC8WCN zB;tF7>9|h=1@!1bE>{?&yij!cM3~l<2}#s7kd}DFVZFF;IpD$Rn9^Uui z*1FFX?Jh^RB>}r?m;&f-KOUe_xz~gLci|go6lSM}6 z<^)G%#YLfbW9g(V5KB)ZL*9T4x#Be`udYsfMC;vK{a&b+>~mj3T2v~^3Z2MWSSr!$ zRNC+5C3dQ#F!jJ%sBa_D-k!h*yc&ghbuopPrFVN)MSi3#^-qHaPZVkJ2uv#@E0bev z8FsSkFm463HDYszRM2(YHwxELyhM=SZ-&{?WPh5aWQ(#nel$+eu`_6CL2_~-V7v~2 zf`-kokjYDva!bpC+n+)N2n6>(Pe{CE(|Pl6HMkA_ucqfptb=ID2}gk%LN0Afe1Tm; zspL?}m-Qs#Dp&e&y;J_Q*jFHcmcefFyD?0G3C+HCt}~+0^m`*7B8!JL0suR}xM5W7 zN!wafrfTp)Bib4i*xk_d{_5FY0_iCJ@MVoff29CtIawnWru)82`13o&b8gO5WuzCTmy~We27?(`I5c$K zUVfFAuAyldq5yRCTdR$6WUz6O&K#pije|IlK{=JOsrN2&5bjeTq8H)>W#)_^YAY0? z$g{RiZaTl`&<6t!&x4MgX7Pk5;?OKiL>i#%!@w=`>6WK3tii^6c927P!({vybN*iN zIH?J{U%yO@A`z{}iZ&PExY4QYh=)_-$$dQI`n~YPPzks49HU#seG6LTP)Pzcx98#Y zs1deE;IopGwCIBQD9Ylr z$;!{jSCFEvha*!kxhO6S>+dS2o3OS8RpKcfzOyz(^TZ8x!42PvrMP= zz;HmbrzAo=7(G`s-*Tz`vXxa+Q^*F^w&Q#C3vplqq+jWg+ScPGLb9LX za>FHwet4MDwYL(CE5UQDC83A5sJta>hht}dv!@`0+F`DcZEDee6odDcMTSwtC#|wC zebKf`16nEbwdr`z=DDLKR)lu3Wnb$=?u_~-D*=(qK~9ZdiY|oexo~~fe|x@UipvLw z?lTs`S39O$JG*$*rg@5GQKlObKBKv=)YQ(n)$yJk*zboYB+!Xm8C31H6f%=EyQhs$XEyhB|+IDZo_6Z@8yx;dhHSk_)?Xkuuq+| zG&Mh}F~C*JEYt+6YN_7wHezQ>#Npiq5r@NNml{YDxh6Q-N?DsjVAN77-2KkLRt~KV ziPP_S(R5yw2!PSC(>aIgJnEn8ZM_qV%|dfG7N-P_$uSLRy<0Ha^9$Yurb5p@;lOTs zv`K|G*4TTzZlgP>J(^$;MhV^QFwL@PDTx=9{99X1`$*||vP);|`)+GS67iv+)H(3j z?^s~68V2JZNZ)nyGYH+*f0^w0^{$wjJ0k#$+3(rLrXDD~pgS_>4#^`{X7=)^cxh}f z;aP~@_dceZgQ@_|Z$+J(AG=OBYalclobHPi*bz9dp1ezhs)L#{$9p#|<#-rfz^eMx zLL0GjKQa^Nl&dygio6E=X_kE)pQ%CcY1MX4@)>&p6F24i%S)}iotMqlUR~a&;489h_HF|7@o+Y-emL99#Ba*QJ05oanYF7~S*B2PHc?tQIn~8p$c6 zdu_P^CpcU}vI*rbRxhk)z+R4+rkCzv*egC>=Vc?u=cR3P`6hd`noa4~8{#5c6SKVP zQZJMQs~k)L$ulq&4t(A9nimOAz|m1yI6IBr3T*&Y>I1D{FK2U+YsdJUgO?uFww~Dq z1(&0Lp9~c4IT4~7Cm3Qo*7T|Ot1UUAZhZM%g1mHhTu!tAVf?e^r=CebO};^Yp2q#POPZ) zq5DJn;C&7KM_YH#RkZ&-gpOE3H zo%7~ZkyI$pWS8arLL4M@-yDO@Y6Uvqvl)ynW}A3NLaJ;b0V>p32XYjxp~TtCVo(8-kevPz^<=89i+A&_A#WZn*U=H`^)oSe z-#+1aw;HTqGU?4WG62ENP^62s>gO+h?quOPZ=JvI_%lCZb5h+8zt%WK*LzdZ58oCt z?Bw9)M2Wn`o0}CK_hJf}6C2l`zjv`<_JLXI{-Q5^EewEU@AIBuUH*|FE2rnV3scyR zX8WNqyMFA^V4%mwW2FIWV{Gu9xnKj|^dU_8O_e-+OY#!&Jd18T@Q?31c7U?~1?uz= z@p4Sq%42wAe~gxDj_4PP%Z$M6~OyIbDC2Y*)-jBO3|Z&PwuV_4z2pm6tQk- zN#NiP>yB>;QO%osMGYl9t7&oYO6m;|dbETCdG6wik(-CH%;BneGZ?TrbS+N4qf6eu^l40R-c1|+qF1ZYi_pxnq6U3xb~v~ zn}QLZ<|7|i7>!aYHM5?4OzbYwi|mx$-CH00`6p3|hgPRDPLP1cH-Y;AbfOvpB-&;v z2IWeoB3p(BzrLpCwkiJL4zuGMm~-zQUyY!I`Kix+34wKnvsus%Q$W9xg9sOBLqm@~ zMVAS9E1!E%KvWos3inKRVfsWk9Q+J2Kw&&o$2c|vf{RaN4dO8Q3prZuxZ&CaYRmf{ zp6z`ok<-;ejUtyS9`}@ohL3y9kd3OLG#>(hM1fO#ign9CQ$b1_+0(%7IporSS7bQ= z203*OY3GExt^sb+QN2_YpXw0%vYwPG2$H8UeYqqwZmt!H*#4vZ|ZAC50z$up20G88V74g7_CT(;HsDt?=oRK;L&jaw*#6Y>e4^`dd5&M|jS8+=BJ8L6Kvqep0%@GeVi^<6(3S z1`ERUgn5G>?0+wJ589-pfPIO6XwG%)4zPMc11AwB)0*A8vYhkLg~W=TV1)RWE0|-n z2?&l{g^Q%hOtN-k14(3iitg z|8P6_@@6HtnX9*~8p3=C&$xDw&**1u|7xVx@I6jZZP9;>itU3wv6_W%{Yt$*7tFKrXCy~ zY^iR4WGIfr30P*cAT<48rmi*K7skOeyRG_(Yv?koHQRe-%-$zPsGu_GTKK~vK{UJm zi&AB|-N!TY)*6a2xJJ;rymvADiojU50Y4jc+U{pSSY7myQUGN>EiVgs`&+yzVopLI zPy4+E2Lyg_&X4$H&u1=Puk&XG%sl@ORbK)Qb=&K@gvQvl< zBiq;pJxWTbEG>u@RE#yoG9Xl_ z%jYcjeBYPQ;FZA+kvId90~qy4uqtMo@EuxC6=YYdUFTwLEdDl~SnVH=drzhi#kES7 zDz)t+pP7Lis~4B#xGlKM{Jb<{O{l+9D`I}7?MN!N9RpFX9zn3&3?gqCMe8-_aMa`L zJz-C>_I8QnoxIZE;AYvnd}i2wF({XBgd_fcx?AGU%|nioT{+WvSrVl3pqVW=etQ?O z#i~caIgZN|tA1j^f^?PTUhsCzS%448$1|M?9nY)On&-w_eIqr!#(Tf3EetPSSb*B+ zj}W8=DJp-u&C%HY?YO6dL`EnC@-3k?j^9cRim=-r%IGZy!1cUA8Gbirr}X!hO6Sy3 zi0zD1(|HKIA<&eMuQ15h5oaGk(2?ZXSg%U_FxS`n~Yw2sXc70$ijSZPi|} z30pBqTCltV+V;=8)2_m(^vnKxm#`lksb-zlIfj`=wm3RK*<*V_O&4T(t9$#5R=*B+ zsO9;QweFG!&2&`{xcq&~y4%=`&zS~jO$KFI`(lFlKo2Npd-dllfFER9D*X~QU4aVl z_~*femF!ej{;lj~ZX_IIllt30I(o%2Gb~HVJo4>dp*+A{zsvW`(c}NefM2Zfjg;sc z(z+r|FW{?<<-iPs5xW`nHp0e%)&4Dc^?s+_DX)t^Sd-Rk_mXjJwg5>hkt)^o>~Yynp-l-bYNdyIP%MP9L=(+{iBhfqCDamSz;{nSw6T zj(oZnzl;ogr8jSEna`JJikr+Njl8$n5attb6F<6&lR@ubuDyf8t?ilF$DT|{jfiY- zYv#Npu9@X|1hlc^@y{J@VyPr!2`H2d4qQx&Y>2klj8TW$3ibY_TTJ&#u3y?8`@t&Y zLjI!U&fh4)Ctvq!o1mNl?@!qn*)>3^y}%DCkzJ}K6yqU{ds68fhTvzC1=;b$NN`%) zIi!8Qc+03=C*=Krb8_xvc{Nwk+6&l22R6RinsVF9JEd(}rpM>cc_=r?QIYLGlhLdA zj`qP(ka8p7XA*IO6$&)v$ zl1F_jM^$=1SHM^5$6BnNSy9HQ(`_2JZNa=RZ}L(j9-*^tlLdRXLWc#r{3b)ib7IPb z8U}Q_6!p1hcBCuR_)(~^hEa3PW0+aHz1)o5J7c}3fULYkA$JVb>TqB#*+A+id@h&L z)Sx5yGsiOr`@Nl>sPFh--3^?1)q~%i%09LV-xH0xfN|~Zr|PbhY}^HVcd#@o(f1e- zp&aQ%21Ox&&1&9!C_Tc5e{28tDpB-`49z)SA>%m5Zav6cy_8+pYrv8I zC@;7~o$vkl@X$cLENRoykbksH47>{F94BQXp-teOTnRT-Gn3S2w*({$MfX9nGZaUA z=@>3Lb7Z^{3_(qu)$*^@Fqv4MtA+b1UEbwy!>TqW_At)mdyWpATeb}EP(9G@C+`rs z{PMz;+2e_e4EiXk3e?l=dMoarb>w^@BSBT(UgebUka&fR`)-oXlp=B-)MFnu+uRsn zxuu>78vXJ&YCug5y7$l~-O(n$i70=M#wOhAdZ~pnT>lA3hR&2HCcZP}(vB52`n|8f z<*m&14=tR~6t}n;N+>X`45*pfo>}tTfS`eMOoW)Q4@b*^^xBTD&nBh96^tezIc~N4{%Z3<5fqcbU|~YN0^u8`;k?0{b!9=4Xw56mbVCC5+)_8 zJd)cNEkxioHLXtLRwfTal~OH)`v{THH_cSA`+;-xcfC@{)<@Ozhx3_KgK_#ewY2o+ zez?CDZq`#5pM8Tf?8ck9gkCfyaPc{FeUXtnx_)TQGn7>tgzjq|3?IY>f9hhzZQfKdT z0D1$Hjz8>J-cBhj4j~xh6koYgY)BK|qzb|(U>0}}nBa|DM^kT>XxWgkk0~Xo_djN@ z-j0#4sqT?HhPl+Phf^~%-@9`2r^9+z;r}-O=C%F^sIT<9ePi5oHArhUTbepn;wk2j zFdY>>fl-j5eKe6z;$^O}RP|?7o$uGjVD@F@9SM@S5a`%kq!4NQAEfzTNKvq<{o9iw z+pgQmmj8?@b{~lr{K}@%CWZM@bBe<0@;tr!G(3bmRZgNY|K)d1K%)(Vi=-2(rMm0c ze`*1s=<+o951I=j414=MKig{*?B~|l`hwfcuIU1(ww6>A3vJYxhB>Ri>6WwVQ$J=n zpBN1}1JcOuuQKK=#&RaW#@DH+bEsELK-8gglw>AT9Ch>ierO7835AR@=YijO5@nm% zYNuJyhW4zugtW>WnmuI7&CI?;a29;od# z4_c@2^(214Cz8%Ck3MD&x`223ko9UGM@Fgug*d3=qu2YQf`~o1^BEUrOCNaeg8iw* zi3ug5Kkb;yPg=FtH@z7>Huq%qOz_hb-Y0Eab)Yj^ug!zzP&KYtiYmPVuPaM4GOysv zL#n@ z!oe=RPT#k2uuIwGN*(XTy7uX;7GSVQTEGohxu#M{RiLyo=O31`Q#|~X*MsKR9u>f> zyj1JIQVCxWcOOeTW&#CCLHw|?#QQ)05NFsP+s4I5{MWg9^u{6*A<0s=ZP@2NQK#cCXQMWGnD+vC>Gc;%PT&>}>S=<; z^5|S)2_>373Jq=vSXD@=bf+49va}IAq&WulR9^R))H|~U`i@S3b?tqdn5dHXo{AVig{pT6#l zi9;?uvj@S)u7az7aun$KwS}HE#oTE{=iPsE+lKRN7VA9v!FRpZoFx!E9O1O1PhI%s@qh(75Go_6j`z zcfo*62W>`WHOGZm0X?4xKK?8&6Jp>~=UgZ1DhF<+m$pO8eE#_hra5B;`iH)F3OVnD z{M4(5#4R@3NVIOHby^qlXZQ9jd+y5DRkUQi-@CnqAi2Z{dmTONo^fMzV3L>>0d;cf zO30oZTpCYJOb8FnB@<+ph>-5O!HN2+nS}eZTr++emI0F+C;-7>1Q>@xZe@=_auJPP zu#f{|P-iw-3;k!CQ^bj(&9 zdYNhhuSa*BSyPZ=O4*22%3`mOB1W-(F>%#UPcbS*0GgaP!M`9r+|Pzh>=N!SlAr~g z1|M3Y%Z@mZq#RL~P0{a`FLi$UH1?p1EbW)k-ytV0ihz4mutoa$g}|^un;U8;^L4$< z#n#7=?Ti9!8=ZWHhI*1fm~(gWYNeS%qjexUG14mwGr7691I=!r&#Yw>JlbZGm;2+hI{yEV+PzFrVE{nqt8ND6aKGvA7*#jGjMmKnQLl zm>?3`d;LrmE?40&Nhd=qNcy=%Zk)hfV)6|Us>?AQ#B$7?1x_BNNX?*sdG1T^M?jJ= z#P(&%`B&FHj&shx!q`SHw4p4Y&le`#-uP}!BR%#<%Jos(K~1y&q<9?6BqPh&pS_*wKH{9P%YpOiR42;FFu|Lx zsR~pr$?Ux9)1fh%z0O(?w7!OkHeW4Ewl!YNzFR&+8$T{8KdSR+21kpSZVxkxy?UVu z&N!wgcMETt(25oSUwKxgl0IXuV4mx@twr`LsK36Re!TY~ab@<7m7L8AgSBC|PAz?;|t* zC*FM{R>N-$6-&whRzC2S|Gxj7=OMCNj#}Q`Hw+zvKQ37s)-9|ln%o?rN)n!&emh!9 zdBoN#yU~)b9)%iQ3CL-8st4=xmdn^8q zan3Q410_M1*8a~d{z2yV^iTP!IDsk^;daU9G?3SL-^tn^);FND4U;q)F;^ihHL74o zChCe@ZuX_y_zRF(kA0+xy3|I~&)ab4)f6yEBWU~9A2agDiVV;GjcX}X<>R(A665;n zO;F|776JxrxC){w^_Wsr;}Uu-W&ib(D$p)=0Np7*VTw(kfGjwwOAvSf!Gi4Opb+xpWol1CCf8sP$FcKv&MJZTVO>)nu+&h?N&2O@D`HvX^Ruxr_ZG88dM0nNvK_N zK!J$h%+7HkoWgi-JGNHChu=b> zOJzDw#z)7&9oO2oAuKg>C0FF9h!}wBdyzvEEThNocWAfa|6(M;BCL#(+#{nT5Newl zM_vDs+8=M&Zde&!i$%^-{puUuH3$0hRN~~9@v&9)x-JPM3&Jct8l8?0z@*mSYKh%S z+jxuLQlo}1{B`TVUDcfWp9DCq$7)5Jy%hqV8{;|Oe!t`D9_yu9k#?tx`MUXVwdRSr zyARTNFdn$k0lFjjfd>(3w?Yu_*cNsy+M-5E&~Uo)6k%H)estgymg>5#!aKDB@-)GO zsQbs~lBKnAX;#Q{%xWX5lJc9wj6MD33FD=C>7c-eH>ViHYB1@Fd9kd70_hO2b*6Vg z8Ym&9qDD8~BxTw<#(t|jC4)dd$Vxwsy)eIh8bFBWZHFvOOefMe!@2?=bA+vj0l6yZ z{xP9g&*SN*vGAj=YyEAX!vdJYa!3XiB2(w+k3ye)e4n}Tt0{QvE^qR2H06iKBb}bk z8oO8zknzP`u{a;ZHWyUv0nMO<1Ebv73O^H@&5J)oR}`YbC5NJ|;rD}~B8UKvkrUrJ z-hUVK9C^3R^ZRacWol0B%{}C8`9H=D6~Y-uXod$KWEhq=MNHqfIFWck^33k16|fH#C~O9(Qm_# z;zsePRe}LyP&{D`s`xsTxKH`ugtwx|MLE{sE%rcU>-6Gy1B>U`F!A zr(UWq|DG$+Klz+3{jnA8-wb+`*y{fhD8)-*E8dP)-@}V-esmY9*Z&8n3m-pCfOGt= z(VEoq`tt)h>oc1u#2v)VH0o*7MJFz?VoxN+-o+Fw6AUT-W#2SDCIt{F|xqjOUE zZ&_Zse{NKl_EUFys0Ut->Nc?%h8LpQq3`x_@Sq6eYU zVubUvD7Vja4KkbR3L<^(YcB=MPzugVj=nk7c=+5^ZTTnkJvxgCA5*?t{EEAgMUMej2CIPIl+o$Dyuo%W+d3dOUPuw?^+=)*!i<~UI zQ<8S<#(5}u5XoEGg7!HGMNrpf$Mxut0^!tZ-=2R05=7u!LafNg7Ie8xD2u^hYol#BmTd)r|0#aM{2Fc%%K z_jt1w3KWL51OIefs@-+19j@<#T$jinU7?)rVwg`vS&zvAneX+=6o(fKGHp};zp;qW zK3Jt5RQ#<|$O_g|&j1>Z6Szlf3HwNSYw%T^pK~`J4rfQCHgCl0c;#5iphLm3OdjkZC^=KBrInTd#8~f#e({wB*vWW91_(jrs6)iC|U2V~8>e zpB|8SUci;UBbTFAd}L1d6n2dFkffCXO@0cFk*nZxKo8feWDi%%2?(DUgs6Rb-w!zM z9QQEBT4#AqWleZ(VMhTsNotD=emFng>RUto?MY4EwB5y<4Iy<$Q+ggy^8gl&-v>6T z6|MjeYN;5n_EbBo5|R$u4z61T;DViGrw~6>&{Ejkl5xBBRvNBdL<=Rs2)qIfpKorq zVIp$xAUj(v3)Pt$V0T&bOi3o_4JfHbG`gmEo7^y*m#CLL@u+t3{!#-XO?3XAxP6iBfVXf7O>=kxl zBN^aLf6?nXQZQVsI$-qo5q1tP$ywf_5cW6Ui}T{J!$IZCfa%MxC$HC-s(n4F>UAD$ z3YdG>uDPXxg_B()ar=t_B((||+jH?so%dQt{HhWdAo~o1s|7XGeqh89@x}4#N9hic znPjzPr~NlJAMR2voC&5ulS8G#Pt+v0TN1RfxrnctOMsr&qC_pkF+aY@Q;4ys{=e{+ zw@N5mpMUDIMLRpx*Ug4h#ikiBl2efCV$8T-pgpp(0fT7+=k8KrV4&Oh#WQ2I<3G!k zcp=AJPCmRW=B{=JGK0SzM%Zpw+CI-g)8JA@2=RKrd$LficC5JB479?7!&QUQQnj;t zeoYk}o6w1NW)j}U&g-i=TzXq%xXr~HT3XJ+)DHHBJig4aH?%ZqrSZWOAt1M_>R}g8%(bHmHb#unkvvI) zJPjc6uZSY#9F9Rz2} zQ;P|4T6KD>G3t4skPUwao-D)xp8ekO*uO>&T<*HXHNN*Db>>NV6qcUeUS7=%n?-UnKww90jUov#qdXyak;Zlk3Q zyGg>IE-mZ?@gMeUzVNv4Ez+8EVE%J~5Jnt6|$ z-xk4~$%v;WOz7W3P)JfPDwe3!2$%d3sn*0WyKkDWo5IRJfJI*MOJJdTjOMyRHst2b zbng0hW~Tx0Q~-vb<)x^2u@7-jHjfgZo&us(bL*Z%gUWhr1n>ISqsN0HnZ&q zyTFR;m~iSO zN3D<&f^cOw6RXG28Lf)B7yrTq3N@YcpmHC?o$$L9e`%D8tKHTG3zfN6vnY?Ep!oMX zg-AfL=5GpI-!Wwjo;zCQ(!IV@E@tf07Q(zh0ROh|y*LV`It6Rt&P!N9#w`K6tp4;HqFLLs9l= z#rgiM>xeCU4-GpQO`)X;8!ry1*|C6mT*i9ePX!Ewt0+avkm^s^o}Zz+cwrgpF76zP~PcRIFEq4MfB;oYSGyh7?{e`lY{EL2pGw29$4XxEK* zIuP5H-GVQ6IGHMLJ+}!prVQ@}%jQ@CqMQ_g;A+RbJeDFcj56%Sr2pD6$=1@lzbE>8 z;N^TrDG@LOpxtwfg5pJAYCwNu!*TW^2hbw9QH|B8CJ~1I5TaBl_+p>4X;!6P4BNqt z$dBwEd~Fm}5Ug5+UHkTkO2&4Z<@iZe@b`vbc2m%Xy|@8DR^MvHFwE}tyt?WFZg~p` zhNcq2cMli-yk3*1{MSA>USm4{#6KDwMo*)*w4fiKPi7OLjabg{0>D)KPFRSA6Zb%I zw<*-}8hFrL?r%h;i`PyEy0I21ulmfDiBOK)q3S_P;a0vP&qbQlMqi=c_k_D0lXNnl zUX|w@>GAp1e@9`Tfk@^^{*&tDz6~xFF#Gnt!sJ6;|Ap@3)Hw8I7gIYazgSoNz1mr; zxRTR5R6kyRA#C(eN|r_S?SBTB-bAd$u-k=_W|~>IM>~~Y0G-+0iFIa@TAW2t8}-ub z?5#AYFTq?KDJEuSp84v~HUz|c1)y~GXx9vbys47q$}Wt%hQ{+bIgIvINq%Sz;p`=SSPW!Q`Y0fPm5qLR1iDQ|1kN#PHY0`Mn8d+_`|b z*Mu~+4ziQaH+a5TmlxtjG)4Y3uod3=KXs*@#Gq)z}EE4 zWqG+ae|W=-2xt0KW(y`L*6;2ifuNc%M_Tq;yj!1X`y=JYb`R0GOvCaUx5Oj0-vaia z@R_MtIc1cQ(9d2t>57N8$N)5jut`O^LDLAP`u9I0danmGnF|#)eL_rVr4$rNsu9M8L+0j|yHSCo!D$YDy62%0aCU5O z;n+Y&NafYq+*`@qn6epw)PqjzYh~Qlx=KM3@yN)bNT2IjcK8X|O^`TilV)ZnvPTA8 zVfzIWkN4Cpm5zy@Kej-G+=1o|FLNo6XLxbW>=;17S3x%Rl0f$pXrvo@sAB|^IuO{- zOwUBgJ=F~!gONG_yHdvPIOW{wqc ze%~hYC*oL}jWpmu?@-#ngh{;O#i%(zUUgm}Y;r?G;Rk0_sD6!QdmaYAlHaiH=6lQA z)TN4d2e>3x+M#CleSL&<3?t_d{riHo^x*jSdoUku7o<-wjGV16%om6~c}nGa$yBgB z)S||1EW+lFl~Oi?wuUm9Y)CBkgohf4r`bZ;g0G=nbxb)NhsmbJtFQO(l7lAlKY@Lo$;YZa%Dnp@C4Wc z(H#ME+%C2<#$-45)nG!2%ky+O%&?TU8T3F8{=jzXV&6wp9?7=%h<8IR#DAFqy zhA0i<3r6EU2=8}e&YwADIQ;IdJS-bjN*#8eU@Pr3VR`GXZfEM*@*o1-Oz8+S0ag7y z21Xv;XPC8A@EoWJOIWP+8}j}MwYr#z?wpdG*)MII?-MTvGU-V~mY6JRC%!hdUQ|A4 zYshC&+@qO|dn_V9elXk$r8>)lnj+6aqzg7pXQv9sPTFhjdu@y@X1XJ<^?hrfRgdwB z$-n^Xyv~?9U;10YZ#beq9*uw!&fr$&_OH+Ks;vAT32ogK;OJWJv^2!l_+A%nX zJ*9-Gw{eitxu3q&=r>ew8mrDpEzA16a!ElcSR8wN@b?kQMV=_)4Lf6FP>9n-#>Xe)YUf#bXK){K^|r$b-3 z3NMHbS47>B^XRG&*7D%GS@PpiA+1#~iL08ondC;d3%b6Z>_OhFc5Li++n=>p#AJ)S z5>FGa@;4Z6I=%i~sE4iRtKaDcK1YmxEz_+sN~WhTZ!enpI7?P(x>wSHTWMd1$**s( zElUycR&(j(J9jyk+byi`;qu_AS4L3y%-Oo(#lDQrm(>Ub3!?jZwa{ZK+Bf|iSMcS> zk&UulvKGGe$RwYb70)dF)AP#!gZU1MC{DQ*pT^3^zA%&Irx4{9{q|VGNHL6=*KCYl zLbSe1yU5wjqEq#c4cn@7DGahfhrLAsXxE$2?RQN)N`G_HieLX2DO@I%<+YPSCZ#(pR>nqLZb=y24yCX4?najX+PeWPFM4v4s_3sb{pyYY(F}Xag+-i z<(Pb>7Q86?hf;hVCy@TWS)F%QYY(Ym=XP%f@q&~QX(KA6~Fno9a@3y3Fr)#*z*7%a5L=G1q)u)lnsTGpUV` zBE7Bbc1LH|?^3!d6kohEb%+6}HuzG!LYGv9IWw4`kc*Zyg(0nHqR`Ki5$t=6S=@4P zS<4dNb&?Om4PCg`R!8j{ueQ*Ea_Z2y?qrj`Pt#YK&ef(btXf(ne>N>eJhDVF|2Y#1slHzlfhj=X_lcmV;E>BbsoHSFL ze4>)T10pfpQpjVah*ML6$w)2A%p%u&1(?ICAO?9C8$AY8&oG_s8%iW^zDppUWjdQ? zZ*uCo3gqu*mU;TQGjksV{}{KY%|{lwa$Nh$e&I~>{8ud<8|{%&3yHMp{Jn|A46;Nq zmOq;S240@AWaaHp6xJ9<062;JLP;V%i`wu8 z99&%((vhz#V(e|kr)z5l#$O;*bg^8!h2r6IL&Ujl>0EPCE30cTFU6wZzFz6#RQO#D z4vZkE*Y?}39jP#cQOnNT%!5|-et+!ZgocMVYr+=yc{WNE_10o4ey}Q@-|ln%R>J&{ z^@hFi>(CLFE>03xVx-)hy$F7Qp)}z~DBP%a`QWU*WTxSZ5-WI6Aa=y_PvqR~ueXW# z2Tau+2Y41V^r(EjtIA|s;Q4<2ujti~cj1Jw6d$A&hZ*D|vHUCRFhO?~ULPWD_Z9y9 z)=aXAr^rNN5D(`J>h~`VF8a}Mor6(=PD9S$@o`2lx8Xwe0E2uMxQHn`Tw;8|hgA1u z+?z?4g4s%Cc%ZPUkaJpm_sQq2K4y-IZ*<e`eCftUv^r0w?*348<0;Y(^W_nx_cHkMKG zr4V^Gy>!vS?*}d42+cn4J#T+MMj;+2F%{oic3zaL^dhn5#AtKhB1z4IFbgDz5T_cy z@b%BBM|sovMbw|CT4a0D^r!({C%0g-q9e?c+HF$%^@};visbu;OB*gT6&e<0H$s9y zn=l%;as_k{FB8}Gp-64LV6?9qx#ar1(qA=}6atDcd2}34I|Y=5))IBXW0Ri`D@B@) z6=C_a*mBtO?pIMj5QTW^zQ0rZy-_MB=6woi3J3k#FP%kLgJOBPzs;uYZG^CCZAHzUI+@Dfg2N)K&fsA$(V zG)DFPZ9^rP-}MMbTgNuL&!PVfK?4Gj`#P9!{h4%=rl!+9D#AQGn6ma-^_YFag;abo z^v3>`T|V522jhVkPG;s&I(1FJ&FSX(y!b=DjI>bo=`B^+hdLAgdGH(gkkt-Qyq7^% z6=cFt+9dw6r&*WaUJ5;bpCLQEs@VUDi2YT)+X#K$Z{jSuneGOW97$$gK zyZ7x&EictC&HxT;I*gZywl0RAf9%vEFG9S7CVhsL1NS0T9;2UPw!b)$1LK1&-)?90Yeyu_N<#iZS(7BDXEBKba z%dM&6B%O~jK1AuVh64%%@MVRw^u#~YQPj;_!CCr}*S(v#DEl@M!(<#R!^_%vVS)ty zF;6mD)$`62c<_)5t0AGx20p8>gPtpV#aKQ3%{kc~6*)NLKfy%YQ2br9gDTOsm720+ zdvC}^k61!2FzgTCy24F>8XamZa;0xygOML~@^=VYA62MEc)qT{M2xXlE-3ERkKZj1 zkH4v({wM{ao%Y$LqBK=n!jV2?e}tJCu}wxr4gx~VVK?M3v^<_^A2GQ~VXmR9T&iw?W)w#iwr%@Su^mI?XyBeL;h9?JRXPJH&+9CddH8=J+ZowYl#9QAM ziYI5l@Yr!MW=<9$Z|vGlI9_$T8dr`|fd8O)w@*{aj~^%sTO-5RDcnNwR`p)FxS%la9ZiE-o;f}k6)}Q5ZmS{%yu3rx5bZ>5{gvGnq4KFn8P=r zIE!zQN%QdTY@N$IZzlO{fPjUfDj&O{rtMdqO6b9HS;>SbqwMEk^;Ld;GqNf*xKP+O zc&noz^+jpbpqZ*GYv3F}K#%T3nD?IGCoX*(F5UEg#}RGw>})S;Nc+YgmzZ>o<;v9M zKc-(_L+}zTx9Q3uf_s(|wWa5!^XoBTFl_IE!PC2L^+)Y=@-|yj;81xhVb_t%Ums8R zJUV_3xU8OXiqWrdzxWrvfudiVD_Ve``h;DFx%LQ(-r^+{YJ{QPsZLME?kKfY25&$V z$oHH&avi>9HvcQ5Y|ajFE5BGqZSEI*gM8Uivj-hvR*znw4VPdEw?+qokWa_gijT8_ z;?FR^d@$;8QGQ7PHo2xyeM8^B_Gi-(5+VL#5Luf2P}2Dq7suC%kbCRb z0u>s!4y+m)>3I^jlgh{8!c8GI2$+BZY5zRmnn+#-P3YB9bSeYGkLmRJ2hmz_$=2h4 z3cl&w>Yf%;zH2}(TpOct+FEK*ibEDz1LIy=U`t=6ry75s^QDrk7uFBCT-_g?ASK{r zvQL0HiM{e=Y}SM`g9W|{47|=dH=AF(s)tRJ9owkC1f0B!-@KCi4Mfq>S=~)r><&IF ziQRYu6XXtT%j5c2=O3K&UQ*HnbB=nQAeF2nE*I-9-IMu&ew|QnS-1x@*n0r~_zG7d%>NUwNst=E%kX6c)kw%x z-K2q{+qH0n1Jeo#0iG8ZCHQkyW9G`qaMkv6xVWL_46jD{Edgrd^e5D@k12x;2fW#t zunUDla&Xaab_j8H_T%QBd{7_o=LD#W!(E~e=+)y8jVPRf*+202_c_idi4QSKsbD_u zPk8l<{R8J4TowiR?6b0-ONK}tS3&(y`^G(G^b-S`L~#`1V>)I2G2eZ0u~=nofm9_p zN*A}w?Y(I2?H5>sBhB#Rw(7EzD%a#;XRDWKOmj;=vm4+dRl;&dD#!{U_c}F$RNPBG z=OS1bBOrN7*7fR@$54>Ir_34rHOu?#N;(Y2I0|?h_MiPJ+P-;t{V(Q=$&!F)+BJj= z%gOQ9!Q5DB$!)#AZi27)Br3fLEeh3e@OBesusMf|t{lAlE>TLO5%34}Z)jcbpb16v z-CE#<`?#&@aqogzZ|FH45WVy;e88T!o3PRwH@LbFm+I`)r>j^lhN;|vAqDU^2I&sh z_UodF(2*K%4Ru-%_JrL1klAJlUv)G9@LizcByg{UmnyMiTd$@L(5L@XytbJ>Mhh1?va*nUUdk*#&9E&#r>acb-%_iqhVAY{9S{hfux5MikV3mCEGWl zV%NP6lS;6tIoL~`M9$!)nG6o$Q!(7C|r?rtC53m<{D* z1UYC(JlqxQeNLqZpLX`|{%rm+zeep*apM%AUgg`~`wJSi* z)f1?)4HE=7FUv^j4|_FI98X_FndJum!nFY^% zi}XqEZN0K@S?EEId&GZbN*NS{oCi%&!yBkg!4zY$UoW!X#@_s|yF?w{-W2ZhFsp+7 z7Rszb>0DX2M4Cb3L$R2vU__;7N!AyCEw_EMo&9!&o9jfTXXzAWv+^{_(NI{gIjOx7 zJTmBJj9||3_;ag6kZRb1CqDw?+1>&F$MbP7qGpmzwI2%*8YA%ZWAr2ZeS*N6>n_n~ z^HyqqqK$5Ji{767a6LhF10)wOt8ZVhTAz|6w$BJG3=A_?=_|Nidr|8&VNNH$9MAyrc_ z?u}jfoxYmsHkkTzsh|uGKjv7~1Jmt*vsyGWKS<8696>^tY2iHu8fKBr_IUp?=D8<%dUbWz7I?fH1uNw-e!*L(hd%V#jdY3BV zITx_l{xJdik^n>TA`t@*`>oKo3G=iDPnN9)AqfFs2)tR4N2Y1O!neb^ zB>11oYLR5~R)u>}sHMiANaoIoGwfj&gj zvMivyRf1=)%gi!aq=VwJG{CPGXdh*>s!Hea##_4H@ayMLiveaZ96Td1moI^`dPF@- z))Mjjs7ul9JNJO4z6acQaky*-Ll=CPh~8Rp1iqvtIa)f7w4&%kfwd0qty%kfxRkEE z7w(O>zZ5lo6tErmKTYl$sdWH&vJ}l=W3(E2yn^e`Unjjx1^Q z!m~HO2tSnrz5@E$#9?5h*mXo07``O~t`G=Q68tc+bj6E6j}kJ)6|)Si{`@)L)`wAn zG8NL_FRBl#Q3y%qMdl0bK|_J8>Lb{zn%yWRU&Me?sAJE-j-3yR15fHdggPudPEYir zSz2Os_TDs9LmTZiN4w~A-rVQ>HL0iz>`)#ohWU95b{N!70lE~ze|WIuVHo1RBCPv* zBymAvan6Y+Hep4rhUC{3FeE@2&`EQU3I!nL$ljO<#mK*u{@7o#6b2*JA}nWLUf z&8UmoY-Q6%w>$2@a)~i7Z?oh2OlPLUKf|RK$A`0*BT@QYAgpWdn_ffyrHpP>pS`0l z9jq680x%-X^|!51;#~;j#XbPNUXGF4-XM1%y$^H*9A-kmet%mwLz7|CA3p6iLJBzn zqofr~VY9Rik=2WK6*m79iBlHX^>gCvbfrc6?ozaJ#w-^>{TZicuHpXLkA zz&oEh!nyN22_7?8gBU1y8kzg{tUp$?Dw{C}3?c!&FFf9OR|ov9-^fIB?0^2JPR0R}(W+S#9`&Gk@P1DnXt4`o^Mv%&bEu{a#GUkio zT);+x=>?m6wOGLI8tu_d_a1B=vF&${UG~J#eGAKs$vn<}fx|qDHcq?@|^BL7| z;t+PJ?R@KlSD0YNyQ&MPv=2(gpBnUa}1#c)e}2YYOn~FIB^(k%A23Jr3vo z7?WW}A!?^9ze-&GIkcAj#I+Cg6JFuh#mvwB;)WRainQaUR(VBZ@LqzlL071~1ohGy z|J0Kh6P&>e+*>99NBbVC%|NQ+$xiCk#FuROFm6d_&4F?^V$!z?r8j}o`Vsk1NC|Mc zMh%yS3v5>iXS)hj)(J4J(nW{|jLsF<_DO^fnzKHa_9fz2hyU7M8)5}HM*NWGE=0s; zH41U|pLVDcQ-?u#&Ea6tU-UW8Eo^iZUw2l=z+x;bdg}DEex$M%+Z>s6?+yxM6N%Ll zxB}MiJ*X^2akeYHs~lOiYurFM9?0Q<|KHwH6t{){JqZ18E^Hi>m7+U`0Q~4hLI~e8 z`FsZl>~wQc{=#>TVi=uuP^o<)-|aa@2?lnBp1R!fb^A6Ba1YAnz*=NBE+3?q5kdf5$1an6midbKszDgT^|q=g9vliJt0wqj!d_9N^?% zMQSuj54jKa2}E!nWHS%kpvc%aKjj7G2o;lXSh4P79^S?6WsEfi=kqK@J+|mWRs`c+ zgHB8O^c1s+Q$4>T*1| z{RGp=DUmy?1wICE!f!6S$9)|a_UP!@O%Gq%rLhm&mSG_6r)i)p*<;kjg45ZTp*GFT zgngmCZ7=rcH33Ax0|1wg2WLP3F`{`)7B4Tp#VLybu!I?l2PIU|*{4tyH_Vhl1M`bb1Pz9xnIuxq;e2%7_|6`MRZ~--k?abts1ikyAS8 zgZkpjxo7JRpnWPVsM>&^E(4e40Y7gdJM`inF<;lxdd;Ydh!pUZOVc(1fId&+r&A{rixK<-2XPz!6J&i}%)S8`Jqqc85uK5ZeJIE) z!+`D3{K?1uo`eRz;l7?7m??Zq?F5~TE1Ay z_MF-vZi(CWbCnSMb~@JblJ|zg_TX)yE!8+^^7o3QAYVPGitWNs{hUSzc6ixR8d$gQ zpqR!7cgg26^iBM&1!xQql-<*^j?1;hkp1$jvFCC5H!Q(<{io61vQ@-Rug~fZ{%i4 zfZmO>A6>4&2CtoK$B#Q_Gh!9rfA=KDsj-rcM7p_nlR}V8=ghafC#`W4>%zZ;+vw3D z&vj?}2akS$jK&mVl*UVlF%{{>gPpyPA)9z>Oeg9=vT^UGm7(J0g`Pue^*FqQ_mUbu z?oimD^$NpmWtFlr)f`#7fmiF0Mt042c5CxP`Mpo4R-5AdR+<7vVutoaa&`(s3goEQ z{GJ@&Bn-|+3gVf(5V%18B#KhFYvJu*di=2Wh|i*cH<={H(?KT@NMn=#Vt5dM5ZJz{g56aHEzD9fTHFGPT8v#XS@<6 z&W*K%U#{L;rt?9e21ld*O&zO8+4a#!RIs9%CpE!EN_vuB3}Cl1Fy5Y0$fQ}Eg9jn# zMtW#HR_QrA-K=ha%t8h`cVbdCyi5;gK*|bCc|Fn1U&QTZM zJj=x4q0*UqLUKn}6@$%;_w4sD+X-iJ3ssZ*;Y$fQQn>Up^N-49Cq1RoQRPWGvY*Bm zjzeW8!A~FgXjLNA#zK*!N3-f+qpQu&{Nn9JkAkP$@j^m7Id)ursHtO_LC z$IHnL#<;MLo-m!|$~t9`K%J@W*FgEfB+U@wjk7^2_C+N*D9jH!Y=N*M9idMeY^3i_ zBfP=H%nutJR?6iB_gJ*;ek3wxhOJ)_14;n_qs`7ItBMl7n&NzF01NYu2_RfWVl} z-Mjnfg^+j?L$5D!CY)#wtNHD_swW=MaFwR*+o_Gk0;=Nhz}r0}dR38`At5UlJ`4SP zb!mU{=Yr`#(sbgzfc>vl0Sk3LD%4EmyX1?k>M@9%RXhsM1@GWR;d(a!nob}e@Syr3 zHX#vkP5zb`u;eEj(3GkcyS&*2e%|c{Jdoe$a*rsK!{ED|)^W6W!QE={AB8Qup##r& zU@=A5Lv}AXh*40CtP&^fIqU$94nY(TBrUR}lB|*Yk9SftYLRmb*wI^i=d87Zib>Jn0GgJQ z8?QzeJ;ypV;f*el02U#h?y^boTJDu;BdM7N}CHI zXM#VfSuR5`hkPgK$ji6o!7*?J<(?g5B;jmv=4uDvXssYMJ}JESh|>{M7vPbsnp<@P zZ)=#8Mu3R91*eP17{H%T!MDcm=0Da%sN|n6!ajQj>6%u+qB_f+zh4hHk0b^K+_xDP zM6D;|#R-xS3WE8p4jGaKV+xvSI-bNkumK*dEoo*$T;#BgD~wT^`=p=RQnm{DB*c|L zx8s~&_yg{Wec^w>JMQQ?@3_>81=`|5;6#A=?pGkLr~i*22^PyJ&)hu#bV@hrpno^- zaGsC-mdcLCdXh}v4ws%Bz1Lf@ssMtoc$*`eOhwFQn*L+ZqISA(a21zlewrGU421X) zDm54tek{%?r6L#pjJ`9#U-b63_uYx@95bgO)c;o6y7hm$>MoJzSSN!Q$i>}pAGGjA z>M)5;7@Y%<&A$102gPeQ`#|`jJeoUfMJFBXlcOMnYarzJHWU32rc@zEFFHw)_0g~G zH{q21OE9hSLfW5&!1?k7J6!<*@PV_M-$h4O1j-yaV zixT#FP+n~XcENw=PXtm5)UlvXd~_H8Kq7&yU?H4Nfi<-8L4LGEQom4S>G)AmTogD! z6TaSl#?(&Ph3sGdl$P0EWxJPOlk!rst2kzmA3QT(7w9wf^DS-HV&8gXqIJc~=*m#R z6fRr@cR^yj+R{hoYR!k}B^l)Gbx_m>uu60#@(SrsQv*fR{4&_Uk~ruuqenl&H_m`*I+)wuV(YvPzp5u1>0R=j2`}p4 z;%gu}oizcL-Q3mh)9@E>b_8t*n9LxY{$@zsWYveC)eC*2ACPU^ZuD^rlU5Zk#|hm{_eSas7jct%o&}Jz~E3&ts?4F7zYuU3$+09t88>1v`+AJwq9zvEO zX^fpL71_#ej4eAec4POQd(`v3-}`-k^q=mz@9R3(Ilptx@BFTD`Bg<9ZHVZNpE~@| zSm&bUV8P%WItIW?7z-iFa*hAnv%(ac)dsGVU-dl@MuWHgi-`r3;)(bdYoGcF7^JPW&|A|i1Y2wbzzIz!PE%m zJqxw0kf==svX|c4=+$spS$?Xpb=U98Hu$EB0u!I3?~W+J#0D&vSlrcx;AEC+sIIy{ zIbRerj6m43QK{;X;gTL82rA*_;6xhZvHJMJnB^+*(y=?Yk02*=tftzc+o!KLx^4aW zpM~po{!zazFXgXpYk2=%U%RBLQ$ADrSGFL1PSY)258ybRedKXIi|ZmADjwP)?_G=e zojNE}Qkl?QfmHdOF-O(WD0-gxz=-*=8<`F#FDns5O5-p zevn>z4`$@Jb}kUQJm22Wb;liMVTnhY#5Ko@Lf;b#5hPY&;uWoFP2Tc1091qJN$vHq z`Z(Sq8VI|J%`|Po=BKq&xle@4ok_8@;bA ziuav8t0WH_Gp;i19Bz6k8Pb|YEYH>PdEEHw3Ydm>Bl0Ot%>3+}!MQ1aRR}PkVRImb zgVTQYk>pQ(CzD&2!T?V3VPeXU!8qx0A>P+^eTA=hjjXCTf>`N?TnoSNB=P#YolCt7 zGar56i=OQ5hGge&Cqvh|b6dKeScS&Cn&0{RNgj%)U}>Qd0^3JVF=tI(tzmP&*X61x zoZr`Fp0?DEENK>;WSPHd&TQjoD0_H~2U!Hnt7zy4&V#EkZgLq6O8+vX$ne@w13A~Q zwlPzlu{4C4S9@2C6r|}@^AjAYnm6Lp|KzjGJ|lG3i%$7v zALPzdl=Yt6S}NhWeC$l7soNi0fZdT&^YiAqrC+C6VQcO;!nQny zL@-Op1`){Ie6GUO>v7Z&@_m{NO(-X5a({Rl-SqSVJu4e(r%dI3+TR=dM$86*gWMSw zan29rc2GZPUK4=dCFAK_4O*ue92!XNu>#gKt8u z3-SzvV)3y#n7(K@ShTz!xKq%YrnZR}t;K5`-tNfGGVrp$eQsZ+b8x z)ShcjH~T25(R`~j=>k53sKZD_P*d$&u=>#DoAVl5xEI@9#~d1lgT| zUk`JsKk4a>GJ{dzzwZt{#8f@kcJaI!3#Dvn$FzKWe2LAMr~I#p97`q&&xfiAl2M;znF#+7DsqTHb9wsdih&+=6vjANe$WR0&_JV zGDpMgo{2BZLihglCI;W+Q_I?ZEAN54_0u@=P=)96lZx7f_TulDu9lOK=T%`p(+L{C zQ7WOcYZ<1E?O>eHsBP}#2H)EaSxBB=Bb%a@exk^1ke$|p9mK7633Q!jK%MYeD3=`~ zo>uUX@Hu`@)OJf}>esPnVi)}P_S$IdGXk<(n=&|_4o6*hhyzQjUFQ642^5kykH10V zMT#`vz~&f<=R~52tsL5ATTr)WC#t+Of;wy)G~A5%n=;!6btbVhYA`5(K;M?SO<$dA z5T!Ma7FSq%Mx1KdsIu1R1U#m{SNPVZAJ z7ivOD3s=^ya>}f|5mO{o#>EM8RLLA_hTk2``*xV>QLjbaxFB5_S{P|6 zuWN)4$hsnZ{;l*nhs5=7%C_CKmX$2IzWioTs-)5EXcP<;tW^t$VIfJBE5$nsG_ila2ih4Ri zpl+ROj%koHWaLqSr~SsLw#jDs?Dz6hX$qUaR=}*v(;ZoGEi`yWvVTkV@^-n4=tfY`rV1;* z^&s8}0p2IF?AlgO_r%MB-QB6KZj9ZsOExzCb?%<-T(^q!6{%5vks8l(($dC{g&Gt} zIr#?lT{z7)n0RugfRG(8UbK=MYQKg3!jMWr{z}IOrHo^N4x-`gEXz#X-I00XUwjo6 zcMzBsWd(1LHKoNG_rtF|uu9TUfE|Hpw)W;aeVq90=$C`3 z4B=F$^m^f6A+N8OS{e~!4Ok%1(&GkIr41czFEY}E<=L$y$z79m22eqB>rPmgE^wQ| z?qtir(xBWTq)llD7YDaDm%m!KRUjK7sP;;6V5ar&ftbfaF4(T*!wqE%?6%mW?xA296vGme?1g$^wZWA3jRKN!;qEOrp#>l9YZ?8b zHigHrGQy$%*vvnP_Jj8gY0f{vg64uhHeTL^JbkV=R6_c6po7Q=$fGFzu}~9vLE4>r zFdMBtv#duxce<)mHcN1R9KAzb+beGUD+%hpLjVLc&Au01c)!Omt)Jg11jyJ(@eZ-i z;E&y$r=7BPp&G;T>$?hVh3}D{frEyrM(GOD-h&TLDy&{TDm~(Owy17LR!~4df&=T6 z*VT$~^k1g&SKz=M4?D}7&wi!ILkWrOb`%+5@!k2UWh!^Y*`lUco6r>xy1)neoKs_N!NN0rKsvT>pjaU_ zV@6c)O$m1!zf&6RO?-J!iQ+<|7*&vTu)|xR$hTAoV_+0yAa4bJkvpe%5DL z+-3Fuznkk6^Y&Usv87CnODkCcrZVEMK~4BEPsJ{{(?J6Qhxn+j0~C;a7LTU2R_yD5 z>wMyEH{jf2!ZpjgzT7QoEhoM7!R*P`lFTK;F0M*=M`-RG{}cBbHahQN@Z8P)FOjRP~RAG?s3_F4enK( z#d8e7IU*EzxM_Lw?*IJ@m3#S2@gE?d?_eDaa$w|eoGeP%PD7;vuYDTaCH!E)HS*5f0~)H_6nY@AhdoUXEp*e}DhT;AA$NB-Ora5tjPUKV zNU2dN0XH9axZB3(In2+n1zTlsDa|XK&^K*-@YU)n*R2aGKVwX6289kpYs!8$m>DMU~c9MpT)xRz=s9Q(m)MYI~{3~@Ju8C~s6|I4^Qh>gDq`a=_!kMjt zCIaIn6jR|@$2SMvT0@92Y~v#Km0r zl_^aR4P>$hF<+7py|Em(K6K)r6G{TeqeGifaH;tPf{u8CM^Cccs>JHlf`}R9Q6@i6 z*0w;-LSF$#MlA0nYc$JX#a#tZ{1Pn^eb|#uX!%k=&9&5|K>*K2*i zLU$R@dFBWl-I0w~72X?MMIufOHM0<(pKJq(sstSJ@bTe>rdHiRJb5CrK!EX=Ly`i+ z>mF?MG06c9(@Hz1?DuYaeoYVeEMx}VgXWawL;EP%Q(=i$Uc)?c7xO(vD+qGOA?Vos zv68I1DJg*>w&kUVbQ>&$Uc)~}%YT22AWL@`X$XD|lKb0qpM49A>SM>T`EKOT%N3vQPT6!RATi%ue+FzDd9JHGvPki;NP;<(2rt^H zvV*{cRG+U?{tda7O*-!BnC!qvn^r<_MV+(4OGr!Zf3$~FNpewXPzd>BXZ#0xz^UqF zNlu)g7MS$DdE*>$M;YLWGJl)rJo3yQWX`g*s@y>`*JwZJC?_GykrZn{YIlF(#7xC zI7mVuX#90$bFotxpQI!RY(rVPvj^uZbG@x*m6!z?8aCxqZU;~TG#Xk5eGvQwzF z+vjrX;u1{3iy^iM?WtpAKW!?gFC@hYFg9dGEN^><5BpUwa$`?oc2&Z?%TK<>;YfvS z%Wn>$0_Vw_-c-ulmiiV-;Luk*d2YA5zY77@xy{BqdY?J-+Ulhin3@tS1Zetp)8OGp z$~E{0J2NpcFx+$zUz_C!wr&Fcvt-A2)5<7sxF1o;F<^DF6`p$ld3i1p{yve6S=l>@ z6&hf|=4!DmEnQDEM?6T&qwW3!CISMImthA#!-Bs+&n?;8C^F{N{7+cFFmO+&nuY)2 zV{Z1?DCm2}E9Xdf75LTE>8rMxHge7Fw?pPeA+9OV=Jvg8&Ch4Yvh5{m{&J z{e_oV^#!PLv`+uR(eh<;>brt(pxu=%8g=9A$PM=yu}AlKM|H(()11E;1{A>wU)iq; z18673ozf+gK)UZpC*i@;jCjJU9FLi@a*~cA%-@Y+ZtYV$DSp=(IFg6W6(iiC(v~sq z6h%V5=fB;=;uhYPtnu8FPW{Mkj<}3GrMp}~Zn|9d=*hs|` zjy;Q4czCOS#Btdeq{|Ybj;pQh7k*U5 zt4(%x(n;-_jH`8U9ag{^(muBsDh%42zyvw)O)TD0#%|}2Uu!iJ_+sjU92gl1#B20Z zoODV2ujbqvgf|aNhyD11Or}B5Qu*EE%i_2zs$vpX0UIlrDq`vl3NZ-mqo6a$#8COs zxbA49xAxB&S zK1^3+iPP8o0n4t}5P2)MPF8EOE(^8GT#y>lcv0|P2PYhTRfxv##M9@D>zmi*;R74B zm)hZ8vE}`j!|yX7xnYI$$(6ZT$J^v*gZv1B5Izq_%GLcc@<=LdLmi1v+s`4e~Vg2KgB=Bxr8E$}@DI@oK32 z)$5SgA}7AwIHYSDDXYps00Mes`R;mhMc*5YXp+U{x&RU$U)Ejm-X`4u>jknv*`%bszK5@ z2nx5$Zd5&lpF@w6X9!qO{kR>;C=G1e8slfhbX7NpR>#j8ZQVGhE7QhA2X&on~D_s zfyXkh{F`+!oejB7zAP}K+vdX1-JH!dq`z1j;0{3Lx_iWv)Myc!EumlclZV@*c)n1R z(m8EhSc$@p-9WFJJ3085JrS~~8>->H*5SYR)I$Fx+?Ct`pNgDN|wK4V+$bnO~Kwx11-O)GDvKTL!*)h(9MCbW~ zniG4Hnhydz_}>2e2T~eo15}tx1wzkWUpertp`x6W#nx&`izVUGjc>Bz{JcO(Qx2G! zR4Db19%SMZGCld*U?9f)_m1)*xY`iu;exS5^Ju;mQBnn5sD0EdAG#ZWTr>8}RmEH{ zKc)hZ2xfdkDU+cESJixk`WjKF?VgITqtO>ZL*aigg!xK$N)LjKldQ;=@4&m8>!!c( zrb0LW2Sjsh=lO3fn|3HU;wW4s+97=dRAqSQ!x1QPLxydA3He}ksQ^_LH7HQ^((l@T@1eMS+1Oy)dXyR5HHNj_2 z8TLN|C8k}9OI6GjT@!u<`cMpw>@>ci9ET4(`-s4$p$cIc6c`_gW)&7Mez#bP4#UUD zDM`Sl5+f$7k?Fny%!(+dL3%za2S1g2b7S?AsFmFLfzb!nATlFMuiPY7Ux>*k?dF<8 zqCVI-l8k(A`8OGvp^^;FeME{9NV~j|7|f-;sWC8ycuL6n+!<`5O$3JTwJAU59%j#< zTd|f4R$I)KuuOTj9gSd?Kv-BIJOCLmd?c+?+ zwaFcQeNx2gU94eUAKZHTb!uTkg6>*~fUh>6`X3ZQUilA-7?30!49zSop89U#L(!_g z#xMXIS-jk>jhpy#^GrUZ27OS(LV~~aHR|0fpnDT~NUL2rZs~BroL>PHX_>@@YeQKo zUru5XkmU)g-G362=9RB$bT~0yf>$^O0c8YUeplOa=8q9zuQ}f8=1yY5&NmzliGb7Q z$finjCL5NJl(V=K;QlwuZOc2|t%FJ`{o){4!8XeFz+3NR89ZBRA$&Lhw2a@}$pB{R zU{(=SBUFG}adYJ4H{LSc!048mA|)+w?_lK)$aK`li%ZWdcEBa`vp?aASBbq%610?( z#ia_Jnpv|3L9r3_B3de7atfMWyLh=+Y;58@0qTL=y$Dm68(7iLk52rh=FM|LawNSp zLQ^o}kR|$Pku!f0n{nmHBweE5_zc3aZ-Gk0W-|F-_`r$hcc1_|l2z|Gy5TzjUxm=S|1!0KTgP46K$*mN3CSB5tdgr)%J;fwo zghhP5WL_49@>w6==yz_2(1|tDm!NKfaU`sMcD|xWE3%@*7=}NJiy6RVcM(z;)&Vq* z4M#5ziQ@(d6`^d~>H04sjv*(v;&y%*Ml=g}8+_%XZVaAr(C2-M4;xqUSh3l)zBG*- z+ZWecU-Psj8UK(!|C35mM#q@;mvE1hS57n|K$K&g$pqxVY0eFVWeYD5J$({+gzKA5 zaj}~NO5bC%3IwYLmB_a5?8^p+w2*T!e0VORhw3B0;0Gr_c)Do|>Vu|j1+1LN^yd}? zngoL0%OUe&^8C>Knb$p89PEk^s_Xu4BSYhbTNL)=mc1(V8&q3kPiDe2zh2k9&~xBz z9&@MuQ*$sJ~9CZpW0&Q zE&J1hIE-5o&LWSV+oMzgA^g$gO6}JaF1@y4$I$s>A8+=6v0BX&Kki7%-HZ5EiL}pG z1D2`Oo|OVG^EzP=bB&BM|5P`Ff|Ft*EHc95LUUHZ*LnmsTgs?aH9Vt|_RD^vI|oU4 z|50;8GnFb&Ly<|$;NVR-@}L|Y#u2L4TEcMtkm=4|@RcHkKF z;|`mKrb+&s%GJyIQF-{98W4xG4z>)BHRCOoY8(N4Hp7d*xpGSU3FTB7RAG{+{32-v z*2wAE%6aqYNZ5S@?9fg!=}2rV2f=nD4_=Ndbege!55*(Q*!X zAVRjlgzHcj^f5fz49S19F7Jgbmjw#FMecnRY|by_=41&g#Wfmi;vaxlVLk> z8m|HjkrjAfe0WGJRy&`5LZK`H*P;+|?gh`hrd{8}bp!X?G_wlLHX^c$Jb$JNmZ8AM zIJF%cLy7}*cdkow9=`m9>Ee>U(9_|L9_+ZRxRe{rkj?d`Y^+Cw<9qlal@JTwrs&T> zd;#-GvehBGP)Z*y)*AR;d%Da2Fl+%~hvWjZ_Fyc|oLNj zrpljOLJY0NdGiMy%W}{|8RxEyWzm=)vs_ zZSPu)$(yIVTrY#?$?frh1h|_37U+xijz*yMeqdz@f&vx0NRg<=zNGF4H^r>Zc~SKn zv_lTvUZ|TFa(ygBV_qAXESdiiRO=43CE0}XE;^n&N>gxbRu_!$f2P0Z&NE1r%s@N@ z3ZCe-8bkBK9}UeY3WU4Sl8v)`apq2B8N4jq&Jq4A6~}fVLr+b@%pJs50929Le3{Eh zIU7od(L5d5J2b?Eb@uG>rc^7H1k|(d=iA7@iSRK4 zQ3?e}gp}s_+X4aQ|Hbv#fX%nxt9yCmN5NNS(8|H@LmrA0h4KzUQRq)jNkTT(8W;~T zP3}9AP)P47cknH3fDIA`kE;HsDNq6bN6#%VKX@wl^^}YqKb>UyLN^WrhLt(&MM0e2e86qJqO?Xan)i<_tUM9Qsp=JR4PC+>qw&($ZRO ze`Yf4E2Q#wnelgGpb3#{Pe~ck!93B~n*AtR0`5EbTzOStz@?n6AZaQ$qtK|?buj4{ zZBDmzwpCRey}5cfm!r zbCr`t^FJyU?HN#ZWMpJu^dh!2zy1d3eR;b`rWuU+T($?KJ&HJa!zXISF^~35t)=mB zwO`+OEiV7z7Q0i{Ti@5_*FZdB>{!t|ozyswvHr^tg3qOa9bWU0Qx1Ark1YuF3fF~t z0jJ#TkZLk-K7EKs=4~W+lq$0@Rn2|6^eTtzWK%1}!xVr2F6m_eRX@=RC=@!^g)`gn zwk6A*omsY9xgSdt7B)`YAo~F1o z_C0nR6N)?AwtMwk)phTc<_Sq2bpmJaPM}`}Lksm%AkS6dlJ;lvvn_2!)a~upVTLsq zty9BN%y+RW;Iykrjh@q;{YZN3z;4enSwfLIF$?>S%sp2++ea?W>fTVs+u~O6&&)Lh zS;1W*Kh$>?6L536u^T6nDTGYeI66eVxsi7MV zmMNf1VE1|M?u4q}1z>8OLYP4ZEdeUZVho!LCB|#LWoEsBw%Y&?9;lf(IGL?~8Jea0 zAt6VoUrm#zLA7{n30a_+?sU{SP%u>5w>|{cFJ5?LacOlB7$J~tI;pT`?%gVQ7 zOkhIe#i3rUjRw)9Vu4-*TPW=l^7$O%D-ZkxzKy*uchJ`eU(O7xr6~dul_XfvS6H7H zCd+Hx+0PGr4OnsHD?W&Y$A^U6(?kild4*7H+Q$xcA_Im2wKC zL16d+2$`Ypa~;Z9{xS`0L+qitf+TD>v2{OD|7sNoQ4(|-(uZ93Le;@TAhJOJs>kh~ zwfM6Q=_)PL+gNMXVzo$V6jj`~BYP2KHt`Hiw4VB0?e%9#;p}2NU7H|t`nw2?f6Je2 z0X&lCk0r8S1Hkc7ueG=ZsSxw#YWN$B%#=a9?*>-)GULh|WyIw{KOG#{CMFm#Tr;i!)Scux3-9!6< z9f@#n4%!Ejynz^-Z_c*EG9ILaG?xIz9yyX}n?nlvOmS-20sTPIxvx{gRjIjmyY)I_O z@dLM6{$pFKL&k~}t;?f_Nk6?Cd)+m)u5__QcJ{#;lr?}YW6w6sFZ>9nm>=(6o0{M0 zDjluVB~-HC*sO9soQ&H^(sG8goeke8S@dPf`U;&RRVpctIUn zVdc~Ov`l6s6zh37bcJt5))E(BhOM#Z|rKK9d#C;qVw5dQxj337WYE$cc zQ1BWK5H8X}+_~DC&FyxdmS%_91wY#Pgy9m8cF{`&)ftCL1b;7<3?Es>?TgnHbh-?`|E>RX@0fK}V$Rz^~!IElTT#Wfa~eDWiZ z=E%#}(j*gum?gb5D@sO7@AoK`VjDwsYQ9XaPIMCVdH12p0(`&^guyWBaLxHvbUL16 zaru)M`aj=CCEfai&gNh8Q+amvcoi<^TNLN)@i>pNo2 z>f4Kz?eAtge6omFLGuU$HI|9j)W2zQKWJ>fD(P~dU&3~mrbjT#y&a}McDNi* zV|=n*7;bh0?bBWXj zTxV6j?V)RC_(#`HU(})FkD*NaMusE>=>nY=d&+uOL%{fyEAi^Ha1498a`i zfnmW;k3L9b>Y?)xDv3=*^cy*A_}Xugk4?etYmi#}7Zq zQjdy&VCL9|EKdZU(Q2?RX=>g)(A6{ISCi?8*~F_vsg< zBnFMBt(u$_N;dc=5&_&fw&`Bv%jCwMGkmE%3o5qR*9&HrKU#D20(sj7RstqTg3`ug z7Ki$N4dZCGZS|FPJ5jrBT~`L88%il^UKvTRJo#GD_Kbl3;K=k*UeYuA)C`0%@Afg? zmkR{r=YPNPQuDM<4Lj8{V~zk7)PkhJwXJmcyKGhn%?onv_8L_+j%Wi-NKe2^QdKw^%Dg=aG!@e106{=e_*(DSp zL}Y|LCLjA&7mpyBDbK}o$}`fBx8-ppvUL|Z`=3g&655KIpzkDEVd;{(cnm@}2H_TA zi1IH1b4HZ< z4CrEMowGl_ia-RTACldD&I4r+eDxD!*U52arDx_K4erFVylZtB+Yxoq)5!0_K8kKJUtG=VCTobWNbH2N9e%a$c-&ZA;&kx?Yfj+l8&@Fu zIYF=wtYV(U;UD{a@=;2kkPT~zplX~Nd~IM3+I5@Q9aQPw!)sUZt}wMJZlrs8{Ms^c z#}?LOaAWc7hU+M-O7r|tB5GeR)9?6#48>h*+9l*!JL|>}D7Z!mEBqN_Ecf`sLy~~D z42(|0EL0j?J=yUdAx`VH!hmJRjY%Z|v9iPD;oz;UjhS3Ha_)vfCTSt(*R%-l-sH@G zfy<7A;aI9Z;VzrqIJxN&@POC0D-;c`>Q_Eh=nvG^QGEjy8 zZ~-E8x}Aft(ewy7oL`%?5Y~R+~G6o6Knv{ z>55=Pk*aG0mI&gevsXg4NXQ^Y6@zTm8r~@2!$e+6mk)@k&?s~-q>&NyYqY`J9AtD^ zhS?5{@+rF)L=5+6!DTw{=(^W1an1mTHMza2iUlR&3SSjqU4&bwJmfSNM(~RSM;sP(%>bkjeu}4} zytovWmMn_>M5lK%s8k_dfRHZ_lB55<;dO$!k7s9!Acm>JD_;1t9h8RL#s{M4^Y$SI zbkNNNld{oPWhI{(kBXH^K%<;6C;iMnt*0ojHG*o{InCk%vLd1HVcOu7)I^uU%Ii1_ z+M%PU-eh;?r*qGuE)*_)H0&OZFZ|%Cp1}b#!iaPv%-y{SEDlOROh{g4yCn*~I#*0? zrg^9)j^SjH^B3pr^c&}4BVh)RjRdYd~skgayV;;-HUutMo5ZM`Fh8qmM<#eD|H#CN_R-Ya1^}{;P{_#-~+3@eN0~ zUl;CHyf)m^)ve2wd+VjLieqL?Eja|}5f>b0u%_aLwl-@3~ zcJ9pYnX{?9?m>$K_&@wC5F4L(gFgou_nAIZinerQchC1?uySJn?Ei@ zSAb+i%y~}%=EF)V+JC)m^01nmS>TVA=jyvM3WqnQH;TRcUZiC9EI51iIiI~pyaq}{ z2da!&TqbqWdghAt)H=S&?nGHWSYIL{m}y}=_>-r48i$HEV*I;66bU<4QXFRcYsx#aIoIY{rN)e+@aQwy0jKS7w zS}c@8hI}XsQCn;Z7Ux4^r@$e$3&1DQEYg+(JRdkxICJ7_*52w*3jrnjQFB9-K9O6? ze`A~L_&{xON<22GWxcy=fB%*YM5A3#>X|}|V$fK-P{XMSo{>;&PL4{~s}LkR`lrC4 zooGNR`1sIbC!aI3Dmsk~Lzva`~$ySU>joIRwSAe(7qzHrM!Fn)2w>`ZI zudwBzUoUveZB)&5StvS&>y_-R3TOTE|gr|+`5rYA6dY;q| zfx%*GaTww-U=lj!%+DR%+|6?Z)IHu zn!)VFB6LdPIQoqXZ^anCi^w8-o}70#XoCnb6zf;#p$W#ADx3AeLA^m_qDz=x4I7iV zz}mT9JesY5+5sLu@srP7>UyMITW$}V=>J&d(P{M`bsj+Ynr#q$faM1u3tKW>0$6Yk~tbmz9qz$$VF$~5a-3-?8t-^sA=CWAyKYP5A;OUtA*r}oAOyPkXMeDH=GZ~?|eSh7r)tXMDd$e5D zvxsAH&h+#}<@$dUW_Y6S1quz~RDa*o79^+f!kQO7542aAoP#UHRs5*VQ{O(%?-f@y zO$CQo?=#=9a}vWfD)k+u(F*IWwa_zPTjb$Z3z}1{7)oT}F^mnxGu^-(2J!#>;xYJQ z>Gy91y@2y);r(zpU-6!J`r=%>Oqol9+@!TpW{d1P` zi>Vjp8iqsAevD=BV2|Hzki2ZBtCAyfeg}$26N!6z?{8X^cl1pYyltuAH^#q#eyc*M zOVplkC|S-#c`Y6RDF>cFAO5|)Xn|Tr%Q^bd9x2nzN8bEB=s@p53i!XljGbr^Ypes2 zAcmW6n~c>EVV3~nzU3Ue04ZRRpF?m?xO>{T={(BZ&=Dgc>jMrcjZmOPLJaa6H;YcTf54m{r z)Jxx8xcB?W|IS=Bj~0l zH-^vry7K`P_YhdO02c#Q4e`XB7Xy)N3Me0cr`nqcL?RUB^%!j$hy_h1{$F*+waq8g zd@_?}V?f_7{m%DfkTgYlKgWHxPT54Q;EGph<))}N?sQy+@=9tbCHyfcVC-g})dw|~ zMeL5R^mVN>f=Vgmlx7{X7(DrzjQ_DQ&OAnr~}|NexS#68C}XfIc59#ro@zfjVkROE_&|0~{RR zTCA-R#Zp#c3=ecVHQ1aMi+r*UcuNDgJn_#rM+979%wyO`IH%crbaL#j*`k%SqWnM< ztdv3)pTz0m9BpFy^<&JeX>a)d?(z|B6J2+#%B;us-e^O5h7OVOvpbQA$Ysq4e4M_z z{|*cqgUOXOPyYSD6{eCp-zt?X`Sc%kIuF3T`MGa+ELrYr~3knLEBiP-s`EH zk8=dkUihE?co*ob>ST{y|Lt8GjAIQi32;%pR071s#P;wClGQ#J;_aa=yAdPhc|5hSq+gUq z5ALv1aDfw&!##p1K0jZ+rK>ymHM}A}9M&t#^)CdZL!3_R*vyXrFF^f@f#9ZvZ2u7i zR4F!O^heME@fY~+aqb z!}LiJAWB2eRr$*_&t|i+f%8y@!a7M&eNt}@G4j2Rh>;@zq4geIsO+l`+5q&=_h9Ab@YA%2@tDn-uV63&vX+E>&xM(RBuWEJxc$yoVW5EQB*oy~<$4Yq z{IhGuitSRmfFr3lIB$wGT)Gd6brbGF)wgg5X=8#G+ zJ{(&L&;#@ipypZzxz(SNOEfmC^9a3=08>yI##H2trB23G;TZPe$&+;-O63c=_qw2M zgY!_%KVPskdJP7wRy%q$(9~8rorAkDD_MQgjk=}T(Tl8ego)ely(cpUee|0hT<{#X zF9EVvv4bdtq{AP6XR6ke)|XwgSqFcY{!?E`y7t6dC3ML@$_?m~Br5K^{n^09ybY|~ zd-W6Q67(EhzRSllyj&ISJb9*&JGl#MBCXjk-FSB6MR4TL&p#ez@{~`DX4T zCZ<#YfKX(0{%hP@@w*SZFpUO(uj=(b$CeYsf%u;4*jjJEzPg z(pLmswR2jkVr47!lS6*12htpZvDW%D3b*X}zmS3XE==Wk?>AXmv?8X&b!58f%1MUp zE=UYR3TK#S8^sU)_0pQKjZS($1?~Y8E6jZOJvK;kwfMS4x|Lq-b3ui#4D_EVx4^B2 zg>VvI%6bnw{_K*LttiPZNbXV6Ui*U9$Q}?c5{OJ&63Pf{fuzkSnB@%qFee8cV2@*G2)qUNlac1k^2uyw`RPaKa-5no zO!rY<61<155Ed3}IEJ>ILz2i8PTstRUGfJViO=C$gbd?WG$fC7m=5ke6eVq`x59v) z#9x{`Jd*D!k$4+%Gz{h9g&dgt?U*(v z${XY|FE%8zEGNBx#BjV^4aA!@#!Z1mYQ9|e=&5mbQ~2|H_WliI;f|c z?kH4AanQm$T)m2qw|YIy;VGwlc0O9jL@_;bac_4Qs%zQ)a%=u89Y4*BPe(2p)+Eh_ zC}f|$eGG*rj+DzQo`CG-yG)i~E4md;JH)ZPJ$OUtgn3ubM34 z;J#JDcI&61g3Oy+i%Y9)`GyLxTuSj9%NWJcwhXK)m8bA^OQ+}%JBDgg4Do{hqo+w~ ztvHVc2)UCM*tYN+7xqL${Ryfh_En)(TxBSu<51!L5Y%ZqXt2h~x~xCm0Zp_s4Z=jd zs;}(?xvWRV`%2c#Q%f@KC*!#4YjK|r=g`-+Pn~oSw0}t$C_p55M`kb zl&O?Za_iKoZlR>N3gAzN&oXS2g+S4f8EzO^??8z>t!X6bNIcYvhASVCgz3pauiqyx zHKu|g9(d-K4@*1$5vEB&hY>0&%nj#SS<9^UeXya2^KN%SxZ7Cms%o263S(~rJDA%@ zees&X_g3_QrhEE1p5Lu0oX~WPMi5EbOuXtR#{i$!I&CSJL#T<*So3p%N%h?xN<@ln zAew{|eJ_Lm;GPx3A8$kvIi1vx_{jeWd+|h-!TdJUwy5LAeLnNV^&+?RMggh*6sD+L z#WiBwoSF0*`IeYTA!ExCV;RvsYpyp?8KBmulvL`w7`AryOTblGC>X)bK1gLu2cM1J zLPhHiI`9nzEPQ#EnK2iI;vZ|k{rbBnrU^4~Smd~Qp(Y%+RPB;YcuE50r#yxc1;%bn_ig+1tw&bA?$IlKcx*)YAiBj@1@(`)Z)N=7vjMZzdMD z#Q61hXFWi9*=-sx1HsrtaHoqSzk~govWw8&^S;qqC*8I#f|`0_8faE9E^2S=OLaaK z(cqJMP|sq#Tel^2XDWxT5Y_vxO^yFy{eJbu?wqFN_0>-&6aU(XNO~`5aQfZk-WBRN zvtpltB}#ZIrF8KMt}Q4mDV&AxEq1LH{d%0sQQDDsGO-mf-qPElBJF3u$}Yhr#9|BY zmr7SGupTT-W-Sz{WaMV&%|{i^8M5O(vU8Y2_4F;cQhnjfw`@-hMtZ-UlIr#DHoiSv zAj(~~bCuY0-mM^c9e=xX;C;8S|%-1X&Vy9Rve|27CLQONli5^gA`gx z>oikJn`%niXr1qM&xCV6-_P&&`}g<9IgiKtobx_jbHDD_bzk?jKCkOa4z~y!zl9W+ zz?2(OqAX)9)kWFFgYmTB{PJPfPr2t86<&_~u0+o!j(lx7XSGg|8xfx@e7;!x4PQWK zj=}rbI#Knkd#)zv*x*M6pO0>RcAF!Q7HpV!CS5*eYJ+dk_`3II)XYY2T)XL73uBx~ z95a~IdmCi5Wr)v2eBF3J`q0E!?g?+>LsK+~W1ENaUU9nt&7=J_dAhET{UAVl+-S*0 z*JJJZ5A`;`YN}oqKTA5CFfR#&lJpa8$6H*_}}?U+1s`O(v_ueGZ-gr$p~KAO2mBk@h}(?4nK z)1VJBeizm{C|u$WHTKnqr{px6y{1~uPK;YEhb~0j62vH(Sg-L@wv5r*zrjRKW*B9rNO_CzxdtcF?M;0pgOzW0--F-VhuI|&=N#(*FBN7BlJAgA;1{O>Wd<(C9 zZ$8pvG-9gKW#qxwesQ6$LE!$j8kPH&*^Es34FoiNKMdvBgbPTIhHYe zmV(oCqSxdRnRXcP_VDAEuXYx8C$;$O8-^bx&~YMvvC2-qzkSyEj2%|J-9^mw zYA+R*QWbaaK%4W1Z&5li(eInfq*I{xVubC<1?pY5>jW$xfw??) zpznGhyYhn9wy#QdY1M1KNp{&bbVvKeh&N~fa6Z0X{zCpYE#>K##e%e(lMV1eU!JJ4 zTRg>U)4?iFSqW+d1QBE)0ZU}7vNr@w{x6>_1jx^zXm;)}UYjzqJFD&_G-p1e(;#4X zV8&vcm(Xrlie!gvrcxeIpP$tBa5xt{Spz{R5VCxrg^q#p#%=%X-&TW-X!TWrk7k^c zxs~QjFNpUfv@S7q48Q#03W}GP2W!7RtKA2RZA*HO4!A zL$!iYi?{FSy+Gn-hs?a;)a^M*vu!C4jH!Y+=llxS0d(gv6d-7Z-Pq1m8)Q9bqZt#|L+bzz}Kbpx>`v4Pe{>seAB2Y+Azil^Or{Uc6AHtES?IaagkD8R)GQ-U+;!q=>R9N8Wl zK)kfYuaj8)mLjF@18~T)T02PN)Om+*zi$)Y{G>SKkiS_%3|4<^aPL?J^x%-xi&= zy-xQ&xSOArKzsK!najU2H+FYIKf>?dUevsN_WG`0Y*1a{Fzu`a{@e9ytAvo$Fq|B- zS9@1Ou#-|}JC0>!(jAYn3Us|AC{xOgYZ;W+*B5jq*DbPyQG!t23xZ3Y(KG6lBlZ2v z*|4hyRF%jewCUop^==t&``8DeDGxL$vVh8Jako=Y0+{OEeYr&M07TL#p6wu;_2ofK z@?pC+N$p8*rfEmWyjqvOB~NO&wWrja!Pkq}fEpc^FUuWUpC&-t4oNx9Xrh|eq`OSJ zaDVyIVc9H)usHe(KkaCIG89eB9fL(owifOZcfd}DEbcL~PO9Ixq~N(1=@+N(g|d{55tN<|Ffk_fZlV=|RczQ| zdOgs{!Gy839e04%r5VnK#((AiMTJ42)Zeu!xyTRkmhKmSNc?1F|dmEoHuxhPk%KP(=ga%C=c? zJThj7@}}+1CZewug2s=HGzJF(+)|$XG=a|mloKX`vGzA@j9tODGb5kJD^eEEFmfE%k^wa%E@o=y@;fM9V7gYSo>qgN%8 z;ZVT6KTmX}lJ+KThLlfsVU1JanyIFz7H4fK zMJCV_^a9r-#BC2xwhktTM-8tf9ERCcmTw9?zPlG58ky`n@t3k9gao@=et*ivynq+* zJWQ9SJYM!Wkkek`a8_tRZ|`*}R@6vcGvTx4F!biYgN_&0@EyDwy!>@zia#{rJ4x2@ zxCG8-&SJ|~Eaz_oLkD`_F6!ODBPTLkPPab|+`uX$MJ6^MZx}zBSrjtRA=FZL_@ieDV8(=H(tUKr+~11FoViw2VC0{T;GX%) zz{iNSwf-Nj`7GkHF09)=+?oZWUsu0V7M1Ezj$$V)kL5JW$uEnaLUjaK`$rM6ml5$ z7$JQ+mb7g%v=6roLLsJZ=qoX?S0n~CxkQB!R@XdKz2!>xAstuRc+f1dofkdmafSd} zE-OE3$sduPGMRPTM=eg?ym{tgNrqQkx(Rh>S`fQ3izB4B*r`gqdbm=faPUo_`d7&z zbh%=BLch`_)+?8q`8eO8)}hUeYUN#Fd_03>8kK1pnrnj3S8){%X4+x3)c}N}L+;4u zd`)KG5t!FJXXOeQ`XwzKXKj^!}6YNi{hPYyhOlky39^_6Yb(uHQ|sw4$~%bcI&0sfcj`kKJ>K!PWAvxe%ndTB zp9UWmU+Vetyl;tD3fOWek+MArOyQafy@vK;IaAEqz6bgxdLoMEX+VjI)$E4nC8lzw zaKMl!rj%7KuXS*U*nRGJ`<{58(Z>hU=3FFXOM?3`@kR1_pt-F1t_LT~aTa6ciXZ$_ zZ$g6lkvP9~Z`xCXwsE>GeC&=1t){gamWIa$bv`JEyW=twy1xTcI-IsbxFDC$&#?zVjT&*!bK)HA=XHPz~0YmYx5D79BvKPHE#N95*76}?+-U2vG zsIv3HotuexGBqG598XJ($HIe9D>0~ z;A!w~&jFX_Lrq!7s&{;}0Bq0u`pea}MT)=hihHI$LF#EZpJFF~0R~DCGcOy;O=(GA za~ir}L5HC7&jPzuQ;Mee4|#JwS&aF`x+q6QP51|@pUDuij5gv-#T(_O(z|k5dqvXP zjq4oNd+OdBZK9t6M{0*1nAUMAoF|*2c#i_IEuv3y&ZyJkvweATxx^tz z^ytdO`JL_FFQ+T!^_IQDV+4+z^TGZT61p@t{W_k=7>Qm{<|7A606z<^;dTSI+(mU@ zDvA6^)P()AC~r87>*K8C=?9LPT3c%o4B5js`dFE?WjS8h{Vlb?GK46U%NdeN>mA8P z*~>acDJIO#v5$;LO1bW4rvH;n)0u}~nU20O1!?qNN0b{h6~c!-)jCCGt1RLjc1Hso zcH9JMrzDvW^FTDGD%fe1Gabcox341bAFeNDOR)-nYiRz~@#aL{oLUDi0u;0vV0^7y z$4xg8%W`vEH4q+SvK*uRMkuvj9Tk8DzzCQbaC7U;*~GK;0&|yUPOKpYnOZ5ry^3m7Vn~Zn&e9P06uq2);;5Zf*6l90sizQeCsbk(w*H>a&wR=PehsC1T zSon4s`$}dTU0Zo{21*3hyFr;y%f}lgVbb5z*;ZmlqD2&|V1ucr&caFf zV!DYx9hwP{i@m0Rl2@kdS%HugmbF72i*Ko|3MbEGgOxJ~8>4eAvHNldfie4S;6ai^3s#0pvtllq# zr2!eZ3dZYox-4C?qybi|GPac8UYQ>31+lBq17a6CiIETDZP`FIjff*1LToV8nv`9; z1Np_zd8(AFOAEj3VDx^Bv$;wzVen&$sT`3xp|{f&W{+^qkLRRY;hPd3ppZ;gSBMLl zsiRSt8d8;>rZHR;n_}b60F)O@e1KVddxf=V2}(^Uug%?I^WGckRry&KB?9U4r*b(1 z-ESi1&1a3?Ey*LnARQh{#Ckg<&ZVt}4PJu{ZWt%p`}p?Ef+nv^2oB|3MN$N_*SRME zB3XG=3$xt+V{is%%tA01xtR!L+pwK%VQTn~ed=r-$&|eR<-vP27aFddYpRpF)M{53 zZ1g+;25{oB6WY(JoGG(Ix9D1?9CB%{oqwsv`Z}v{x-Is^3Nc!)ag+8~S*wlFO30+( zg zj704)a(jXLJi4b}mq;)u@dDYmptI63a8jXV|MST4l88qxI#y^c*zC2mI`z?_cLwj- zPXdo)GzXXtkf^QsgDYtGn#||t7PznaL+Wb<+vh5>_k<;j!tuH-qJ;QX$&UX7ib7F%od8+t@eQ34j~ROVnXh8sS1v>nua*- z7Myp^E|)(5awCi55jXm%_#dZawL-o!ckEEzBJxH!DWzxGZw50N%=r$Gqe=v%X3&`( zC`9km$L%k#Z>FtOId^>_QI5~N@`GUQ$1DIWFw55gsd=EJ_l9~wTs=SC^y2PyN*CM1XAMC2}>36eA5wH zaDnf*!dza4P*j2pcOlhFQs$3-x+Zvq)z zTLs6mztCeO7Z-N43R(6Z-ttBu`*j1F3le>$db#72P>nU*NR6>N-{*$}|Hf>DvF6T7 zO8>k*Rwi7vW$ug&q5dO1ZrbUc+=G}|jv)cRH2g6pN`_DmoQsq)DQ%Qu&LS30ZitK( zNv377=+m9Xx`O|>KflrZ)jVw>!{9N7jG;pmEo{7WrNgrod)%o!D+c=TVDE~IW%R&Z zf66{#h;kEySRENI%A7CF)7=KeTL^7g?xTH)OQ^&Wn73z33H|Y~qv+I1+knd49EBZx z={S3+G#YZtbhFl@J-2*CA%XH!+J-qGy`8jtdUTI>Gc}tl7szkshJ~ zMhG7~f$^Ue>K#8S^iNl-U3mI>TMIQhTWCEU~??4e)-Jh z$%DAryZ`uXPlH-ProDfzDI<62goMCXJI{{3cZ{nTOnl;(%B**biUeNTF0dLr72c9y z@=OgmiCRZK#8q>z=$}pKXl^7{hHhOjyHGnXQ|?pEY{CtE?H?a-q>3|H7b0YS@ln%p z90f@~1G(qP7ZS_JQ_vS>>Ekr@@82In4Q7%$OrV3o^59evVt7DG=)^N6>ZlP-9Wi5s zQ!J;eeJ9?<#?7C9@XW>1FZXZJrK9TmPTuk8gMxK1Goj2!WMQg;Lt-yW5%t3KXxi^7 zgG)+bd;{LA9h#|?|6?zMBIOtulk==5(KOeoTi^Gwsl@1+53Zh0X_UiEs6YFgTTuov zhqwZg-!-m>WwsiPVq^I4C&Xu)^PpSEgU|Nue*mBevUGSr-m?scMVtdE2V9`bh7lDxLRPK>5QDJ@*$}A~~~2*P;9J;%EZ8DJnYQ zC2vs~36L2B7~*`1&BnN2B+f7DNUU|OEhD<9-H|X|z*5;-R#2)m(y4m;{%a9_Hc-`S` z4ahD2ygZR{Eywq_mpTq_%9hhfNnfUI*7Yuwgp?g1VtML*ZycD?O%l@x59+Yw!>l^x zTv^~r*#?aWAqlA36r_xBca7_KRAS8KfzeYjsSf_Rlw4AC!4l`+7WBYfm$HEP{o}rE zAC&%~Oz$Cy+FDSgKE>_)(c&ObZ+r*DVw6H`p7B-6mXFHE?f8TagJ!;beRJMQ6#(L| zD;(Ns_vuc`5%yFngW}rvmxC##uei0depA36cS*x7Kg~yDPa_+K*J~?*==FHnF6h$6 zX#DfkySU~EET{o05s?rJAt{eMNiuKHmDo*li%DI^9QU-m%}wj8N-2BkcUV(ZqeV|G zEdFtNSZ1&L=<7j*Xbzt>iC#)^2=wyujJFRNj-|qw*{2w(_)B;nw~yUo$i|m$mTHKq~CpL$2W5*C*4(DpspbhxmjhV5_?)A6e3@mo*HYXhn#u3 z^;7FuW_tk4k}^HPSOn(N5!opta8+qD#+IqEv+|NPsS4GEDi{zz+wa}}vIIKq6qq`X z;+6^kiBRD}E(hI}kzn>hC`E)hP5pVS?!i`$vur(Mj#pZK>%%-hdr#{=Lrv2qm+hB% zDc>&|S}=o4pV0)0dlW#m#)*h(!f;z8Hj3${k-poPVx$Rv_DtkVE}ZPA1x3w(3Ws5k zfK1=&tCQAauSrcwXE(OS+lhD)rz_JY2jlPOc(-JARzFbXYfP!iYU&v+*@tH*>F&&% zmtu6Hw9$TGBSAj-KE!%`8pZjeU4f-%PrUaFlrpjFEpU_7#DeJG+~CdPje0u#d}7Co z#`(T&#LcyQrdihu;eRxGc_l=Tj7YMtaO|sg$h!Z9+HJX8l`rV~8lFG3%sM#UFGFzP zh4zveSYUnJEg?b9gtl9u*_aOx)&=(~_|Alwvt6Dja>Xi!n3iwc!5qj+J=3980G;#a zHESIG83q2~hDjVu<}9KYCx?6fCWvf5tB1_CY{Wpje%15po@|N7Q1a@wC8KxmfoIum zC)Hsj&ZnWLyB^6~uT$)b-o}aeH4sN&-UU{e(8?o}zCy#}5rzYvN-^A?2dz`p`J4=n zmY8u;4|C%D9u^=*sz=PIavEt>7it||Z+K3U+#yhJ5$~UklEol8)-+uFxI_UOJ?4z~ znikFv-~#hzg>nVNF4mRIti4Gpk~uz#odWL(++9>%n`#^WpHMGDT>} zc7Pmi1hJ2w{EbC=Z-ePxGgKP^Row%GTb=EZtR>+~Wh9r0L9!xS|_E)0Eq5lL8YtF_?%dub*DgS z^F&))A2UHE?iU+2{F@EGPP}+o8J5#&@e5F&^iwRhnNtaC9D)q=fZE~;8&D5S9i*v6 zXbj(&_N%;6WdsqBVrfep`w)Px5_nwW;-p9zxLqH_Z^o-!22dsWD4$t$5SW5q)jf!| z)cv45Dt(kUo&>h1rfXu>-z-&wYQ2&_W^o zVwnhE`r&#`Grd|Cl1f{Cx(omsz*Cv$92C`5RG_fFENOadlOYcvZ z>7oa_wsAhh8oW=cQ8*4Tvi^Of(_@EEXKs?dsR~J=?lU|1{N}5$o7|k+uTP!5J;hcr z`)953n|$9ZAUVEzDskIF#kMLRVNdJVe)v1jh>Ft_aAmkrU_eg4c#=sUxB-CbbA3X8 zXFto1S&DAo3^0Rn89+q!DsStOZ;8!+*1cTFL-Y^2Qz#g7aO?3{MPvaqcc{5}M`PsMIW{A}GNjNeD zMu(migJ9lr2R=X!Vj#rL*^bqRchR7}9Y+_R;fN|t@N3@cB0g@4s`@)8gnIwVgi zqvBq5BMCA?#kozZbAp)fz_IArOHuB}Q_pVRXsv+mUb&%nXwiPGMU{oAhHnx=*CcYA z13A}i?;_{gb26WNeQ~8ZX&HCKlX!m=Ybt6=BaCKZ&SrAcguE6b&5`Y$;wFIH_`V-x z{WVnW0ua}anZlO65bG!Bt5gSn^c@;08ZbKY^JZO?NX{%T%;{P!(OE{0e)+sq6}x2uOpk{_#kwrP3aov0O#?|$I$VYAfH#4}IQ zO~iBG_@3@ma(o&MPRNPdH<$hO^sD<7A!w2iFJ4vT?@(WMiZ{Pux|_*q z;Ka;Mu5s<3da-(@KHG}Zchcw7D zs_t$v<{EEOgF97swuTihQjOkJ6k$}p{eS3Wj+l;j8k9-`_?6om2A38!ufqAIE4Fu> z`-GAsB&Q-@<0Df+am8?CvxdfBmh5ow&uMRAbi9}i77fqw?yJHB1s`_8pb88&r07-P zu4y&K?xq@>tk*)w?${|R!M3jfJozt+_!JLZF++RveFmOQ8)`K(!m4L-0Rwk8tl+j! z%L2#)_tbvW(apHPy@6bzYAZ@R4#x2;cDrBTNM)I~)j-}nhb7<&E`=%^=-k4?ke@6Z z*x~;4?gf~GjjM=$COl}aG?_NZ8y<$ zp$7}eQ3+~R{-+)l9Bt<2I8>0Lt5n#y2%^1zbZWN(d;bZ7Bzal20F02IzY@x&aD#{c zyP-?1!wrFK+FLWZ*hfxB37T5+fJcB&u?NtfpQ<4g-9XqH%HA+dck?wtk+Vy476606 zfd2~y1^<9F@Y!}kIXhe^i;LYz6V%jA@3EG%Qz>@~+)Tx}yQp2>F9h?4d2^lNd@$k} zDaS!5cQIT`2t;U7A*eQ_lPZduoTBOoTH(RQ9z2JgvpA31Z>S@z6(Hm0Sfu2$o}_U?+wKBx zF*b884(*Qq)LbZ50G&yp8DW3aYVcIB>uvHnQ&RB|_bP|1LJk0tU0og`<(}+YTz=yW zzaq@GwmIS~NrjOjzy^130!Q@uKYB%9Ka=&)`Hdzh-SrCa9Hh^L7C-ebN`%!P-lYbq zm#IBCYVb1{fRXTgO?kNH{6`BnNVNWldD1qT%f)sT36fWW#$H_$vdY~qCg`KaP)EzA zuZ|TD63rfFKTIMVMCWE51&iCx!y#=3l3F(7C3fh@ zRQAXD*h-RL9>Y1m`70qr1YIfrH-&c51H+5Wk0E1hMHP&HTTVy1*9}L0Iqwt zEIJMM@#4D7Fz*}siNpWpg;V(2hQWl1a`ozBK+I5p(yYl zRm3Sfp!w7+N84Y8EKmhd2JWEZ8QhL4T@`>>^==lITAl&oW4d9dFo6F`yk4yyRTPV(B=eVl2d8wehO36|Y8g&EPlw@*V25_bZj$4>@Mt#j4&&jxqZS@&!} zLjKU4q^!v)G1uukQxW}HfFi|(BfB6&OHIoI%;Z*ZdNxOW9c-t}1<&%#BfwT^v4 z>6POP*j#gR7BYsK3uN1QOUnC2e}%XDU^aja{hn8vbBoo&iV!r(3gsnnpK#;fujr6C zCwsd=6N@zH&a#cHlRJ(Rh3wxj7xW!VAS&-Og)9m$f;ez@WJMr0mJ z8d;O3fNZ}W=JYiiyuZO%RWQKqF%tNrFC4^WXG(<@G5PjGC4lByh@d2=DEJJ2*aw(n zrPB_8+mpW*3#k)~XFdu=BI`7|#9HK+&0x@=iXIG?qqeyu{&PWa_J4uRV{Cg%k-}Nv z(d*C&yTeUQv^sL?^ucpC`Ef=5A-m2sWzv03Y!QH+A`2L?kWY@YW*pKCU96I!RvEOVC1G) zFLv#&nJ77)ME|n~&Bqx)q0DFdzs61Y02VUqBEd2W=(03I!E5+lb!?Eb+inGJ=pH(7 z2_O6fc32AUrO*cGv;9;;D41RVs^&}1gt+%)vd%0tp#yK;=)Jnkym}r42=~Li#cf@7 z@iKphv9o}ykzu0~-CP?%5Lt5YD^tQxJGcc_G(lc<7tiE8G(QSsKMQmL`^obTkB?jM z6C7xuhG;%m((S|KY?Scnxi(|hYhmcmzJnBZ(*%M#`0#;E4dEN3 zw_tkqixiH$wU%ig15!dQ+|tELFtX}N7`M;HuciwiRBLYoyDW!7H_Jupg>q#KA{J4f#Q5K!vy$4=j#dpfZ}Hft*Zj<+B10tbKg9sg(B5}c@mOdkH7wECC5 z1jVEA+A?4&oO#(oB)8ZCl4|Jz_%{bZ!z!MP;-qNJ?^7xh z|NppDV!T zcsB&|f9TlTN_lr85}!Ok%0Je>iPzr?>l>emSA-GS|9epLDh0#=n#;8_N7nMuzQa4B zUqKaJeemGn+8!mY*)Vj${{sMGF@W#i<_FDyo7)JPjfx@TiKqh-g&r?BiD4hKj#wP>+#S;n;pK4`{pBeSU(_T>>t&dlXz~ zY0&-1bAfmVbTou&*q8~@IqaJb4*(#Hi?g1Qr^(n*klu?Qeo?1r1aXj!7nXyOaDd>z zZMFdsCy;Hm;G^=TZ@?{QxB)a#6bIN6#Q*6Uw=$O7tD1W(ynd0&mNTxt9P-0L_X_ZZ zVwJ^Y#|N$;+X0>I@Mp||_?RU0(-Fw#RrLUv6u@&lxq(VCLp^~XE@)Bk8S3gbcpnZ4 z+U*;imP2da3*gKBBbTGYlO1FgBOMu>e^Ar~dd(Va%u;mIg0wf>Fs|?zR1Hk}Vex}o z%M+Q1)cN&^m>bKLpIbYi8BM(gRQ~Dv;fh}f3BG{(M}6_*I%E-=HhdAbLHB$1DTDqo zZ`d5W;&!MB8Ira$oO2I%APR>T7FYlxPj+o9>HS_aE`}W?({O{|AOm?UJGhzYj<=%Y z(4+3h#s+r4$yOALoIEnu!^&PzhUeU4xKHT{6fl$w9K~8q@ zn{aXttV*6U8j7)IJfJ$^&k@j0#7nvaavxs&4DJJb?!!aRGf969?1(oGH-F<%1G*14 z00j=%%NfPpbqO?2U`Cob=(E)?4MXX{to=G^lpi+C&)&A-+!_@4@}!FpB)m{tuHfNK z;KGhI|H8dAPP4{ffZ4=Ym#yNCq$d{d|oAi6l~x}@T! z3XZ)(OKtYy`t4L=&jKR9^$Fj<`5b8eTg{~h*4?6@zXu8!Hzr=TAylyrWY?U@o^avv zil+VtY7H#9cE+neDGz656Eb=WQugM}GhWZ+J5o78+Q2GO6Gj~iod}i(rbo*C`V8K4 zZbqtixl1bR(NdI3S#*!2GuHlQv2B~bWi2NtTLzOwG|kg=WK`G6qpD!IX|kV+o2=bf zDF-zC8I)ja|AoYix65`3HtnkBGrW4|`9#*DZ%fEZ>`S{N>^%QOv;(v7p>oDMUbaEJ z)ap#CyXkqu&;Yliw3JsM-cPpLi|-4dFgj;vqrXR`+Pc34YY8B;Ab8R27hBl6GFBO- z@e3Vg%jcYB+b?OgrzL+4JWiXJeI%|_z~>Km({KPiCg=e0o558x^n0sC^X{dYs?Jgo zBR7gL5#}lb4vJFxH1y;eqwbyXd7Fyp%k!?sn zvpuKS>xoyhtX*Rhamgq{^;E*wLf=MT0kd;`)6N<6wP?I%#?Yi$rNTSQEHyM*YcAiiA(nAbjkmHr0$ zDk-$!0O;BxA5O=fq3dYE%EaM-mo|Y?vHe@t{BJw1kxj4THx-#8rwO{dN(1{gBLBWu z9{t9iC>IXYkr9qHlkd1mag7^M`X@bg^0>TJ^KIXRMJ7tFx+r7ixjQ278_bbB2ft3f z+)Pw=H`YEsZP{|PPG7dA_91-gN_>h1#qsR@B)G}< z^%-^Ul3s~-&+|Fp*8mUSOm~<3{!-8kCA7NASZNgrq6fM_38i89Fx6^<=}^wQz5;WX zFn3cei#Ge-V3o2(j!EfIM42slVa6!)$cqKK>Dl63*6wAuR^)V@iF*zGVfh zDWR`zDK3LMHs>36gPOj13bA$`QovJlfZoGJMCE>EEibkHaeEbx(CQZXGAs#-W;S<1 z)Enf-CV~Xn$3rbrFH7whvOEE|rt4m_1G8BscJd-q8P=ZvE$d@)80X3oN86d}j4DQ? znAb&6au{q&ZHQhzQK>CcF152sWy~5b?*Up$@&CBWb89bp20dqg=0ma@Kw^qck%p$* zq&xJedCGMxx<8P~`Ud5w7(YmiMUJuyiG*me{?~%YAgA>r(&S7|a;DjzUj(HXyr*v~ zY;x(aA?yk1J~s`wFJdxzx>}$jOpi19?g`VmfBf)S^`iy-;ydi8VJtv_?{$$AQ|!tz zjU{Z0l#^RTlUcq}h-Q$t#~&aw8!QG?$jmM@*KUaNCbACT-Ot+z_dxlA3GHV3(Ez>F z{dt09op0)9XtfeBico8vq*QbGL|oAGh7rj+j@%wv`43^&&}u&rd&L^Woud%`^Ev%bx zB#<-Lf)b+TPYyGiq&w8_17k!h02II`S@^f-p z?H4-slmqnT4EF$9?bkDGFhvjbYs*xwh@Fd)RpA)EANKs@B<39T$k(Q~pd6H7Xz*qx z$wJ(D4TwrA@Z8N1kf@a@LTFqQc2hAtSUlCCX3*?C%@HGRTj>4i-%iUm>-* zMLtg(4)DN=Of4Cy+*^ot1oS#B)_gR<>RVRpZh|uJBtS&3W%6lm!UjWtfe^ZO5D2^E zx!V*oLG8lWyS$!R+4$x!oUm3wId{$cabw&tzS-{8sGj1*nq z+!lO&6Cd*+Jf<>IeyHLm#o6dh*_<5hl9T)al*dCV<%=98PJ#5MZCw#;kX2Is?lM&b zt%ifq8EhTTkFdV)Ak%L6=_*$YAJi2wUbsU$F9l!y%z>;s*Umw>7B>-MLgDY2({x9vg5OAkKf0qf0(=R|B!zx-CMya?(hYs0rEVgsvqSs$94|NwZ+q%-5l#dYtc}e-h~RyPvQk01rS>#i4kgF3L4oaq zxg{-LK(`}|TRrSZ-S}$hF6Mg|w&1_Cv8DK_fcX1rZmUqVB>wyx7O4#HdRB$^^YMg}8I)+g8 zQoLvmUbG1oeNk2klXhg-Ck5W&2t_ZLA6@Rc{X(HJ4yBJ>Z9icWI>5KAY6@%BarRud9qc060+ z$L)T|eFhWqBYq}@IEj%^@CgIsjFnkt@u`N{Duv6B-GXpOfr;BKo9icdul5xqnHs?h;=Xi*6@aY zmuu9R|8a5_&l5lm`NU>_&#prR^l1&;3)`MfTNv7j6yzty1e?xtQ=m^5aBSdR4GpUXm?g4ghTvY`ON`MM=kI_X`Lmf!~AjzYS$lMd^$j{hJKR(I0{(aT(Fp zR~cER)|EG}1|v?|K^)O8;B{fX(Fg<59?X+eXN`r#&ckqzRlxTtVws|)FJed%td~_p z0i?ME*uF|f!`s{K6L8%)r!b1FYV$+gz=ebX1=u)jnuW+_z|PTiKI7vRhLSGI5@V6A z_Q6McmJx4}CAWzn=FCyzAy6NnDY0Q|$yiAt zup(i|eZ*!XrNoss{IccC4%oo^3TfR*iX7NJ@{ytsj9)8O=rpw7&KLcm(j zsH3j?TycDyfNHVjI=4}yupr|EnD9qzotLrq z6=?>7GC}cXU$WcB3$ytkAlSK*V#o6#FfWX! z?mFlJR*~1h-vl%cE)LqM<=NyU<`Q*_G6LRj5=e(GYRrz7Rqh`Vn)(f>3Ba9vN8H|56YwT@5s7`O7D7{M%Gc z8jLy4wb+w4q!&}9X{nT_+#);1#mbyC!mo$ z@jitQwd}^5JAhZJ7GjuMJlcf)*p|(3tX*HSgPvnTb0ZE%8bpnVfngd&w!Z3ujH{3J zc^rtM_*gze+u&}qgb^~wj3_&}rAtp^`Z058Nc}RGr;(;2K?0HeF@wpDzBZyrWtGTr zmbttEmlAZ)>{FEfms2er@ck$8ZWd{Hxq8};%XFzHe!DTFicpjoeD^FYYknJwvS2Vb z>CDLmg@F0*yDVPa5&zV{zRLTAc7xfl*c=|;wWPrt&;x7%{m#-T%*|)8s`8IiiSw=p zt$_(P2AlzUa0pXg%=`-LZks*ZgHIkgp6_p5nJw(F2BA`Xv6CNWT!C^3u7BQAidTIK zRv`GJ8U^E{23qnQFj5soP*-Bd%53gS4fo(BokQm5g2T5NMaQ3_s5<8J!&ZaAUq+Xn z9K+kNCLlFwAoAU7aHLh+d}rrgE@Xijt*H-xLx1BB9{!|}T9miXC{GYw`kL**0lU%y z^vddWz^Kuk@?tJ^TbU%Y4vGa@nkU`Dq7dA+4u=zv<|&{EP4mSbtlztIn(INfMwbLw zlUnBBmBA%MbIUYRy{I*;DsKabIz)2<8rjVSgUJMByn*}Msj1^t=F&i2EIwIuWe}e{ zr(tP!p~cwfX-StTE#_=E0^@rWdz#t+Lde(#eu<>Y1sFE5L8c-3vOr2`u|i)LqybZ< z(C}sWOq$KKPdojnj8*(p_hOefrpWR@KsbZaH^1q|b%ZpdFrPe1oR?eKXr3D$Uk93u zHfLofm1yBH3s%7KFPfQe;b30|={idc@9wdiJ#A##6roF4e@18Yr+HC<4M5UydNj0v zZV#U9QXjj+ZstRZ+wuM+MyG;_Qdz1l6rG0^zJaM^5oFeMbYhxr#Po&L7hpa%Yh)W8 zwD1W`1qaJa&)I8m+Fb=)B?40X123_rpm6IY!?-ABj3;wsa&$I&^zz#~gdA_e_B0dv zl@E&2SLT-MF*E|rM@=^%$7?a8>}$#a`a+0YiI?B}hAkQMVYp4zMT7N`;Sxe1FH57l zHLuE+fkk$}(UN27jHULOd)SH8dC0G(x4^qb$gE@oKccO`@2~0gQ6Y`}5yFxKn@{Mo zy(F>Oy$PYJ2uvRBUWeOR^n{5bF+^r!YXmL9VmIBOPo9x)@O~TBg<#p&009rQ=PGcr zK|N#XoyJi53hLzBW8g(%;}dPhN2RGkm5eFrdsa#(b@OSOq|x0yTNVOu?ZzAYl&2$s z3_LV4CP=Lx5TXs@gG=@wHP2P;`&Jqrxf~sL-YrHHWsnd`*as(L*$4ZI%%r+RUAlzQ zw-f2^6UA~ska4_;+FDlex$Q&p46VrD(B`raK+L;W@fH-|N2@CLGfX2lAs5nd?eioC zD=_}PsDmUzU$AFTrP}wQw7k+;UjkLQG!@gWJNqu13LrFw_cLthIXw7o!X*lnPfI=p z@w{*(blUCgu%qQ)PkMk>X)|!e$1Nu9U_EYPUMy zg6JC*Vxzn2#eMLWY`osAbn2E%V3aIzC1gjp-FKw-7Kp>k$YS`H0>C+Hc76_GB&nQ2 z^vG#@M$ag%oB%;;hz}szqRgZ0FW=kaSxPj^e5eB(EP$&MEel7AHeF~=@*H$9*HYvk zu6uXyoiNi4Hfx536O#Q{V8s5dSLMnw%c=aR*_438LcmveMNK~7k`HBijE*$QZV3nn z>%X!eGSZUfN9Z2j?C)g zU$s-rm9pYBbir|#ZrV|@UMe>qcxw};QhJAVz-fmkEU`+lmRHR3tEMIE;T1CYkE*u8 z7E&HEa$m{QER_0lyw^4HA@q=YAZNGr*Qt$peDUDt|J0kU_Nc+NM-8Z~c?r{M?(LOS z8rr#O8OSbA?tf@XOsD4&*|k;uv(pU&=;u5);-$RthoYzkplsxg+;R(L#+udlV(v4t zbn{k1z;M-k*n<}Sy<_S_cCR{V#kO?5e!afz5g#C~Iw)Ja=p}Gx`bN+VoI+#A92X7&-#yh+FkyYGv zT9VYq^sn(W(jKdt-nkq;I~s=_kg+TfupxrVr%md2xSqxG&(lWiqj|DNKud9fQU^NCN6T0!}WbM7;0aK%(sdY2{+c(#6-)s->bPpSQ`2f-JysL{{2ITPKAreLPNT*iR| zLB`845y?3P3vMPYG=V)WU5@_){%iF^*;Syp@L!tp_+z>Mw)MY%)BKMH=sz03t@w`* z{-Xhwj{ot&e>C`y5B{?c{bT~N#Ibbjt zr|!+a?!sXEOJT6R1#J7lClZ_E_TUe8=bL7(FxdH%(7(I9(lk6^uoE!dzpfj5B}~(> zvBEw6Vk>1={J7Tg{10X6-bz06B=_s?K3H*x+1bcPbsV7*r&S_(epEgcseHQ6>hF&x zxwQwLi=C3%J98#qL@k2T^~ss|G8lQStgLz8&F`HBGM3jzmh}(crdg0CyYzQ5QOxyU zKL(AdL==fYh>O@5@|=oEKC>H02LAays;7S8&tIRM8vpa*3B9N1|9q7H-;e&Q2^JLo zi;4f5!hcQSzor0b;Q!An1c?f9hK|*1s6PM~ZQN|#2ZJ$-c{Irif`>f)e@?`ZujYS?~~cBg+JRNgy(62N$)!Rw#bCau*DS)Ml;sC|;hWALk4u z-FP-=k6UjP-e*1+r+E|xvtHP10fV(-P3-8jBJP?Q-LxZmmsIMhdcNJBATk%~5JuMU-5XWwY~yvEA0RB&gRP?q%4MNh^P!MA#A`2x|ym(`qXdb}oY z8VLX&Dig%If`FNwpCN)29>YuZRfN%!aSZXW$$Ij`c)_YVsRj(^Oj_~7HD0pTAL}5Vz_l#p&A&s?J zlmGdZMT#_QcK`bS`Tn7N5m1@$)3E@jr^85Bkv~tp@aL&NW!5ZSY9*+pd~v3(-<=>+ z%pax8?}fo0>$3D+@VoKjDi9ey_Cqgve(n^-Tt^>LY3m!7O6+=CIs^?1JoOlD2O|z; z{Q2q+8ti(mQ@j6_E8O3`D>V+?*6~*yq>&S^|13uEUPp-smkC+^UHBq%f5Vra?V}su zkjF)?^TS}vEhW5_DGLRebeyr0)7#SsSCJAWfIOv{_uxnhPeXeb{h;sd>A*QR4vv*< zkGR?NdGwqDq|i7EdsHqDXyh#M<0vDVFBU>{=B)6ocit%DS#b zK0!bHczj7? zLpw|9ysX2PvxvVq4}|KDe`U-0AD!JE1aX=$*xLBtZPu5QiszRiE29ra{yp|f`kbQDEcOI!63RInInR85g5JbB{q5|OS?FQxn@!-Uqtz{`I zH*1*~Ns9TLr}N{1okqjJCk181Gn`#-w z--ncLJq(F|BG8{pxxQnuLIdE^q^MTc)Xg8Ui8{dok&q5#Ka1b_#5B_i4?Y&s%gFQ7>5=ozP9|rMUc}#IAyEB)otQ zW3gDbgAeJAy(Ez26<3*raE)QubJV(Ud#AG<2wYK>7X>u7hjnKX{BUV~Hemk+`8~utrVi8yVf4p`nweJ0ch|Ceh7{^BIAk+J zo3-CVF&(cP3oApTfk_{Pj`|x4oAjj+hKkN5IIWSsjrqAFei{kP8YX>T(R5jJW#-|* zMcrPkOFJLpD~;5v&JGVRY(JLQ=g5(4aOO!`eLHe2bolJShK^&RvWB~}7oW10IJ1_- zI%Jap-PzpY?V#@u2{D7)cwKsAbBBu@-cu-T9_V)+0Wjfs5kkgqy;j8B2H%gXZ^leOooe2VAua*Y8+BQ;f@J&GBK}Y{weOj+z!L@Am#<>qlnQ>F!y6leY+pMh( z#Z=r5CKL=J-#3+Wz4H*WAe$ez1?Xq87|Jhm{FbX^u(R(afmz`q`d5eSyVsUy?XYg1 z9JS9f+3b=k6fHUxO@`bZ_DC-Q17-hLuo#SR=+@&)0;2mQgzhx+238{4M$R5ujZ%*f zpCooG`Qib1trgfI2x~=$r^4esut&E2z(ZC`c7K-a_gOFs&SgvpVd>_Z)^=Aaogd|} z4LZOXT?xsT*HjS4Sj%}T?jBpHk_Wh?T@pM*(qfz2^tybJpq4h~Giv`Ih3!`dW#56|-PxHDcria0TNM5LLX&aKZ^ar=Z*w?`+~K7i@LX zw}cEcOvRqS@ud6pypd`}BH%d{EFXI%kx}B5o%!or{%wuHfe40OI5#G1^O}08v-g!y zBHmqR5J`J@Doq|cGY5ccD$7!dZflVZ-|Y%sO~!_&y7zE%5rU1i;L%`NL5^|=>eEI= zg7^H!2u(Zc2oUN#YtaP0g}B2ff@v=DF1f!G9YMg=%(sO!4g1el2^f?CMG7K-?77!j zi2u-L4Lrmc-vvb*r}%YVyBeQ#X4#!%Ht1c0NR?A+t~*<&Syzj*t`@s)a+sLwgB~5> z52SlPS!irbm-k!S7@0|Co9irkUPZn8%S7Z&<|Hr-PI1UQwz6itZ^_UF@ubGVF2^aR z6n~D4KSym?j-jF1<*UU=3hIKLx_Y3!UC-Peuxkz02F4OvWUy1&bi7NtDO|C$`McY5 zSFI$fX@z21XAAxA0EjPI*;%-c$~>sh`FAFJ$A(OeT9lj&7P_^SsL4Hxoa0aWCW)pR zCK~F2x(wh2mRY>KSTLf{)S#L!dB~oEQhac56D$hgs9ks)qRqCccZg)`jRZFG=h}-G z1rNbd@Be;*CrL1c^=-Ud+jL4V`<i`9BB3jQA|$X??p1B+FvCaDEL4g&zl4>g4CO5Q)}ebZu#-Hv6S8 zb@k$^a?}M{F%TkSYE9D49{H~G_53=(;V#Rw>{-bK< zec>mG_iPzRCn4ylT2U<3M0`ZQj3bb`6ch*h(;Eo%IBcN6EeqeZjfD*P^1$tO%R9jY zy@WXVw3ew=V|NfY$g%87&d$%05L4S3d=O7pb-ZKYUbHjMSTPcyYXnX>(iHN0gHhrY zKGIzo5c`aaLqa{ge@OtdnT3?H6sLTeB#wll9%Y0N!)?eKAGYN$7TY#_riWKFOnF)v zQGk~GS=Qi3)~$NjgTQL{8p|S9dgjZsKB(theS9Hgkhv6F&ueVbp`)Ny91@I5TlH$a z2eH@kA1W6gzxPJl82d9y%RZh{s#%pIQZK2>d-2!OAUt?rdxv1_ZjY@xf zbssqSRtuIw!ZHu?KW?L-GNtdq;ii2pcL}6()MMJ05yzU11R^t3%)zD$C@2K#MaG?e zJz+s$-n&>j*V3l4KT=j4^dXQMcbSw#p;ue1!VPTJ76#vjpcbx*z9g#mbFkyIKIhQG z86}=NENNN6`9*o)zm-Q@*0Lh)ju`QD6`Pqcx+ZIhH#Ig_TUvmlSa{f2v(}BgSHU}F z#9H3+ejX>o9pq0h46>k9fiS)wV4y@pIU;Ijl|^A7}2@$W6|6mTU+E+ zqwRnX%POhDg>U(^o#O2VDmSS~z6W5i4@PZ}72Ix9Ou-rPco2M~zpQziY--<`#<@Av zEc)uxB=UTul`MuoME$fdhOqE~2MSn$;5>SXak;kIMr4FSLfov{RYe zjO&*cy6T#)s$^Id?WSKDkX{Eu>c?Raf=uX+{HX8koFu9$#@v!ybxRJo|9}uUi*&#_ z;YobLn3%qV_1lnQAHpFErIGR|=2M^Py{Vb(QFkiblhvb86$p~V*?EFkEClFp?;-t{ zVpE=GyPIIsUN{Aaw@Zo}Ogb>SN^6Oyjj?t09;0?Beou!uKtdvt5XH^*{qqr>IQVXo zxY&)<05lp=hr}XY%v4*}O8$?qn?F|=3iv~>H6M$ap9((JA?I1(gQg93?FYAv?4#hE zEc&y1gn>n!fgtBLKvDOX`o; zTX=BD+p5IB`u;+u8erq<UZ1cLpm+zu8^Y^#J`?NKMC5 zw41Oqf#Ubs)V~6@dXlwOl#()y-=ZR>H2G|QT%X$v1w~^gDG`07OZz6Q5D+ol`18QA z(krFfVW{{!6-7yz>_(gB7K|>38e$x9XaP9{$mRI4V)GOT7u+>SejWatS8-7<-)!od z=KV8CWCWw|q){OeDKB(azK`?`7A%Hh(gPO&cC)%3%L{A7qCL&c+S9bGPRXQh%}Df0 z<|m)+#*3k*M}pOP==%Q03jft6`>Wm;Cq`WLR7GFcg$0&BVf0->PWMBLUQQC%6=%}nj>R?3glS_Jua`cS5U$>b1CX1({=OVM96zcy z96xTMG8=!)nVocRxx|cu%HunLu-LQRE!|)n{g-ZPt8#x%oJA=R?mID@p(AR;>kAH^G)?>N6XqKo?;k&biEWEdY zxj=W7QT=rk?2VoYe099hr_1j#ZW=ZUU}JTEu68>MzE@)sluGb37)+qZH!ecd~T(TwW{3t#Bxyr5Xyv&Om?3iL>l2J=#8Ub zA91}>g}P;!Bnu>DP>C#;^lq=Y>{I?h=?Gq0MWJz=v zQJ|pU{>U6No$Ay5aRX*Ifa(I0Ebg#w#!6lHgH!K6^{ccr`vJu*#geR8^`8w09mO>J zOf@nOW2GEHzb30XR^%ZJ_8F823_(;sHFfzfJSlD?ArSHJnwq?v_*(vkj&~R-aMZA@ zAm|7`vm8soswP_o(%UbXB}`8$z!s&|R*~9_G7)`idi+24c%*dN|0$(7Odd!&RHTe1G@ zBy{w-wpNQkmfQ)+j$;9p_*aB81A0+1$2gUzB244Ig(ojdWwt!lK%`_%6nL$7Y*f7M zO31=>cZ1+ZYQojWy!qrm#b=2BtiB0|{1HX$X*0W9(j>9q_4ViLRM&H#TE1y+<|*bp zCSz6{Jb?IF|3I=S0R!z%GIo*mkE`KAd@2-R8Kt4IJ3>{GlUc~@dy&ab@WF1k_Tl22 zg-EjnT2#3G459Xb*i|@GkH|fh1awhd52|b#QZ0j}l|NR`|1lLiEIj83rdiHyy!5!q zvsuYQfDTNLLWJn}7L;ccGKW-)vQ{f}cf~prv;j8SH-5~;dAqN%{7O~?OSqcUaI~=cUZ^vnT%N0w6%tlYvQ{Vq3op^-rFQAkqk*t3lZyWAz}Db1JiW_h zAQb$ai=TRphlnLjPNf$_YF_}Cni%z~=zc@IowLy43lENGv?;yjt@~|g6j;}WW^XgVmv@>bA=PA&mtwSKKy(;={95Q?^8{Ob77JobBB1K}bxl`vr z#CS$BF_T^T|AL1?!Ib1koV~YTO#GFB0Jkx>B|e~`WXOSh>w1W<0rfovrvWX-OGl8F z3AWJVtO~{<(_t)5X2|^)dBER~c6^RCJvA8pn9j%0+**zTWrow+) zdw@u(R6Lg2{|}ZE)RN*Lbmd?CfSAkq|4`y=I ztj!)2gZZ|BQm$R7ZLeJ(yX^Wfz_IyU%j@>P;VSiQuBRpvZjCGCw}KC)yB4O2>meJ= zE~5QiLDGd9I>D%k&B)OTYn zf&qLfVD?V`72swNIosROzJ@3dz*48y-aOk2yTcO+npbJFZH%Krna`)wfRL~r8hMx!kMYU1rsj3asdYIV{PPc38x66sm(Gdsjy}N z>RX7Pr_x4L?xu?D#8&WA#&p}eN8?*$fd#Vr-{8Bq8l9UwQTp7xW6*l=%Gx?8u1i&n;giFf0uE` zE+;;`C}-P*MS6o*QUE;``5b@3kOSx{8h8By#Yjhc?S!GQgX%U9$k~0Sxc@YG#x+Q- z=!G7k+79t!pn`+C4s;m@=&XjAzQXQgj6KbG^F?uKQe*osD9Dpx$%F(l(XWVT0!8up z1CNYovt%H(=OVbEut5&%#z1D`GXK;%tf9chG}Gl9LSHkxl!>Q1bQo%*2Eo-JfV5Iy zcR$&WpOh-CTjH+i3EcYLQuSEn642j}9@illjIe001$ZyuF7jBK#s#DJ8=GgVghlF_ zR_dB?smvSydcyj6##tsjir^jbIHEn=OKwR=!{3q9>A~2|iRyIW;c=BWZU(29kDEQ# zC?4gFsKnskowI_kIY<9|9o$mYtjNRXM$@-yp&THx4H_S*v5fcx+%d~>IJ5KsO;4V1jS!>6qT{0cdh>9z z{;qh^U6V@|3a((kA6^a);V{f=JaoMXz_Rb*ML2T>cPf0-wZJDLE}(wk8SBWeL)MgQ zTp(_;T&14Ed#YJ^B7XDcV`I!Gj?)z_5}%s&|7ypu?07AeS=>!_4}2Z6GVEaa$%l~4 z+yDhOHMOkC4P)qp6FOr>t^@8FIrID6xpe6(t$zzKjASoX0)~ql=t-_6K4A3J0vmEK z53n`JS@0Y(V6)M9WCYI40D_XC00k(TpsVJmY;6X+ zvg~$#ci?dF2{2Ie50tg$I^)V0Mkj!tQF0rza41efr~04+Y}z1?p6pK|kR}Byn1ftZ= z6l2h9*XZ8SZMZZM;}Q8|wSZw_#T@mhMF9$yfDqt(A7}38D*VJ^$`?2kp=I&+ak-_d zqld5BSIH_vj`0(-I}SigIil3|Ueb+&CALRB6={_NfD4tBHQ8!_vM%p$0bu?0SCV=8 z6NTV;0}C;gFqD1D2m65~h&batWPro%+@cw^7@VI^Z%vrf_^##Z(ewl&?<@0E+wM`e}Ns-jC<)vql zJve9S3PTD?w}K7OmCWV-xWd4^I&|P#53@{G`2Z~FWjYi9c0n?p56%rNOmv>|0uKsT z;>92;vwWmw&i$H1k`cxHn%z!4yde0z1W8u72=x-ggEPc~jaZ2q-p8auacA-S9uV^( zG@4NlO+oEwiJ~D)3+&AYO6@j<$m^yOR|%*uM`>k0gXnOzCl>NKjQmMr$qHv82gzZx z{1fD@+x@@i?S`E|xLmdv?D`_obMy4ABWC!Em9H&4HOk*lxdt@f5o-VeTK0bev?aba zzBFFlhEzs(9B;Hn8%)!~OxYX75PgCiYxE{N% zx&d8(owH-MH7f0k!Z>>2kg$DaQqInZNx+z61PwU#8&D1D+M5Rc>=%SX+0Dg?Ri~{C z8OZyA+M4knzI~>VkM@!Xnwb+BG~m}?$P|j9mclDdu{USJ#q9 zZi8@g_x|^ntMG0pHKYioG3&$F$k(cE)M9S3Op0ot-{b&`1A zN&)2MjB9vhym{$(7r0$9p0ev{ztDqmE#`lC(k@zgcXv;fYIQJN^E2|VT zOKoo4on2l_%y&Uh4K8P81M)k^a#W2e2V+4Pmt=s+t!!O|!2Tz|;5!a6l4;DNFW2p_vILwUllkngS~+1Yp>LNn(Ew?5nyfan>(Q17MxeZ*tHKkI8L z4JnT_?BVS>AHG_^NhTGDyouzT_({&bDCtt?+T{=!>~?b}_^+_n+Qt{x5_*oBV7zmR zdZu=S5Tgb}%kIG_#)F881T5s6dfnWq&AazxFJiG)n_Hi9f$iI}6bD)dN&04&bwIU2 zlYxZC*M*_P^pSo?G|4C*ru~ud3?gW)tf}aX*oh<_6i-MhEV-u)u-7nUN84p`xQ3W- z0XZ#sL&%Q~e?$Wwmlk`TfCYiEL%b)^XUgnIO^5D3id+SlsGU_%^_Ww_mU`{1Vyis3 z17b9DXLK)nq)#*h&J@a|JB$}FLHJzMB1XrQ=z%Ok5!7y~LqX4Cq=LH!cYuP5k$%EO zRu#bb%d;0I@rn0WJlUzu!gL4DGpLc8Ij+&TXXoT0|BJvi91dx4Qtw{h8uVzQfrfPs zR3}pEuBFOFVS5K;H7_IlkG=C``BvW?JSoW#Ur?{%DQCy$kXFiMJmUb8%@>Jix{N+H zqM(-0N@suFvnDH+&3FAYVtMJmKx&lxMYKG?+uWi+(SNTomZIp8mE7C!Ob~XYRhFk` z9-z*wP+JmZ!=L>^Zx!%Jh%YAR2n}{EY)pGGkdEA9(^n9X^VWf?n?jRcred+d-1Mt{ ztDu&81H_s9l2x?$y(rSgy*&53b30unuF=)#jQ0m)rZVaH-opD4KxwuWrAy0$9q(%Q z!h$TJsR752Q1fWOud1T~@_e1@pWv?KA`Ny@|6}an&IZxdPU;hN*6;L)_#l#!E@V-G zXj}RC<#5%~avP@i%&vd?QbOZE8m@F1V^9^4ECV-+N$Y8qu7a$JlsoP$Z7ddT0+zg< zIs)7p)bQ<=KWtg$mU1RCUFHRP$?7>&t|-W%`>3;%R+JguD8iyxpetI~X9oT>M`45p zI!l%~5O}K|!^A)h4C~>2&_UalfVR|H=*C!{GSP=%4_L2JyyKK zkBtPj!Fw}fXF<3{ZvaI@T+TMDcdpbQtIPy3h2wi>4@tV;K@g?6xowQ4T>^a@CdinE zgBH31z05`wv%6K?FMWn{fUsZJKe8oCh`kmxyXg=M=ZeqbsxDR9Z;$EBDNRB9rrR-J zZrDY~{~or(`oC^flwJ`FaGi3yBdl-lHSBy(3qZpO)NvJ;mANuowigO?vaJBh-ho)p zdQU&-n7OeH+TXz+(giUqeigIdTo&6ND4$8cc-7{{cFVw8*KF$3vB|d2CVU`7i|jGX z0&@VQ`%VG#G`lFsgZ&xy5c&mrIrV?vm{AC9jN2Bv15CBx5S~;6%8M@R+hHW0()5&V zCe{z_dw0-XQB{+In(#-;Jmkj2#B$+FD>tYACqBEFKZvJ&QU8sDR@Z@?XFNRG>DuRK0mqDmlNP>chrk=rHTN06Zn-xPI6>i z|7Nt6x;nLA5X>76>#6Gjdo49%q=&Z~{ZZQrf@1qt~e!X9S#f?>48~-&8o^dKU0w zOtK)=Z(gd(PXZJrty%LtKEJ`e6S&0t;fd)#I)jUv0loSa&EGfq-X39a6;0mzDRp*zffW< z`l#*Tz0J;GSEF!kR^{wdW|VvdZlQo|$@9eJ?#^;S6!zFBFQ+F46~?MP_mbkzZM|TGptKAaDtcNQlO<^!bOBlTx2GRW1co zw!f5K)!34-alN@1=*RFh2pjt49YBrp#2~GdopwS?-cCu{JQGD=>&iDWs(cm;y|JKg zOp@E&0vaB!cl^expKDb!{1#=hQS9+r(oja=;#|5JYqg$;injAag#KO{8)e1wPNy|LOb*6VSk=I~g{Z;2K3o6MEhA*pk(A8X{T zpaWKrHNKgs=*7ejxza6w$3Lz@3EjilS@eiQ_B+HuUO7pGz$xL2P|=6F98Lnab=LT# zW*WZ3lpYW;^jxJ+m-MV)BlSu!Z}9PxLTStVOi`6KavU`w*N0H*e`l*Aa9bJYRVfC_ z+|Ur&3E#SxJfJU&6i79`QuMi>0}Wh>8RHu}{`REF3tR&u?p1{Qrd`T`%};DOAre;% zRT`S!J)xa)Y)uELIcVj!gMzUa&@!KK1tZ_-PWc+U`1ENE$mz`>{(qHMmQ!(o;h3HO zc2b;z;&ggvRpI{I@<{lMvY21$MmR;~!ue#KuH@2W3&WHZkVVm$ig`F7Yk0 zgI6;ZKD2ssiX(HQk=UsYx}m%~k!Sp)PF=~7A1SlNGeL1G#wY};bNfIw|7+=u6m!re z0!=KlJB+R$3u}Y%ht+%G-TSgARqHxHwVB@jXQ?kHiJc&FG#oGN99j=tRmLS?N}jF&VSe=g1a(MzW?Tjj$Q)kO(j2G zsIH2Ca<%6R~>1ImEjp~_m&AzG%7QtTwLa2sh{!aGU0O%GW5qO-|f7Hse* z`VAhcs7Fh9cz>qfqEXy7Lk)PUT5!yWD&}v;CJPXojX`aOZykdLC2!890t=Ka%+}O3 zZMz*J@mm75Gc$I$er&dnm_3%tk@;=)W|O*dkq@B~$3LvPq_M-yfg*^Ho-E{z{zPLF zxU|=HB5%+rlSFr8FatGlgMsw!Acbk3_xaV3v%LaJKYr(N=c?l2c=}|uE6HKwImTtq zYHKEA>>d|Tk1EULFyXneTF@*>L7vf_B8he|2=T23Off|&`C10gzk3x?NnTm61zmy} zXDg<@3GsgF2o(p}WmW7?ap2!ZS?R{S`HPaVlIZo??s%@gtD#=LF0T?9609 z#SR}9XIXk!g_?t@o?E;`^5gT>;fhvIz-bO2LGutrRXlhb`!vsQIE*cYd1|?s_8=I1 zv0%=DmY%L#?*9;OLI7nv7an|1x&;)0Uc*6MkNmsSB2xYLK#_1l{4SJcW|?0$nC~i2 zo{(hrr*|-4Xr1riZAYsaibX!_uSi+#j?HABs#G?rEJ*J)1R-k>q1kg|nUBKkJUsqO z3=Re#X*_4Dc6D zDmPh8;>nI*^VDq$Xpehasdw}osn>M4Gx()i{MN=~)s`Gi9o};c3}~>dKoX?5rREii zq+`Ta4rcDWW~QKm&`zUGaBIVH*sKfJ%R#`LK6;jcPn?!Fe3z=uQ_rjVKV=E;i`_l>HFu99(Pg_nI97 zqYNF%Y#F^Tj2TEu)4?42IXT)vamO8~U3l_D@O)L``o;`*4dvDC62(>gB=I*Gtj8jX zyhSxHZ)!lDg%b}T{HbQ2sWFIug%+Wp&QkU-aAcNnJOdok_%eyT#QLYfk(!Fexz}%m z0m9FbCN;BD=W;R~`X^=InN}be72fBL*<@f$0G8cBaWZJOtnE_G<<;QPwKL*7pBqvuE79veNSKM{9KBBn3r zu|rK~K;ug=9}+y*EHSwA0Mss;plnEFrGOYQrpac9zd@b_>HB{&Zwv$J9?xAvr-XUV zc9nB>n-2J|c=GReaWHQKDxCEF zh>+$aIbd#yZ7=eJ)@TpbOD(qz#K;RX62Ws+i$Da`j25SD2p7<7z?0sIVMLB=q@YQI zvS1D+qvFlt2_PPF4om<+#fDIB18uE@dlD4f6JiB_V;QwKyNH^z%s{l z?bl?ATHniOFs`kfop}-_ggaZ&Dhzn~?aAI1Ea_~Zn8C*Ot+jkzK~%e^PmL#fV@KI< zEO3iqN4gsdT$2Uk5$+J^49y(-bQz&SRy<%XB#aU9woHoTyqT}|L2|CnEz5$F>?4YS z_Z|y$VNy?ugU$CSxQl~HDc(=-lMK$;pCdGm>I#u23NYgK4mnVdJ{_2E1K(7o&8@tR zJ^8MTwnRCH1AFz?>2hL$E&{)#^y^5Yc38@40T@8D6Rhi#@*_zyj4%Q7V|0d9)M$GB zK3I@2lvAsYYhW!d3u%&j)11-jTW4u+F;_v)0*Ve2#mxQP#yp%3er#V2Sobn-V=(aq zENu`uvr6skK3b`B)Z^W;wbOpsbpIU#e_W*WU3eJ>>>3v0qtef8Wi#6$0jYP-=DSS& zr@TxYL@sfzEV!0nE|ov}SdZIUTxjMF7po#`3e^x_tyw5gD#iP6&A7T#P#rza0K+Y&Pth(X4I8w4qOuYVq|_?GkP+>OdwP^XcFO4TA4lZtcM2K67M-M#zBsL1P)Q5c@|2H$}fLLf6l zs(hxLf6HZDEL-RrE=!jQKD|~DclJ<}%zcNN-1JG}xF_6R`|gNYZ)Y&VpMFq$TCw6Z z2vt5niJul1K`3r6D4izoGDJgr3EutIU%SEM2MArE;nB)C=djX=bhr0q$3@k>rWP!W z_-c+a&A@>F$%v#lXNwk4V%Obn*!LZb%raECN{T&qFw5Gt7|{GdLu6)fmMdLW|6m}# zt`@gm`Z-I?|y44aS-N5`P;V@~kQn_Q>wF#iZ4|;&+fodfIAKB;9RQgpH z_W&Uswt8}suE>TD-Eg$i9k7a_pn&tdg)hCe7Pd#1`8FQ+*@vM24a}_EI09j;A!70q zDCxN)*gE7^Q+x=3vI`{kg8OhVm#Wqu`ZZrw>m6RGCB}j1T<0vpgnfVr-9;|dhcIm^ z{u`ubwJf`OAT?vfY&aKx^xUEQkOu}{4U9IH2BFh&6$8G0)R*^7D`*h?PnB#7eXLA* z%aIv8*To1$=}aBg%qE3E`+aW`H>z;}X1yM;(M)X#d=+Lk zNi_buO>@h>;>Y^1J2W|<+^wByn(r%fs=w5V*1hyo-6uki>ApH~`h}=RIU!X(d`Y7| z{;RH%E_-(G!(p9$T0QOAOGn4k9-{JZw({A37yh8t6!p?-?=;PE`=-O+x3=|T_Uk&m z*}0PINy_3^d7$_9=49K0o;OMX37v@(`)Az-8cMD*$)wFC8@Nm9X1^7#@~Z!?{<*E6 z`%G0;0WI|oYPQLw_f{aUIEEe`mL*xZ(r)-qs1%(uQ*v2{OT60rRY>`4ef)7z6qK=m$%!Q zt6G{Pe&znza;iVP)>F=K6`9;Lq4oE~^H{BaHXArddoPiB|b)>y1- zu@$+6s>MxA9)5Bw%(y16=z0c4xQ6(J6vbWwx@xb0-CEP{ljRfkDry|Rw^Mzklyn1Y ztbwJRbRR?x8HtDl3OGL+n4KDZ>hWCMv5tGCufGD3dEHt`HQj4?n-o?wF-CHxpUmbqHKI28H{WH5NhEsy@*Q7>1gX6kxChd6m{ zwJW#jx#7Mai2gVfsAJC(|IYHAX#;DLhj~CdhlPdj-xwv5trdzsDG&AGG6+OQx$VNq zrE&T#)w3eC?lkjOPK}ktF^}QFivc={vxRu8Np}MpYL727jYBpQZ1_2A!v*Tko%L3` z9yd>_l17VS);h1LnX4>bw|X&4^lKKn5L^Ta8i`W|T}n?KnmZVocpn+K@N=#uyX?t1 ztMcLw>$Oz-@AGYE(B-OdeCk$F{=~o)qwVaty9$w&-4#3Y3W4NaXVvNi=C;<{H_eZ( zy132I1I2HD5=%LS#D+0}n_E#;i$iIl@p}Mz4nkHtI&4+Gv}tlc+=Ns{8ZEeF(2x?N`!Nv;bJ zmic?XTXWGf=kaeYpA__XxWpo`p#oijTL|hfn6nyYY4Z9Z7vi*8yc?F6cCK7`(9v=I z)ru$fbTDe&H;4JlZabH19ez!3i)yuDo+IW#2}5Zeh)O-*I^lsG!J2c5+lt3dxj=3D zil1D2VecatThaCHLZ=^`lgNw{XGcV;x96d;X`O9XcZu+6{dgx@VYerwR?)i#)65}6Ja0`dmAWi$cv3>-lrl^Wu$xMmuwJ;6=GXI#4u6@#~*)+u-fqJ z+UH)d3~ML*q8-4F2FS;?ij6-(dXR)(r}2 zBF5pU9#81&U$Wx!(xZD7WI}6Op43|7*Sb|>(%8dr6ApY&m|qEUW_a+NMHwM5jL_rFW?Y$9E<7wA+{ca7!mgUqkQlzlXEzDbC^ok~% z#tGnMgL+te)w;7z8Yn^vjh;HC#%uF)COS7y{nssy*Nekam6vSR`E-|VsXq6g|JJ-S zUJ&@ON7M9#5Od^U)Oi7crb>9bvwe+C%WCYo{uNh{02Dl!&;<7tEKxUEczFkCPULN& zA=i!_Saoy3dA+7b4*s5m8^J((D7~=@X3gaWQD)a9nTA3{>HFB%v=+}23)9#M?~ZlY z?20%OiXN7MU%puBz1mgH5U9aJ2R*8z16nYL>bSd%etw;#3yO4p^hI~m1GjoKdUd^3 zKcYnaN9t$;SDD4rrKWa9lInlY62H8Ec0PNRgADrRv#dwnJw!mXC`HW@ua6-S-(sF5 z#-~vCO4B7Kd{i31k%$icbxEeUvBk@q->JqWmHd-2ZF(NknMW%GQPfF`1K_L=h@|)u zK1V(}Xp{E{x3GG+s)ikq@pOp5`HEG=T>u<~&mnLeFIgbbi;@D+J}xLo_C@0pQQDX-Dcoj?CGBkxCPKWQ zO*}#D>WLS$3PrMuLh!Tm=l@m#4|)r6{*C)=XdT@5_F%-b$m7nOmsL2MPKf$-9e$QQ z9ESS9i=#>|*#tbB z5*L;+Is{t@XAIh2JHT8c$YFL?_F&qrH=s@6bUsFe^h5w zVrOnD$IcQZ-5Zr;uex5f26#KK_IwbzQYFL;YH|S+$f^bqI|zkQ#~jv-quI#sWcnKe zr}iqzyngRLN~k5ulewsymVJ~3&~!gIWPm*d%&U$YX{41X(=X^36ZzdghWb6sJWn2Z zu9D<;dws1h>TRSh-bg9LRQL&^bIVX;M{b`*?qBrHNxhS}_5Qq*2g#!T1L!gWbfBg( z5VzYtD4H~rftwcEr_2&j`5%2|5M_L)6U?w{9--v3>C zO=lH3GT#}5{up~3j7Y#tVNj58c2i@U=sNYNMgBGDVktUG4Q7Jxg7&clyg)<6)JE|* zbB+UXVL_*%cQN0CH#$e=b%76BDC1P#11?sD=6mHIk+ib+9U}Mgfc-!j0?b+$`Xl{( zHmAn3S)%R_S!n1DmRk*Z_YTrUuh8$%q$M7>^2E?bVD9h_V)Q@E5{H{*FZ7p=(Bzm? zmd_T!qHAHSSVWr~W2qnx^atW7sG(@xrOFMubFlZt&CzyU_t|1K*-X^uU&fMVoPq0Q z3A>Mmnox{7;#|j#x#Z^nvz_h%S8B1vYO#%Nw)lMq6TH=AmO#k9(+HkXHd1}oo@?<} zd>4P*(CAc+jqln%P`Qwgmfj7MSAtak7T`_?cYPJv!#T)TJ><3W`$G(O&52*CsQDU? zavB(;2!jOM*tibH2PQ*<4qCfFH*?VFZ`8~-s+E)RWbH8Kv@Gz`inGFigNl9=a^X@SbBCKlQ=!)H?rWjd{_V?2xl4S0L_FH z{yK``eaVm6^+ONb=h+CmPIgty;#l*6oh{Z+U;TO3!BSHF=Q~Q44$_uKE#nex?35 zZoBl2DT~28YmYb}||b<&PKw>#;o_o!x-?-Wh9 zq3igz_fkRN!XrpMJgmda7tnk(p0B@)T3ACAN5A{J`yHh~swIn23r@AuTDfq#B~B>d z8j$4}B+K&4t*+8pV%&w{edaK|v!qKle3(Q%)#9J4s!;*Q!KlIWKLNt@?(7jxAPa$! z0xO+?gx(nJ3Q;-_H#KU=2XT@<^uDWgqZ^j;;={FS#pT?O2Te_xQy9+5-qK4p79x-{ z`*Y3Y&p`r3KipYywOhX&r6*AdfQlb$ZyZqi^b8!#1i{h%KWMeW%X+a8t9PGN&p|HX>L z_6#B|num1m2IvqpzCJhphyaHrd9bJp{Ip4K_bzG>1`^?qAF9Z`y~{+pmRRmCW&F2y z?-g&`({!%l{2U|g4zs7u(k(8>f%c)I@Q-VU#8EfqXr-jdP+_%Sf~Ld)LF;@a@M{c_ zSNS(~QOi1_tY+BB>D-tRor3_)=W2lCy;VOJzTFb#H`g1;2x%D?g+)3o{ryBSC2J z>i(}Tx=tm-VM5Li9Ha~Dd3JK621#9ssACx37lvozgz~y_ujHQMdP}P3F*ZqHk#wQZ-)5}z(aA13cdWhp0cwBE;&HwQr) z(FHxyr<&XOrBP16ZMaC4BhZa8ivmxDnyw4Y)DRaO_<~X1W7`>FRdypfm1}0Sy{#9R z2E;E#MO_=2zO`oK-ENU#@$q5y5pA^+^~o8^eH2O3eNaFbP)wC;V^DYPv}VK}hH> zYV|%nyX$IOPtLc7hy9IQVfN&IpP-);?06o8uFm6!1!b~~;`X7zm7_kchsk`Z{f(}P z=ih&_Qg`RJ<;+fV?@r^zdOl9urydQxWvTc;QV25wZS=h=%P{J4!Fv@NTQ5L%G}(!L zeTgLSbGt)fpkO6MF3>~j(dFB-B}P$MBB7=(+z*LgYj?t4KS0%T>w*yL{c=yynf}J8 zUIXaID;rqB3lU`#;Y|2H?7fFqlS|t^idd+MiqfQPR6s#ML_n#E88HI%lmfYp=bt*m-8=nYrgK z*L}@BKeVW9;S+tU<-{F7mKF!Z%!gWX!KorlZtw7%;Gw63S8ec3p{xMC5SWUE><~^$ zez7rj%pa|<01k3RYeUNp!_s0VxX9lC`+Hrw$aU|!WQM_dk?R)m zLgPk7K+-hI?SOMF>HO$VGw@Xf=K>V={6Yebf$eLOQWD!w7xRkdY+CAj>o2d*#fjxEMV3@gbIpLHuHTV#gAn$G}M&Cy~m zElboSB}C{eMo5M@AsNbRD9|BC&Is`}DNZE5TpxiIvy?wYR;I$j~E#Kj?584oM0qr1)zk0L{Nsx(mWKpts zmiV`F89gc6%PK6N2ABQers0*Mj?@XXM4okTsBg#gI3aSdv#((```v)KzG~OK7i8q zydM35#_=w;Tv(*hGt&xG9s7?NJyS$<(+$0=LmEYK$GV-DRLT!N6BI0@&ba@lu_p{x z`IYW)Vet*)q0KeYq7g-}H>$A~W*aE8w~Y1*gT<}PEt#hG@9i9}h{THm8 zxjV^D2+pc3ug9E+YPKeFUPfpwrge*C>jP3$Z z(ktuRm0A;TluVB-NGmj5vzHyTcY~)stl2M)CYe|0`b}1Ce&5WwK|&?nI$Jjtu(iI_ zjJWQ<8e!m(bTp+qRFFqUQ9tE=Ljm2Y;MSGs*UU z7`tux?vs+KGX2pziyghQj;FE{e;s<)?aj(<3h<$v0& zZ7M6B&_lL;tXVNYE?VDSSVsT*e>GFA;5plva@yV~$;k$Uo?U-&Q@xz>qj!e6FkU&! zmdC{gh z^ry;f=JN#rpnBci!Pj38U;*iAt9MbkriRYNjBvXi-St4H&iQJNmcPaxw!GWwb|q0> znluXf++aUiiZ76{o1I=cT*xkteY1z`80`ZB5DaUY9~Hi|Yy|JT$L8JuOMy3pyTm#n zUivmieYY^SP1)yAXXWLT^r!UQgdDflD9G2VE{jOTF^#}xf`l7y%X2E$E~7Ih20YkJ zJXh^Sq>^dw^2yJW-VymjlQrvRGCC&azh39RrVUAn38im7>Z63zhXC)CUCy>|J|b%! zT!cBGRveDj0C{!3=(gFU>O!Mbgn30!ly=BG7+Mb4QaYPFmMbupyeb+ljl64%bDnswx1eV*F2AXkZEA0Mu=u;J@j%;)z_Zw`OxV9pJOz zp-o(Tlcl&lXIh19!=N-<>eIT?8dGNQ<8MNlj~Z{E`NrkuC_rZ=Ae7lc{K9x&pFMIa zTfGh=2nqnafEU$Hx;eI4+tzI+h2S+lz^$JFgHrRKW>@CdL#EQ4PqNOS=5CEFwIxut<*a-)7skUsh&TbBD*GihgI?hn2ix9!cN6j@_8yos~AkEH% z7v*^_D+tM5-H%2oqKw0?%<#ds9RsG9FJMMxgu#iKZx2IPygFt6m^nAXaeBpJD_kqr zQ0a#k5P;164Y`Fo{i|bZwo=4$jw+9p1^oWvt8d}JP4vlYXV zR_CwSFO9wnDYh%QZH8>Cchm~uC_67hr?%f}>g#nS)JbYaQo;L*l2s9u1sh3SMt_m5Bi|wtmQ=JouH9CBvV}4<@ zE(~_oA?nK~2ZQVqtLCWT5zO7=tT*Ygf9hw3W&wf&?A`jE{%Wv-vV^pQmi%Qw%`?EM zgfecOv``id@MkIOlB%+`Nf!<-gx+m<@C8$1Fa`p*yD|*Q7+umTUqW8$rF07+5qm)BRBj9{}2yg@_UG%?Jz(j&PKKTKQ!+f@frODDP1iV zgMPB(C5FX%KG~2ZOR6=0`xqT``VD$Bi441)@7gjd89>&Btav9EgrFH^xHtd&-k$YG zEAtfCd)Wgx-Qkb%-DXdoJC@i^Y(;&?gbbNl2M`a+O|*Qy(^o#TvS1WlCu`AXAC%>d zxCXsP@Pbv;hqU!Ppwt1hGyka!@MY01kN%GFf@6l>2MhIM#mOuFow(lgS%A@6CNGDb z?Hk=2RL49xE|q$B?M2zJbzd#g`Q|fHM5{9pj05Zl`(mZPjV z9q41tHq{fxnL<4=@=gabE2g;BYJxjF=F~3eeq2pyc<{HlW`FQ9fC%&)B{D&@2nFFK z(NNDuvuR&AjjEqi=z3Ww15ADIDy+_l43Nb|^A|amgfT{bV_pw0<%zxuusIU%*Thxs zL3#Pva*d`YX)-Hm9H%|~K(izuV`p@$j)V&wzGEH4o#s?Ae zoN`~ZntM2&Rw_7*2%wh6eL{hrkLV3-yHv>)4x?%(M(A9OZCj84^I@(24YS{qi{jc9 zT`S|Vy-N@aUN>h#Tt}WLi5i|YagJ_iv!U}qSJa~TSXXyC+ zg6udX1C-;Kh$;|_mE0ara;b>(5SaN4#>{&(=FSzR&FH+`Nr4HySlJzHws*!sVZe4A zoPaXpmj|*F*Q87O5YvwV!4f3McgIUG4dMzplXT- zNFY>g^*`+lICkRSr=)XY1v07gU`;#FFX zV@LrqiU$PKa$^zD%q$o1wU&_fXWcZRdNsX~IZD_4q<;k=`iyOEpGypah7w5hjkR8J z0f()){L=4(>9}ht2o^#6Xory&A2@c@eTvAG?7<;hy~#nZ7UjvYrX#MG6Z;m#wLSSm zJ$L>|)co#)7zTS(LvTDvwL;2se75OumWW^w0Mm*&n${tkPEc^>Ufb^d>qupK?SsbT z_T~L)eF{eE^A!#C0IxdIAS@xPT>h(*$PFt>-)bZ5y5w=1K(D_bztZUf`GyVwIX__l zCJ+T3$iGwyE;tzTMLK5tGbKh_Yspvi0oIhs=0{Tdf@ z*hbK2RRe(f@W=u{%xx+;%8Fv&OAH?fySiyC>#dcmMn{TQet5R>JMrUb5VkzGl?u~l zk2#~3qhqp>j+p(Ek6#cKX=V*$@Y?;g5S6X{Wi*=q;J(^#-2*Q%PMupv_QrCeV_d}c zz|z9}Cpqpi+RERAq3OeSS!8}uhSl=xk}1dL!qWW;TU9*(V%I}iMNxK^1aV)CUHr!U zuo}8D5a^hgFHHO|Ti7uK{Wnw182rTtAjxB_hC9$p06E~U%8L(YOFKtk^&TtK?lE7g zS{*nJeoq9lWj2*j;sMnO=ofe7Te`I}L-7lyM#a+)LGDzrH{_W~@%9H}_CGtOSc<6D z8A&Pav^%)n&G5ha=5MjoRqUMX*j?V zd49PMfFk#@q0Z(*Z``Xi7MMBaV45*1fbH=HXrD-3 zMtfx2-CXO?EN)Eierk_f*5mjLJMtx|k!oQw@>zTU`{?(_%YoCwvQyDnhmV2WC<0$^ zNiIx%x>N{AZd|ngCVmf8;8>nCC?YzNv4~d*LSJU)tUl9X1QV>ut4w(B71*1Ch^$maXYWjqb@NL>4H{QSIe<+Ze{-BMY{Zx@ zpdC!)f8OmqyA~eJj?nUFVRh*3z2W~-S!faI{$YB7HJbp?&W5VB2;Xh;E ziv#$D1%O$nyDo3W1Ip7QX8xV>C5wZ9fo)E7>8>mR&Wqgzm&{&nMYz1T(N-U>@Sx!n zOC|NO`+1+$-k(|y8j(Ty?229;$pqohqG>S5-MYU*T8?3757LFF)pop;ygk;^XODt` z4!|v#B7E@Dg%)^!jPO++G9n_^s^bnKe-*Hs@1}_Z+*Ad;NR4jgv1J16qtgL$J)_~ZjC!^s-e98uZigS=H#~@%pOPyhm+2t{g zBa9`@%w-)|`&y-aw&=?n%Yb~UxHB;!V|vf+woXYYX0dC}cUfC#Q?3JUGE^RWJ`qZ_ ziqxm@6+HE-7Mhz&-mqL zEMO*8#`N)EV8}WoZ9uI3M1xm>Lji25{@`4}%YjPZ#&75Fa6b~nf4A-)O4gH9Di8L1 zrXytk@FLlTV~b=n?H-MmK;29vn5s5XD|w<>Y-&ch~^ zXY9(#O$~)rk6iYq4UjGtf`3ES=MPuON~QnypZ5fsp>{oZ?vKgR4JDa{wP%OeyS@(H zi@lCrKS8Xo7S>efC?YKF6U4>$S6%S=vqzA-kwTGm1Qv^~p#WLoJK=K5m0jIx(;DKMaW@dte~6T~?n9VOSmc8bz7>V%Sx(iV;i_Sb;BkbnRN+wFN? zB}T0^jTG5nt(a`=BQo3aYclE4iWu*wXGfG89$aXrYe&9(MlRymGzKqq-lc8bHFkZ& zV6#${6Mi?V)>;r}YOF%WV1e_YU7>e9;jEbUpRS;9fv50su_~XCbrT z*6*ma+PCzcxTpqAF5zf$2`Y6L{)A0eiAC!Q$yikr&Q|d%_gD1nDT{lZFHyrM6O9gx zjFC#TvAeC`9~DtoW>-I}<^$UYd5pq5yi9oXkA9M-8i)YCN*t;L_(^VwMV15cEQtWX zYM=x5OW(p%;3JyH!>`RqMeu$006~7@TGf+L9_9W~Bd?cIwwFuV!|*$QmZ5(cF;DFD zbZD-3JZ@$&F`Cm_W*zKaM!$=0`oOh-T(m0w1T?X6GEh4qUxD&TpYj(WF1~9ZEG{Zj z^mghi@BA}i`5o!aZ4vMZ68OSe$a4AH9x};=|NR!CxZC*GFhQg2>P*fgC1Afp!~5#c zp#y`W3>fuH9e+<{S!gJL1MpxN#T zT1@Mx6{(W#ACQZ0f@~(!IB;Pd_}q_0$rhpX+RnoY$Mq%>gOSxhY~nAd8@#z;t6C_L zV3^A-84k!i0Hfp^0Y!ZP&pE|Zk-QpGm7R`LTu1AdThJpwtshGz8dar7J82)zh%bEJ z@>=fe4(^pwk4B%Klje_CIZ5+^AKGFDXYpQ#ueOqR#ZQ}Psu6T;!|o5@nil`5^!w<) z&s8ZgVvneZsVFU={y0bwcYusA1JK-`Rx3XPZ+^kKbmFHVY1fLx z&~}W*;4!3U*nR=B!AMlt>&Lm+a#TqvlR&AKAEmD!evQ3&8KXT+T{RlHV3RLYO^@eGuEWSZw2 z^N^OS+^Jg?Nd^oB0`>`T<8_U)9aqw^#7p9iLZ31-#qb9QdBsF(l>bA(g=0?hqv%B( zs`w!#w;<%_hCC$GZ+4p~DQ$0JHa6(X&!@dwJB}Gh{fJuoH2<9t~M3EETsPJAga6 z0fMK`5EOW$V9fLH0ALw7_+P&b2mwKCLgQSYTWiT!2+?w(V$OI^V)pv>M&P~boPs|~ z22O$i_HIl34dbCm1@%N)nu6QVEHN$1jJmmB30|$sgKAiItyZS}z<+?#E@q!JN!j=X zr=U0MF&jIT#8I_stoh#%#)?zCzzsmVYn=SA(4O$8YFd}aq+SE+N6O~B&?3zHqse&h zQ|)2oSmxO}SMvRh53mM{^X{*ma$_AF8b=4se}ZFHk3F*efXH7E<4OIau>VKPoTd8D zuVMX#L=H#4%*VN((_m|C*OBW%f12jDR0kl0Vxn;SrC)PsX}-nFqgX(|0@^EbX>MG*)gDLX`yES38YF{#7EmP#Qy2KT}N@8`d zf1tDNwh2IukaE3hI2l@xro{S1CmD-6a@zPja- z`a^uI;n7x;KRrJd(-8*_D2lI0U+ehfI}I(;F+#%!irX0|i0*Z;YaHD*$Nx)1a}A=2 z8eBeVF!pO2*Uw2+s957PRzy0*h|>2v>SGdN?=_(`RJ&Qi542Nsa~I+n41e&@r0BIJ zW-?dYGJK3HpFyI}>_OQ|t`u5&WTO7C)T? z!fmLnK8P={KEn_K`(_a@J^aVVPI9YkP?G1rw&LSX??(Y$|FRxXS@gM|b3o zRYe?j@AvV6?$9B_@`TRZ&&Cy{X0~;olE|z^lL2j3>TDQ?Mw9%Lz%2=^gveGmaXC?1}|J#)9&ez7#4Qjc;QuF--!^i46^)d8o#Q12qiY~KCIE50>&QOv&adeRAvYYj_(&*@!CKijih%}SJEm6@Ryt{9M5`(ob`ZA7<~&}LL$j-~wEabccluEM4JW}1#A!Qn3hK^qpKvG^SnfJNL9wfE7j7gH)X{W9ju+`DF%4-h^K78Foxj9D3$f()VgF^-BNl->Vy5Goa`Zu|XQS%O%FsYnaJPho!#8ZdW z=Nup*%W*=yOC5{EsWa^@0y$QO7A+Dy^YTh?ExBqJSOWsLBsA6fIw1YL`sQgJTCB2= z(}#HU!v8d+Y@Mf}sTU(xzlY}%7i&Kg5A>IZ_{;e~xz6W8O8Z+!;X8&yNB-+4*-R;Q zhufcr=A*j&J_@5}oqjz#Sk5Bk1jHF`>s+J}SStR%^kf^c2mj}@pM%<;>{gd)0F!7m zn$SKlJ)oFX`g#!BQ2GfDy1#*ttlXq;ese;PZpt!d+1qr2h)6nmv)c1 z7T8^klBdg+2Rq&dMm&fCO8(*=Sf*}hfBe`S&Uw`L;B6XL{xW``H6ncQlOPXopG30XM;MYS9!m@g@bZM$&c9o%qLEHWPFm@z3MgtO`%_;R_1rV_|6=+NWXxW zX;Mkfj$W?Ad1?ll7^i!ov z6Kt%T$AL<*4+FYs4RSPWNUR=8zWkxv9Zcna0XXOtHzGRB2y_6LciE%8U38>=1n)yB zCJFEedb5x-x7Yig9clJt@ZxC7`tSE`VbPzqQ6kTNA>s zd{EBYm2Up9CLr_dRXhO@7Ml6>!QUICEGBL|nu@f7eEJZjp#1MU2~pu|efsZ8l6EQu zNU=$>z32TOz6;Q3Nh>E=f8Vr5O?1o#E6TLO-R*jsfp4Re0qvXcBPu6{a^C=Qxd0@R zy0Gk6AB0{C>>FtKyHCX3W@QYyt)J)x7_Tp6A$6e9DxM-=d|r8&f&YubkGoJwY$+2> z0wBbgbZ6+ot1?WeFZb2a8_?0do5!K46kJTG-uqhW)IWd(Nb}Xj=N*7qW28!96Fs8* zb3&^8rZZnh2)HgI1QzF!5PjY$q$KU!1Y5BXMD*r_%;C+8NHhHesBYiW|0*_F73hG1 zBt*h|@hY@l46t^=v#%gah`MxT*yxrr=sfZ0PB5Lg5V*wHfK)gbZJhCu?%I@5tx&lP zB|2KeAw8Y5*Y7bS2cdOQs6ApONctZefwg`MXpP&UscCH$->SzvIqzO71tdT-14OxQj$IPaFl>&5~M_4h#jR~ zeuu&R0P~%f-QglL0oO2mr0Xq@8f*IpB=l1ex9CQWTFHRSLIj(qo8%V86YS4)_|dOM z0K{i46eHf(W}ye!4b0J~3tvF%*ZB-uKclZVNPuDwp_GdWns(A)8#37d1fiPKM{X4S z%0>tTA~fhV0DKLUI+}o-AgtIQ!^>M}r!Hx-0qfh@~EbK3kuY;ROiW z0>hBktuq3PoUy{k<{oKaETmIyQevvtHjU`bUOhBCe%FZG{@V#y0Wive}QQqln1 zU9~3%b9vajnG|+b8u++LG9ccog80ezh}61Ed==aeJlFf=LtqwtIcXmPBLv)v`COJf zH$a&$ALvco>N@aiubKFH-8@pbQdcq{R(F*|ov7flx6-tW0yMy*+bB}jHXJ=)pz)t3 z?gH8-1fIq~ViO@>%ITAU1GK45duWnnXL4jNn3fZNK(<|KH*i^$&DdQ5!vwV5Qq(C> zH2{KNI#soC6R*|zgXbJN;1oSWfeE%@mv4M7M+b!1AcAUOI~3dIhn>Y(5|)6L)jRK0 zdoErW@Y+s7z-ankD5i|_??+aXkgZCP9tP2%gyesIakP{8js2oi~Pt%GNkT7{jx%V6pA-IFRx00_yX|m%Iq#I?$kAfc*EO5L!ZmYudbG zmWe6D)rkS{7U-G;0~eV+xUt-StOF;cz6~C0S05ZONi>Rp3Y|ImAi`cBxtPpYk(djG z9Yy637PeGD9?7s_tXL9dUHf+$!`tsqvb50JgrM?m!Q zaRt-w=7#?FunHXLfqr!U2*0`j{ixToe*{^*NM;1)d44oQ3i|)hsQ{YzmPgA~j#q*U zq~yIUyO z(@cxmeNS|c>-MgsTTGSQJdUY*pZjvEB&q)C@I0{aHJ=nftbP%o!Za!n26vBsqJC^A ztJm&s{n@&m3F=oLrrFD|tkrHS(o#PaL5$U8cGq+F$hg)8PglXOgvV+-Onqs8RLn8flQ5Y@G!)K8Zd2lwe z`)?sBqgDP1PE64=5Ai{WAqNmpMnjko&1ovhV;I}DvMLKJpZN~OUYu%?ave3Mj$$P-#`RA{3}c0qC5{ ze<*7-I_tG^E6ud|EkQN8znAb)Oy%<>K>45nsJJE#epP&Q6X*54@f3>jyoYBBOI5i6 zH-Pv=sDTK=9wV>^LD2MCO&|9dEq3SdY=|gNeOjSHA(7=S=G!-#bnF2SqBZvDH>Bep zn7mL=qO3{we$&rNZV>f}Ms|EnPOndyKH-M_?-L|SJsJ@&2o|ggVv5u7Y;5z0 zuJE32&7p?R)z=RTPfhd8|;wG-gtd*K8#4scOBi(!hU8dD@*XR26~|7=nf+F ztg)ri)V-osGc2HF1my$QM0D>Ac$NdgjA}j-=}Zx_)kaef>CGM$fKfa-8cU?-estXZ z`O?0_Zn6}Q%-+|&+JsDc@Kh4yd(f2f;w>x%2xO^wn!h`}8htsXB0XTdiQLd|Zk9o_ z+j7!$K%ebxis__6)fh{W`<|&`Vkwr>2P>L*2{_JmNA0jC5NSkq0|;`p4x5K*Cyj8m zhe#XHerqc9;)xOdGW}|Yl>}E;1HPn=+j757@faM(eH{u~RnrFu={+WB8UwYw!B~3_ zio&m-&;_r}baVqR_;OEZWWgS6IPgi2fP@12xE)={3cdttK{^onbgDu!0exhTE^`H6 z?g>FHL!bGh-2#0(%9BA~(qsR(vH#cSOp6nd@Lw*#|1QS=-(~I~U~BnWdDImmpS$aO zpAFb+sd3u8;kD3$B3gvr3(J#wG$XJ|_Oq5J%k*!qGhTiz^E0A^X0lXoHCwNSW$CU4 zhvCQT;kqNeRQbU7pDAsRUlwBrbn&v;G&JuZlXA2xAOCk3|L>pvcP9QnB@;^9{lMNR z-r-_SU>KX#7HVmzWCb|fKjM(JT(tqWG;8VV?yVKWbbBLw{F_vCbrW=TQ_^m*TSo&n zBF)f|h)cVJduMfZk;b~c#M6f|`BQTv;Bp;MQLia>X0rbraExADg6vX_2hZuydfD$N z)MA@tbYBY!H3}~Frb7z!H@i45{08=LmHUlY{~Ln=`N%Sb+<-oJbLF{8vB?1Z+die- z0ROv&V%6Ks#{xfHo<>p9yh}5cbd>n0Ubi_8e2a{IHz$tWwoptZ{i;Ap#lxwTMLBz0 z86>L(VK4!vl<;l9ZQ>gpO)8?mIBPhDvr0hFYcY(9+aAz+Pd3iQiB}&O@SLWxQ-AZG zSY~HN=z5XpvbymXj4O4Oa$LT}SAGC~scBg;?mr}7sZ^e}EH+nKnwZP;Z|Hvg zY9AfcMlqz?W5Zu7Q(dzbnP@yw-)dLo*IwFChl>&{z5?fbK9;_0%R+uA^a(zoM~!O%-1>+B3Uz=VH}KA zfntj`p!$47X=jTk8_l*_r%FCp38drtR4Oz5^7?gJ@z`55HA*k@W{oNp4aMA_9RP%* z^Ww(Z_i9t#U)qcQRVDorXpP$V$Q~ zLG1vI0V~7Klb;;GQm9mr`@(h-I)KPTTj@|wNB_m}m&tNo7}2 z6^qg#0sr2t-@@sPoTM2Mn9pEcRQpycEY_Vv2M>6d4%nbIl6kt$I9Kjin63wp$G#u! zy%qYZYbGQ-czS3L3xA#ngb|35V8Zg0fivF-&16w znUCBE9eoUz>7Ppa=k2A!c5&YFduEEM{b5`*jDqtS*9wJtyq=%$;w6ud;~xcmjdP;u zJSNnlg8MOF_1eQ_cK=w_HDwIT;BtANs-FKGp=KgE3XryxfYuqarqbTlLTeVWqK@4`X#MgR8{k~mR5?)J;J|E8B6|m zgW)t!KrIL~`x0YEiRZO<1xz%I9!17CP$=2$vxO=+n@ zrClE^RhBeJ+`CT`_%Y=MJ2I|UWwQK`FzWAK&ev~VHZ4Cl3% zU{hXUus2sF4qlA9lDEY-R5?W&5o$Y3_Axu`0zb<)?cHY&yD;sMsWg1b$#lz}Lhq#_XyNhOo85`+dBX$}ihXP|UzlSB=K={f< ze06?jyIx$nNW5R;RkEvk8TH-WqNYIqo_dpaK}qa-B1o_Z7zI98y23qcXXtsGBa3@~ z->t~_i{t9bF&=5Kh2ry9n7qRDogMQ77VilyWCYPS^feV_x;gB4-A+a=(+0A!x^<~N z3Npi)FTz`tQaa8#q)2g2a-R;xb}d`u8;*x~)07H<33E~DNB+#TF4-Lz|Hq@ZJe}#W ztzv4=R1u4)((iyMi$}$_-=@HJDq@}L526*W_UCTPl8vLer_NAilk%;$pe-nu57l{t=Ii^Mw=ed%{oAo7Uw!`|P^GAcJ6`z_T`ZtIbA+HG?cZXPy z(JcJhX!PGFDX#9j7xs7gvgXX6Rhmdzq?5# zX?i5@ZP3*Coq(4-EUB-w8(2hV&|-#+xIC$eSj}@Z_W%LoJb2{#)=giGHu=s?aw;sR zttocy`PuCCJsW9-8?*n=-qYT1q0@};wR`#-$Gk1XHqulMQI`P6 zW_8&JHAR|qffMlCVkn=%v%>I4EuZUSXEI_hwWi)+C%>x4^+#5yu9#l|*{{IKU)9F; z98GV8%q8j z!Ve;OR8~`At}uowdt$N0@WMreJx51%_&d<~Nzge;K$Ix}82c@(Q3EoqA4{A&WvYzh zOV;!S2v$aGQ>-`lMpZ4r*kit*=zWpkmr<3wux7XPjV+X>^UNDDF4kW8?98LiZ7LOVi(?`!9)U>k9#=;&~V08R-szdca2`qxH!gs78Sw-R2HpX2v~h^uSo+Q!n< zfMexc=XB*)F70mQzR#tIjO$Gr+`j0JQ{-Z%KtBLA)*}=?C%rPUTX@=Z4r~cJ7|GH9scvr!82wjiU@-6TCmG!Kx|yVjzjHs; z`gU?^?+83~RsA`5-pqgX^@pdd3T;c&O<&{_&z(p;9x zu02_9NYY2<$_xGJ<4(H4V-uBEypX4Mr`|vrR{tz-YZuN_jB(9Y)EDz{+TWV=L`Pfr?VBj9 z6NZ10$pj=@Q^zQ$D3Vx>E#BH#|B&xV9?(Y++S$iko$wVa%fnSGiZi>p%N2)JrhU9vCB81hh|W&aEIFw&Zw{R774elU=C9Vz#F$J50*H^dCyfV?sO=I88`YLSEk z-}1MvXsKon!omAbc901Qyb4^_KHzRy$^T&oi1U{U!}H8<-uWtnNdT)7=uC};>$^^pI5iFC{ zKil@4`w(`DslLsde$N^t2cl~P(22&Tnxw%9rd#2R0}mT3;PejQb*@+#@2NZkH4d7A z|3r>j(`>v#wctZtNOHN&G0MB@2R})e6V6DS9*9X3e1l#wRG3eZDmWj1x*;QwdTLA3 zSYMmV|AuHuG-CB;ZSbJQ@Gq&Yu3!W&VxrG~b}kY-oHt@|njWUnN%lqXH=4}8Ao62s zLmL!!{;7`9@ng5fHkz02^W8nr+Xgmv%fIWznY95E#*6&89nbD02?twBKm9CBva$4L z;CcG0$HJ%N55=dR9ssjFk4WtVW}k12Wv#%elh6kTJ>HKH^pYl5vV7IQ9{br@lSgKI z)jMJLb=he0N=e(?%Nbj9AcE5^mSO`C~v#(5gdf(nKJrxKbhK+{lL8PLAC{- zjgf@&URssHOTGsf@3C-T`V~(d>g)D8o(whCeXiIO^g|r%MOzJ%4~9HWDk0NhY+78^ zZ>2L$Gc0X$dyeUIV-L$p-W64g`~EPsAnDe#^-xfydn-fnp~k&~MxWuJh^Y2*hfu-<=eLybXc&sIt*mK2amPCF}jzN=k87i23@q;9n6RPIRZY2xf!Z z%spTEwe0x2vV1h}6mZ}BqMV6=BGK^NrV275@{fT{3ZL)QtMQWayFG-(jN#q>^Ma?= z=|ug;JyE^?c49&Nr&E&dc3Oaq)ge11_`50H@!Spkf?9}80@A1xX~4340OD??rnSG9 z=NK}K#!DvRg|v0?v*pW$p9HIOqvckIb;OswfGXUoVy!Jx2|O&c=x89i=rNnx&^06# zM|Q~3DXCfx*|UpK8Yn2O?5Qf#pnBp7l_Rj zyN`+7axtDm!n(Cq_)PU1fh=S+Rjln6!{ppmVw}JAUM_i)9`VUV@s3}aa;*J3HbeNA z`JGhVaira48=s8x3-ZGAYI^#I@L7484Agkh@g|JP-EGtRO;&x&wRq$Yo<5ZF`mJS# zPA(pUCj~hkY`pUDFINtio+Z}}Wuy!wYXmGCNwE_zU#M(%dtw55HxYAc^-S@oN)i$N zAS=!oi2Hmrn3a>h-~c z6!xmLA-GAyRkQW*-3qqDYcI7EHE}Uihl)omsFRC`dF`)4_U8!031>9Q>|T|wj(<~8 zNRC*+D1NzusDjj%HqU(8sC7pg!+n5kXPSG2kf&Z+;7K0p>OT99={ zp(BOvw!m^JpO0JHNZG6FsJiuI&Z*PGGCyo91#2A5l>{q9=e$0+YLlg#ol^o97e`gP z9P*1ThM$}1mk5(KIb=L6xrYVkFNfPm#YN~Imxqy#Z&-)vUA6yviS>RAAtoG2A-Dw-H})>tB0Cvta$%EJ>vNZ_ysfjxJ5_BLONWe9xP1M zKMGx-7u6HiT#pWgBlz`AY3K9@IS#bB!>Y9^@&yO?s;|p`&MWO%de-t~?gzd_kse#! zTkhjZ`us6hncvz+_D`(j)dkpI9rsH4Xh6QseS(qHGsnh?Ax3PUGG;W=xm4o&^*3VA znxza~kpMSZyS{z_viI^%o3?R_u2d`Y1OKi!c`PEOeZ9wDTbGv`Gga>PDH83+D6ba1 zewRK=qXZ<{2$h~G?->bYNp(J8n^PNGZmSgBC#tTtXaq#i0#_}jYxGuFwSv!dMY|lk z3mF-?H!Ka*zy3;NMIk%qOM&^zamJ>Br@qNI8@2GF8TmR6lqqsc3wO!ucaK-`h8c^H zO*C=C%*MaTr*#Fc{tb$+8d}xsC+qi`@^!@7*)vH}dH%!`LTr#uzH2Ik$Wc; z&Q$7+0%yh~+SxWbJp$b_?A`Rw>qij`Gm1)1cJ;Y7r2-^IK~gS3J4fTZ3w6d~43ljW zB0RktUl4)b;2~eboxx7}RC?Hx&1vNc|2nMHKbQWvAxmm`=@vbgo7-=VX3aPW&u^;u zpXaAsb0^0oPQbsv7n!f>D|_GcuDSlud%T~~O#i0YVFD#)AYc7AnMHi}_S(e=b5fKi zo@I+<4huHcUN38Uz0s8FFYah59)Eh+2KHNUQXcHpf?XGU%bKEG@sk(O-Z<#kYa$T@ zrgy_kqMU70(<3gpoIc;~=PmzG!@$?6vkXNsOJLY@wA=jW(wv5=(BI{aEEZAbsbc*P zR6pw&hUf_~WsLPsXL(uC)6XM>ve7}d?uV7ivF+vJk(7j~gT8Qt?@>2@A6g9mFuB!8 z&6Y9Z_!t58qxpy9YC&OjnOXDqatIErm@?Un(tkR!rC`1F8~fLm1(PWmgpd09wjh_H zTPz>-9wDN*CEyfI*{MD$o_W3UjaY<~SLBztv+%UH?P~{$Kqgc|@v+Z?-!xVnZVC$z zS2uA`9I`=oL7+PmD_NA0V!^qkt|HIgzpt^qMjmqhHZF>Kk)RsBRGBW7r>glM)Z=q+ zc1bdnJk5dyaZzOXtV+z*6Os>tAFgVXLa(W4?G1-JnkG(Bku!>~B7MrI!s?RxTUzeS zIi&DTb%VH}OnA!w{MMZL6@+M!{EtiuN;|on3BkKLSxq;vojSkqZcUTh-R)Va3D53) z+m{@ZCh95ajLhXe+~R%xz&Ggs=NXniW1cB^cveO-mr+{rw;t|YYHNH__6l&C)-+3&SWrp*mc#$ z;yNl4-@dWUNp2mAULlaPPUe4A1zHmg)W_K0d`Vn2W^~TwXTI2t?c0siYR9^y?Uhtq zb$+geF^GB_%4XE&PQrZ?-X%Bs&e!_0ZTaj~V|ibe*7h5-=T^DgkgY&b9{oTq5>TiE z9dLOtLg^5=^b+7NO|U~s+T_?F4uy(f&R@&f?N*GMvmNr=62#>0a_!A*mFkSe+ z1p~ql+f??WrJYW@>tjMrG#1F~VpKOVVg@~BPLhokW7d&-@~EoEi*#WLqQ&9j=+5;m z8ySgCbO4*jmktmGP2LjJaiDuBhfuuo#42)_bZRhQT(DA(u*~h z?~=)`O@}*tbE;qXeAYNiW)$~as7Y^zj7nOxnKXZ_H2wF~gXuiNlVgN7q_KFE z#l%@;sg8wswy_ zXfH4Su_<*fKjO?YV+#O&szyvD_CHx|M8+7r_|U{ zd7Sd*4Tf0iUZkR7Zkcok154(tUw_%vy`-MyGlIu`#aJn1G$Ufp~h3bX(2%dt<+THJSW9zE=fuIxpNU zBq>=xBNZNO!$ztnnq+_euH01+yi74)eOk2ZJKCmD>se&nLy6~`lI^(u2pd<1ecSQ# zBIRQRp0{boskgJGb2%vgvZwvz;I>q%2bbeF&aW$4v&63AwsOTs{aDu`V{Wz!E>cDR zF!72A%ejbt5!lN3FBiaN;m?M3bhw*6)8QPEqx_7xOX&A5RKBFe@E3l4GJeWBQau}> z^&i&tmM@5ACfN-Y|9vh8ZkN*heSocH7^t@q|8*#M$|E_6BXVORz4LVq@APS5Es$~A&4R#WAmDd+;WCE-9S zKLrz*H&51h`8V;D{_T8J#hIie-?4ucRJmF2;bm6mObvGS$?`ke5yH>ZF3}sSsAyjj zrmOxnt~7@#S3E;&glrqO7L|9%a4B1%^o~ZTT)j)ViWaiq$~OvlJiAg}Z5ouj=O!Y& zm(F6YEZg*QGuMVeKhKkz1KXzHl88jgJ)Z88@zUofL*e>Q8+x}rY@SbWPCWx>MBPq4}Ph z)%z}A>s}vMMI52^!T)LROT(dj<9~-pQWRM#OGy+V3fZarWQ#DyE?agYgX~$7C6rLs zN!ex?gu&QC)`}5h?7N1s#~6F(p6Z zqjLwY-P+FD4&KX{(yd?eY+Z(WOJ4b@bP#GjQPx)Ks)a6dSm@yz=Ex(Hp9bAb$B+Up zG^6?3svpo3fJ08_-d24^2d5ToY9@8(Mo!w|^$kApN6kdcv7d*1Dttec(1DgZgH>dO zA&*G~zc^h9>mj)Zy@{w8qJ2WxG{))%B__aSrBn-tH}KT;OJ5i(L4SRn)$~NidoK9U zHGDu+-KIXF1nm=06~ml z33szQ=wvMWT%dwPTkbt!>|ma`eSVOIRLg-EI=iOLZtZG2xi{6N6m=1X z4tf!1JtVly#Fw%QpNM>g?DxE4?iq~Ytf_6B)+^v~_`$K3qBaYWFM} zMR@37>T`!-4k;|We3;_@z84<7m!fD;Pt1^5>En50j0bwBJkFCi6TKDb3ZRHrOwds) z>FBE5XvR2mnts%=tF=G#)}qmQ3^ch_9bN0gwLW9!6olpl_~p*7^UF*Dm)bWvh|ET% z*@6umwdcIqYasNy7X-VXEHMht@8&l^pPZdh>RCO_mE6UZngjCVujkS(C@!~LP(})S zRbF43j?n8xP0VmNI?wm`zE?AfS2ZLYrO7Phs?n`$G-u;SVs|gL6Gv+RaZ2TOPB^qG zTWjLON&gG&8xCU)r7zU7dml-Vc~gRF#d*&Rdaa6|K6ZXaDN{mB4FCkyx(2aC?4*&m z?kg8Blnc8TC(pYR&d#l7>(A7eB$Ba}cTxo(gse_yMN#fqXnf+ICsk|rC}qplRjcnc ze}^}u(|D_*2W;raCiEM-doE)T0ncNbQLl`EhD+gQHTqrK4pt1XDC;53t)2%RuQ5s@ z%Wl0{Fx_iLYaf+5t>9g#W@HtXPQ)$%VoqCVs;UiTZX3O@RC$(Q)8&vMW)a@LH5X$5$D0^CSx?7?Wj-^i4^s+z0+Q=qYst8XtvTbR-gFY6NSrpMLES&_%%s zh#Ts2omjET4o$^lewo`8qSs&xWB;|{NV!3|mm!)5JC>UW=#wsuE*Q^{ND1fwJi>cZ z@00lq-Y8*AvO=^D9Jrvg^V^joc$Wvsc5!>&VCw^X@EIY&)0XyrWA(_NrqLQ`?f^L4 z`u0{{_<2^VNBd?LF0bq>M<`@38r2MGyV&v>MeZmFYBZ#Mb+R;~NyQU$yRw46x_9ejRG+i=Kr4oXcb?_Nii{!SP-9r5 z@0G8y=RVD1jDxaOzMtmj67YeMdN8`N0s0MuA1#mY=6VRKXG1{Wr~`(;(3|&eQ_zaW z#Ur+(#066+LJZhmf4|`sXeEGV$1|`jI&-BhD#GEC#fy6*3hE_7dNaYVu$8!2M^AOi z$HRuDz9+g}&@naf$p_z)yMc_2R(F;~PZ%AwK-OSLMd5h!WQmn>php2#xV5ZT?yNLw z$zU%lszAxlScoDC%r>tIc=f!a6fD{Ll-{qq?`ZV1FjtXS?A3)s^C16~Xq+r`?oOw5 zd7_9Y<&pkZ&y$U=PO%cIge`9`s%Z(1xV-6iD0l%NQXlCbk@lEPD#T|didgM6>oXhx z0E?Q{Fzh34uE~a^8XEoS6C>8I;zVqne$@x34{s)>a*tYMW{i%8s&RSW)-KIQbC>X7 z7W_caF8qrdld^9`^MY8AbMM1+O2O~ZQH?~2%ceD0y zD;1DQ)9GQwJhFIt8fy45wtjV7AP}UZwfCC2IIpB3Vp&a25bOS`k5Sba3@*Q><8&3?~4O(G+SdI z3}BKv11w00#cS)U3=h9nh}n&}lQ^yvCXhgk#-Zi6WtYS)!(MW6fBP2%-+X$%sP!1E zw#C6j(CytUp-2Ukqfp|^n0vwD}g)gY}; zuUv1qyPYYqA^*ukA8ct4{-I9C& zIf7#pG^o8}f9hkZ%Ly}B<1y9FM>o?gA92kzM6X>@3qh!Yo4CCuHw}lL!(45i6sU7Eh7mrk>q8fXWU7GSFu9<+@#kzF1 ze+k(D7GI~QdwvmjZJ9Es$`CbF=$4KC(1dFMaDIq_dUp`k3-dHw*dSNGDI*krg~<8^(>SJP?0GX{JA}6~HOHPhgeYYRoY!@5G<%CBoecc~p7}6Q zMYs@VoE!M~XsEfDm>lhuaYyO;Z>0&nF%s8w?pff;{OdKDzkIC{9`$8x7()au%-bx2 zPxPqiiesZT%aO~nhGWCe!FkpiQ) z6PiKVC$5DyJbkx)fGzQfl75q@q3uI754CR+q)zj${G7pbqlqaF$PL6LItzi*d)^lI z3fOj~&Xw2=VJUWt2`_DcE$bW42}8%&DA6#W@kKAS1XFs8FM+0DDr}x*=yTMKCd}p~2AzWA9xh9tlvqcWcvWt66PY z#);NT$B_4c<#)8$-4k;PI4~+J&-ragX1NlNpM)5aG(^3uh z4?~-_70X%+LqzyACX#U4^#~61ztI0GdruFa+yn$hz)ddcrx^yyaRVahI@|kh;w=-` zFEVXvkoKIr74J z(i81TM(p91e_zOYv>`8~{xo}wIBTO-ECW_ujdM0NKzm1QxI&fV!%zh;EJSm^DvR6u zvb))~?6@+7hku?w3Jh81B=j8IG{VF;D8*xO?J7*ZMH{c&o&7uL=T#W4_-!Knu0T5_ zcF&pOIC5fVZbe&PYEx#Rs-HNz2(pU(@$y$kIFLVSsjZY`GwcWFH!-8o|AN-mpF!uv zb26t=wJ*-7fxs%iK}VlYnApSg3JwnMbvoeF@!vTw)uUJnq?DMXVeRM^Fti-4?@5DY zQn(ZKGGFY44!Pd@Mw(7!7la2S-H(KzDwqm66!6*m;L>R`i9noRxH?1HSS`4?@^)rngUkR1wc|S zyP6e%vjQj?W`BISFqMhSAjWRi^&i*I= zjl0Q7TquzLZD8h59wve(w+MwmDHdwOm{}T3HW^0lE zLqGI>iHuvPET8Tcn-9kWAmFS4wg_nFv~vP=F`u8SgY5KTB5|1`VF)vF_UAE;-Qh<<@+VBPS#%8?3d~fEnt(4wJ%pW((TgFnVIqO7cd8SZ)?ZS_ekW z7M$Ynf?LHq@b!FstQ8KmsAOptlhg?MJu&fkwZ>4DKs>hjrz+P($`}t-`wV88$1_ez z;P6I|y93w7PW+bDu#DwaQKU7RQ4F9o2*jQG~%!ZjX$>(uxry`mh0+Y5awkp$j z8uB|&84s#?eHgk)ZXk&_aN2+)Z zRh5m#>8-@X4{0dLi%k8LH8kwoqoSY4Q5bMsiKFdXIctallIGa(^2KH`uX{Z6!K;*f z59PWg!?DemxE%_RfiFs9Kl0=1?{CXk0+>RS@U8(pu>B$a zDmXQRb9@2-7|82$JI^PQLPd9H-F(Mt-ATMw@(F3_8<<^H9(OU{g~j;k2)n@FsWTi^Z$d`9rs`5A;`>j(Q797A1uZ2PxPpqc;e+wX%5iqAhiLBne zFOFSF;}xiTshHzGmNw^jUBT`8EE03QqhkkWT6JB!va3kKlew;Ili~q@wMR}qw5Z>< ztI|>z$P)D$TLe7n^+}7Pq&oqU)(dlR71R``S zZPFrKe1?kVKg_U7^t9jTY8T5Cf1vSdgZuhBy3t&hiB`TF_j59x%m(Fa!qBM}mh^m- zjEw@zKIE%*$2(Gb^(8B*s};{K^|w=Dtk&%T?RJ+6+g*QGKj*K|fzo@tx~!rLAi}2S zk21n9f6b<5557;I=PY(?_yQ@sDq}W^P$tfPiA8I7NcVsGp>m{J3zQt^mn8~vG9B|5 zl)E%Lyt<{sDUt;e)X?-I%GR2_!2_OOE=S-0$7_2W3auw-K(>SSI0OAJ|?(P%9?x!V}G zXYbSIC~YBNski=XU?&YkUe2u2hw=iTWOYi#b@Qh@c#C|Ck)#XAYO(X~(CS|S72KnF zqoNKmnTc*!W|8N%<3fK`S1H9qyA;`Jh-z)V6Va!xn4Sstd)Sm(8ry#BUR`RhZ9j1{ zYOoenwS0mI7-~aZT=Wyh8pd5doRffFu2a;e@dp4`vkIp~y<($QeE8IlBPD}&An8^; zT)MCVjfwhs6p2N0=^dKanToV{`t9)HLOco+N@IgX;vRRkkV^a!Zq5W$2{2cX~EMVf9S7pBxsJdZt5N22kMI2R&a$4S7ZyJ4=?-7#RlLyqV$ zN$+`eOhNqox$UunpR~M%hs=i_boYwcMV~24SJc$+Irji5L_A9&nLZ_KIb@C4@Qr^} zS7OPA*JR3$06nNI{g}tyMsbZ~mpqO12kPsZO__#STb;#gf6o@{W`tG;Jq~mqF}-AT zxym!K^myH&mEt@6PxdT{DW6l%+W17xzx%xP5`T3o$_uk@LJ_>(YjjdzCgWE8=kmgn zZ*|$8r>j%}7|RXc;Vm&+*8RHotEPDKqMN7v26_}y-Aepp)U3!-yCZB{d7{BRD!+i> zVi0w14H;Q7GLo)n!S>IWZH7SyqIOT(IM@Pe4MH-o8?_NOmV?` zbXLGFgEMNqZ&ucmeQ%9M0l)axP}!~Jz;5|)_%1s^a|Ai*bZ?Af+wuB-<+F`4_o#z* zu=W888x@aKwdiKr&5pf?SraU~B2B&9oRw##D`FbI#ya-=29+sAZJ&s49?Kj}qvOK~ zdLoSpjHo&Npe$Ig|LIU(AV&Uk1JJ1T;c>OSlyu`>i{IvX%ndec4d;~uA}buXLA883!bH$VK$IDwpVGKphXde86f*nwu>;`)hg02Bv8(yND z$Q&D@Lfd4j4jml;>sCv*S-kYEWRsrOiO{JID2rA6h#sP{a|nvF$3(^p&kf1{7peKJ&OCD-r~)R4pma+jDjCk5p6Qo-;`5S~k2i)1|~ z(S6e|w=h@-g<5B~s@;j=wjzqjOE*;I`f_ROnECdI=Tf-Qai*|8-zB03y&oMOk&JKI z4M*Yl&n$kDo9$A%TFQ|kjc;BP3psgV=1HUR`Rn7%;T$N&9Qm!r!5a2J4E&)V9@lVD zMY%4HF;#AJw{GCRpU8yF1D;w=8rTTODaZG1GNj1Mq6Lm2uReVDRXAVFu``QRvSO?q zyc=Ob_H7SgQhta617UxCI;Pk20UqzIwwI@bXHT*Ctqs{uLBtNkl%klzBO0(y{IjOf z8~M?SBGQ!&Ucb@_gU?QFe!hDuu@i~JGS{PRPB*2>8)aLy-F{JPl(E{1{3TtbiN%D5 zuHJHg0H^q;uL^T~E<%6D_gEQO5AqO*YepjFf)nYbu`m1gsPMIHCRC_(09xKOC}?=P zj4TJ-4@FQPgeNIpi9dQLJmS~Qb6&;Zn6;OYU?G&cU?We+%~|{%wy8*Q{?gD;hT_WW zuD0qCX!CRcDHz9laUZg>Ur+XQT@74z{Lvee)5lTi+0X;$xmmT5OOrU<$Zb6=CY|wH zwwZ0%gWaq0^88=|4a3vG7#EJv$08d?RqN z$IzJXu@v}lSn97+lt-bwY~Bwd-rkzHanG?{PH))BKuWhLSo!gaohLXC+?$g@w7MIp znJocwJ@o5sX^x)njq)}c_`O8NGdpPi9>s=v>{%kj^ z;W=P0h>IS&*SsJwsOU0cuV~V7$RA}a-l!?QNYKoXN51^w=+?nlp=Bs&v284^FWx=q z>oIqhS@DL@R815>Q*GCC$vkM-mEQ#jH!Pv$ac(j6CkG#7GXoJj{RQFGBa9!|KCr8~ zV#B{;S92@&V0@4_N%6DovU)Bn%ZP`8$iuGkt#8+shO-95S90n}it)g4ZXo@f4vH5> zV^(3wcePMh(qtJY6b>2H#i_j_HQ6uGZ^r7DN|0M-dwS31bCr3t>JD?cMCQHSC%e8wMsg@A-r?3vyf2!vy{kXR{7pBZf{D-E4a4xF^G<+|Vgh*Lr^KU93|v?{z6!*FJ?8gD5Gn z_qCNs%T{f)aNYP)D_OB@)jYkyKtYD)!hBAkgo%;I%3f{4jo67xlUJ~rKZc*$MsCdD zMbdmD%|Ac+5@akt6vFED>aO=4-0t2wiE$;{#*@btZz|Gab?viDvF_=|JSeW+|ID^X z*!W4V&@51D#3-Go)r!fmnF zKX&&Xkenke-0o_KZu#qv;l;@0-=J1Q5tp~-ep;;ZJ@RWg8^nqcJO763#mexc?;_bqM`}SO@$Tb5`eUH&-H8#6yQ+o{lpi0ASkm?Q@Q8e4!H(y- zyEV!bpJ*h@8r|d^L$f-TR4Uf)`mi)S1}MtYMaT;~18UcnoV2vW{PUP$U_acyHhShi z;)cd&vY%)H39IMH@Hqw%+l_=hY_p_OW~}2~7BuZ&-gJt5s@QA1s+h~aCQj%@drbtJ zt2nz@!>qPWnL^{L8-KhogDwYU>orCz{)(B1N^visM8sS-olNf5SyDb&b$oDT(mzd5 zJ{VXhlc0m8TnV!?o#px3=%)Vr*=GHP$M#8t0?B#vT1`Z~&GZ3cX3xi>kn6q9^gEAy z^@|%=vV#>{UWI1GjWd33R*G$V0Km=+aNzG_5JX@rIGn5;p=N?sMj-oYI5m&a<8>8I zJNabQ!!rC_J^EOYP|e}80wnFs#Q=ifxJOQm7V5UCgQ(p~-;tf<79ecR`(sR7cm@jhF*swWZmp{p~mRV}wgeCS-vk1{KmT9rkdQcJR!QdRXf^g616x3j(@pFPpq- zybULLfswW{tn$7BBsNhD!O3P$t+PGOdP8j+vx439Qygmu5G$DrpVA%KS28ur@EQ!G zXW)2)JHH+ni2H$C6wU%|x;8BtS-@5&k6cMuG5$tEv~G1fDA9ho=zWl147DQrF4?$gZ>XWLlAu~lJUY8Y z3FxH*F`gR`3`j%voH??e$#w0-jPmLikFkNtDVt^G?2>~g)|JkC#hI4^JmZ(zVuQPP zJb9)bRmyQ19Z_XB`)rVW&U?(~Z%NHybZUBam62yj@oKFVo!R3?M{$3`#=3!!QpvO| zQET744L*OC3n0gNR>seL0JWY2Zeqh`zwZ}ME0?s1qE_)*P*eM_dU*1aF~KsHcGl2# zD&@=?6h>u7NCW;JM>LY&1Bd}!`|-~fhjRrWSPsJLrvqAYoudn1Gld5H<$wt#%4z%2 zfmFiiA7UmDQ6B<3iDDa=G=Gd5&JVaj`}j{KKee*HoiSm&Q1@tP6qV!&6pRUh60NG} z_;DR5)IsSigqQy>TSb;I2;2?VxTAb?NK|ExG zYc;_b6Z&L*U=1^8rU4b~gT7 z*$0--2LHz0XvbV5Mm<7+!{E>SP%{Ea60=C^y+2%QpkR)E0A7AW3`krNJ1}hSEUmlY6Z&4Mc_;i^;S#mLwr1taDV}&#w&hG!~udM9m za49H{SH0_GrWG)g42ay25h|%5nBRDi;*tlVG2rns3`)*x@(p04IS+A-{JX5jPq`iS zMIn)9hnXQncEa!R>&?ZP&xNa2^sBDz|9DNHRblu$Ylsu@hh#C!g*{s38=_1!gV+$+ zkJK@%*vRxspN3$lO(DVc5u*&o7B2}Ip_0#mOMe%BGdGI;bNCuHb<9|%@28XUC|Hn`Tf3Ae={Y5#j)lX8$q3-GTxJ58_t%y`x$fjXAY zG`N36N^4v&D3qsQnig^L-|Ge4!MuaoWIi5I$S}2IFt`*xGFRVU%m%jKC7P&$zY(NCBVXZ2AY!N0zmz+iJ`|(I8*2VmB9;4Tcd>`6waG$1_-xe z{thoxGNTnWT8wlyhT;L^hPX`N9Q=Hv`rD`QlY>M802KuuwHW1!ui zpCE7k52+MDHvPSI=KqjI{m-qxiw05opPBfdnfQO4j^7~xJ}Q8PCiHs8Vd3}nlYodG z0uhM*Bh4X@*LVL&6$nHl=Z{i^gbIMRP}EE1^*^Gg3mX4;+Y$x-akSlI{dXk)KX?qT ad|3-U^!Ajlw+i*EHPr6kMc;lH_P+pZ$=%%m literal 0 HcmV?d00001 diff --git a/docs/source/_static/img/logo.png b/docs/source/_static/img/logo.png index d87cb90275bd70d2337550c2b5a6a9b33061aba7..e6bbb779451a73c1f0da3ecb41494c58ea682eb2 100644 GIT binary patch literal 52542 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

    d~&!i;HXFUh8|R zB{0)=wdnUV4q58^!uWG`M4FV=Gn=21fCghA6 zWR>Ox$=EfYW39@#L?j73+(9$>CiqYHt-_T9$8(47VP=5I8xZDgRU>8K-=~JCP0dhB z%N&+0>7^)ILR?{^g78OpMtcwi*Ts}hMSg>#&S#>6q_Sg|daL!g3zT*rA$*>SlI!P#+ME)J~$`@gjt1ByWc;y6JLnKRXMUs z^?l*=!3o@5b?14nuoNZc0nw_@aXIRY)DaT!r7{%A_zULBCRtZ$FQVvV8R3GqD-sYu zd`_=G@k*flTRJw7Fj#@$Man&Sqr5i#a3$cr`}$-&!0pulC0w3JoR1J&#}lSXWjyQ8 zx0v=n!(djKdh?0b(`8S$`ll7<7O_f06qvW|#eFFTSgu!{15RUoyb^O;a>3-jWXwYB zN?EhiFcxYStzSRzqYyZ2uRqK%{6s)S@GhgB(1rtPQfPuwcp`%+jR(uYVK~1#7aN-6 z26BS>T=xg|@o*WEOXuq7vPUTv4bsRkp(R%SDbQ+^8gcpzaR?a5@$(DBlYZ?r)eWwr9EmFA zMP-_$o0+ii3TI^5r|n?*@S{wOxo3B_#q+fBbZ#DVpNVQ(XZ^3~%j;q8>({$Oe|?d< zf#uIp3GSt9jWwnmjAUH@|IrT(a{&YO!Ep^EN4eAc%4P%x$SzQhFpAy_+4}O0nD5V2 zY`~0Jb?qpGEqQ3Cw5UlN;`szSsv~79Pj`v5`QO5CCn0KZ6~WOP~cy%3&XYlM|-BF{KbGXc4~b>iW`8u0=oglW=1r#C}s`dW6<=*96aY6?#_a zxGkP2wV+l$PG0rPuo4EJHK?MypGDF8NmOTgLuqOEOi5P6&D+hWV6dbNr=d;mS9v-# zEQ zJ~r;|?&0C?kw;mzI-~*W>Of#Q(TXbcK${`VpDe^I9%qJ08> zQD_e(gr$jkb9~KcU4UcxAkFfqOQVe^#dgy!)Z);ReBH_txxsI>k$w+|XUIKiryUNT z?%P>FGkB|^wciZe`hWHIMy>dn^F| z2;m`FR{%E)5eu_&^wKq^s_1p3QhJ@htnBRFeWaNdAyV|e(-|FOn8-dgT4G`UJq7yo zrJ6SrYnh^H5F4S`w44Tm(uNDH*6?uZLD3+!vG|5u&5_p{vaWHwULv@S)p*>rwT`_k z`paP?w(f;mGFWq?jRL~Tcjx5cu%t;b^Xc|%b#Z<^ySC^Pu6)b99d~;7lnsS(M!NnN z$$}8T*wD?RbME1nr-e#==F?+h$>_;vk(A-aGOLJ19oi(y%Z2nBbE|@;)qUOiyp=`N z%b00&Y_tK2WTgp~`^0nwnTXg}GWLC$0U!~xXdESbk-gD!pq}KVtxd-}vZko@s{@Tu!SDsPqRcJ0!D}@ms>=9?n< zIh!$Dj=^5Sx-vkgD4Fv8nPq0c_UHp-y{uGuX}iZ(?V^42ak*!s!8f&P{3z*1-xf6D z1MA1Xg``LYntC}jCVK_k4ln#(cKxB_=IY(s09ztKM~ z;Jt(45CLKEbZy?R_%H0FjLy)#*^1Fy?M1Do6;}!>SN|~GzrJts2*HE`D>L?i_R`{a z_wsptE-<(E<&mBVY0XJ%=EvOuGJn=N?Q-caIWG2Oq8L@N|R>&x=; z^1~zPTnjE99$;>-rO_B1rWbsL7SSUI-V@G^Ez97!plb+j4!?0;@XOJ^$R!~BmBt9~ z*xa}6vBdZjdG%vY8mqAa{8){kG@fk5yA*`DE@Hk*;>`*cfk64u4h!3YsA(pgzd%<*mE&$lc z+b_<*hb>qtW=kk~JZi8s9$idWDb zr7p%c=XRnulNVzprr$wcD9%4J@mc-|gZ#RkD+pxv3d8Oncd0n7uL-qyIFOO$KHmkt z#a>pc9{BkR8nvyZjo`31tvp-~c~P!TPlI{Va6?S9nE2znXKmPId`NEn^0c`0D}r4O z>RrX1tpXra9gH_h<&YV01g8XwJ0Fqg0_dTkn{z%mvF~tVN9;f;F6AJ$WldP zbXUlV@5WZ#ASDr$SRgLO&z5x0rG!s}+5speFJDh?S6r%Ilt@3dL5xc*a10c5@NzP4 z1VPat@0asTaZ>)L`^;m*+(4%=yVHB6*m+rgJF(el5>J0%?sc6937W@JJ|w2{p0myFEy zA5Gg1?!M^L2>BuZ+R|__2x+HHnQ(nx_@Z&&wkds$sw^~jvHm@$5w+WSnCyW5-kgXycmw8=3D>${v) zrlt{%Yy9nzJQI%k-mk|bclsW2y5I*b>**$7h@dpVXun+V{q(K;^wa@71Qkw1y^2+0 zQLU1eksH%*F3^Bd|J2IQWUih3i4sVD^FTu*77n33T$_R3>@p_LgjW19hc6Xn&rc!M!Uy&NDyEpUPVRX13OGy;Ao1ILP)HL|JNoW$WH%+*Xl4oJJ+#W z%s@9)O4G5TBB;>%$7D`419be4|J^Tc3}bdC;BhZsx_B9a9%wKcN?u4Z$zBc*0`X*C zp06g}p7%up?^@Q!#Pa^`7dZ)`zN4Stu-h7W-*X&q^$<0$CcoXw?jF*h4A~T_6l>8x z6uwi}81g(XxoUnG+HzI4Jqr-^pMRS9an*)R8wo5pIv*(~r>5B0*eGrxkDJN$flREq z2Ko5~pJ~^%1)n@W$RPHBkq!uh?IiU}E>VcmbSE((q2pLd%H{e~fU}01_$q$mu$G9d zLz&}h8dTjRkH4BRm|!91AUphP_oxEz1BD@22aPFlMBl_)usb8+yUS9-$`bz0333Jo zf4@tY?^nG}Cl=?Eg_6UPMG}DqhedvXojVGs3#=xBV#jv7tM9=y%6Fcg4kRn~T$#tw zLP6H2_Kxc-x%@oB@yscsdUZyIvtWh|3v1kG?kM;9dM0HMF!4(f zS(G#2sZzjf@jT$}`-tUw`=`k>w?4|v_O)+9EuQR|2z+rFjn65Y^wDFPLF<_H z$0!k#2h=(D*xmY9G70K(a{kXL#)W}F#&@rCVbUsQq<2nmKX`5(NI1k4Y5o?~agXeE z)30TZ2KyI}=Q(50=JJ+3uFa1eAN2SNDP(9{4UDY6`SvU(J{VBbFq+ITfoN$EGK*Xv zTIp-^p59(%Z0{TQsB-7r(BrxruqcrL$Ob@c2qv@C5uB*LUSWWlh5tMJ`x3v$Az|j+ z-_Y6Ce)_p;UR*LD^xF$Q&*o!J>)(cq1sLd9voD6J{Lo z4%};6FZxZ;e>ptLw(aAc1{|;vvN54%vTSTwQ;9f4A_^+ zf6OZNp5E=RnX&Tn2^Dc12>1gzcTGC<*#bO|nd^eCC-*?#-Pni^;eeJ(B)8;yd*(gi zf9`XYdA`u%+cL3i#Z920c{^hS5o<`lSzB4E*_~y=e=Qx-g+Stj?AFA@eE`VJee0XD zn4Ojy<(~xGxf@38tAnP-tk^f5oIqBOCl6EVJyiSB19&0%YVq-VApCn=YUhHnD6ctK ziFg}I(}5Cu_8x=h!~B{O3q8RCyGk_|8@h(J(WjK8_aj&Dh!&_50Z!ZU>hz|IfT>WG z25sX?1#BQIY1B4Kyw1tvXZf#AMys%pS`Mvm zP4B*4MKyno7Z;B0L-7{cW={;^Qe`wC6h|)P7?@eUD#?T}H~{ zG5+(pVe#ir-Aw%nUx1M{0b@l*gfX{6oF|PCyo+hVs8W|8SJZQfjcs8Fw}29UW%E4vDD7vNy=(=B>Rx1$AlU9}mIj}E;`FgJi)7&u z_U~wD=pG2=Qg!v3d=oE|k)Nl_4PLFx90!_Wh4_)4T_(Kg3ZIBp1SjXsxe1e_pp;tt z2U3DH;M9|tw4-LtARALTA9X1C+4+&w=4`Fe%JrWxK3zptnJlXa#z*(Rt5+kK8(_PT z6lCM{yB)n?Ez=LFzOD1r0_!bsz-N)1k|r*G*2TnkxUcDZK%$_2r#7OQxBiGcp_E7ZVad?m| zf&><||3%h22ILiOm%z?!AmkEG^$%`@pZxrCZqDO;^*tTiV{)b6E*06sm$A7=mJ`4J zzdIaZs08$L_um&4f`15BeeN$RMx&G8o>DcdG{5bZGo-(FKBO{cJlg9QO$UqIH5{EO zO8OcjhQ5~v8i{#iNI?sqwlz_5a_%^}!mUfMtL8WdGa<*co$U1V&8riSmP}8=ds^Db z8HAu=`NH)0Pf?3zJo?1kQASmG{)b|lnsXiaUXP3W>Ls=0bk*Td>0{mES?WWKD+Y9_s})xs>Qtq)n89XNQ0Xwy;lvu}2;$ z5c~4cBP^%dqZbL5rK8V`j~E3OO6;P7`heK3R#d-WHmS=h6*=C9*weZgKNCgeR|G$s z00!&9O_&*7&X)qOIt^NhK!Q?VdM%{s`LoN~TYjj6JsU=}Hjl<>IC56xb95N1{g*1C zHMHfePoK6E)h7h+o(C_gjEdIl%%4aa)*pWgyxF|93$=TYb%ve(!D>81%5)lqWpu0w zfn5;kQ;iaX3!mOxHbT{2OQSppl7I!G;nF8zIk*`_mzS;TnwPTxAvtvB&YL!Dp&yDRKjJ}Zmz&>%3RWa3v z#l%ES4-11C?~?N4LwDx% zuPnB+sq6D~?W;z8bIz$fhhq~?5Wn&r zDiCYu$Gt}&(YAzu(8=dapB=_z#_H{n=2D-Yma;dD))9D_zHb!d@r#@}8Eeg2SLc2L ztj5}-py$26xrr=SEv}|0PGE_D`f;(lK}U{a@aga(Gn0hccJ75PAGB$g7;#g3#)*IzsT`UCw&2}6rw&xIt9w+S z6&B{=5avQ9TjP#e+;z+1<+}#5p(8#AXDz6MMXS0;8#WGoB^KVH$rP~8Oz=7;mKciw)^mRB2Oomt7;xmlZ4}b9TMItxH-@%=y7jZT?%`)5UNph#HI{g8 zUUSa$CAR-Cq$ErgN))`(0Y;?iR4qkT3OAMT*syoc8!bwvYp@T~nsaJ~S7qnTcW z!HyEkSn47*O4p)HO3w8^Q=yE<_F;|-i$;@-eoMu&EBQ^H{LF}MtRq+a@mWW$W{?s2 zx?nN`A4^>q3an;BXv|fiK8mM@`OXe8uA)$0iaCX0XqYR?%zm^^#5u`KXc%pfYg-=` zmlZRHh@Qv(k zSG^-GJKb+z$nj-e{cl+<}kbpUVv`}c>3(ZyA3$x;CURKc}Xt4PJpe@Lhz`27S7-D`{vQ(zZUb+9-L_MLe*`7UrlVBq-#v#6B*3HgTS@$bi+QY{4)h^U4 z4gC*+QhsuywMkt>(37jA)U(EAEio~1r3RCmTy)46nz_~J=1?A18xK;oM<88kx!eO| z4Xy{raqxW=={3Cmdt!gjQ5z)1{(|Imo5-H?YSJZ7V}F%|Z$K4Sbg^ zKn$-*53%i^E-ejH<4gG>W2Op*?XOkb_|zx#XCW_c$dZ5$Eq8s?fa%tzdytR5vb)<` z9t+Ki{7JwpvEyc|k@5Zq;fT2#AFAOid(&TiX-TwkrO|Y-O=#Ok z++bMHx_?_6K)O%$US6JX=z z*43d?k;E6oNM7A@pCW;Drh~nqE2xra85a5m1sk)77(t~4F0W~swwVEgEu&`n1sWh& z&T&p;P3(Qk(X{x`@)z}%&A!J`%#R^6(R`R!VQ6^&qy6gJ^6lB0Y}Or?#vI+B*th#w zk(Wbd?`^X6yFN5KvRH>=hzjgoLQV$ z;YyiiB613_d_4sg2PXRZ%Y+jMTrxnNC5Dvk@pUFedOu%$JbG*(3xVv(Ur_xxXkF*o zF7b)I^2cE52zKD3|H}m%?Wlo;`*tJ|C+;sCuzH(6S*>S9BP-6o>zUMHcKYDqF26&J z|8CacJxM!OY}=aDrt>MSLfwDL2D=5tYj?q6vbz?Zj2f2k9VEuup*?dV1MjI)1S)fc zUD6toKy(XY%E)G^SJ)pr3Xe;%FSWG`@UZ?(3PsFi=CZm;I`pc!EegqkC0Yr|;tCfR zsMDgXZ%+4x1wGc|MeK)a1d%J6+0vTyxG%wzQ8KZ)WVwU8R~s~pR#$uNMrlIYhn%d5 z8W!X{9GIz_>q#{^5xh;R96br`n0Ke<*1PyiDRFk2BaY|ezOV-3kdDj+9M%+ z`HvSshVav&NXyfiFCKK4U-j?BDbpI=Af}wXYHf)6A=6@FTBh{7D8WN>rHyBzC!|SQ z!9qM_DV+p7P$`b+7q)UnvB!kT@Uyl!jgqZuV{{}Bb>s8pb)WeNvd767c(i`XO_A37 z2%6l--5M6+jI{KjJr}#DoVpb2P*GN78i8BKgB$*=LM%>76Gk$OUx8)%E|T5qaq++6 zdJ91mTH(pqay5iA^g2(0yBA=fX`-*gRpwjGUTbUd>^u`3!3pg{(j_s=cEK6O7E24f zSnBK7;dj&=OoXxEd(c0?tr@P`3EiGmGf~9sbe#wMCdV^ZW<9Qq&OZq@PeE-}a+7g6 zh*jP97W^MND6k|Z#N0q4H4`H8^IY|92vDnJi&PQ4Jg9sU{e2l6~+s$C~&wc;};*fS&obfOCwyn)APcS%C>` zndE%;qN1Y48h2*>vUqUk_V@Q6cDlxjMs~MUfnsd;RkX=qXy;GWihYBgy%zMBW3U~G zzEv%)zPU?fMTQ-NJ6E}}B7t`r12Y4{9KN&BH+X!_fiTW=x7+K(cq*2T`bK;x8U0dG zTl`QDSck9108Y<73y1 zYOYSEFlG!1{2QtBbRM|z`m{E^=aeNP@ce{lbU#)z(c$upeM=i;oO*1R?HH3nunAw= z9atx}(Q0W#^seXiYk{U@9HnWihG@UREAEelldX*#au^PTV3UK3O(0lO&YG3Ly}8ZT z)6LV}Mx%RW2o_YRgG8M^KSJM2@jgoIG7n3a7+SAX8Na0?AWdjA=s zi6!Ri{`WKmb4i%^`+I5UZTb&1+j>Fo3_nm93c@_a$>T9qAila3mS$v^jVfy3G`!fA z#{Wg`0MC5vuPW$@|3U?6DN`o%!=zu9CoQ&`p7);zzhTP(tFG+FMJR+I-qGEt2Q>oR zv~pa0vi3(XVp6%NgCQL~gTNghgA=oezQUIa^ln=UB_*SUMRRR2@J5_|4(^T0K;q2Z(5wogcVFHxq=_>YPsp;0 zwdtMmNTaCDzFI))tre;f3}fj^dVfjQy!o+TE@_$F4Mc6dJx{!i z5_J?_okEWr3O1WU%f&EcRSwr3qDCR2X8os>k;7DwK(_K<%3VCiW_$eo*!jY!TfD5A;wKlJp}NO;X>rNQ;K+8MCS*yTdEv&)UKai1lt^-y!c@ef{$Y$?9;pT zT=_E_(xS;*3259=Bcuzs2_@|e=e4G|u7mLm0#oLU3;GMus^D0bZ2T7se*s>| z^l-mRu1gZF3*r~*v-J&_;kVJi$!ctP2)M?6y9ckU0xQgTf>ah94@$X}l|_KPDG+sx zv8p21A9zu=SW2ihdE>*ncd~)OWeYJpIhq$_BqA&fDZlsn@L*A2)yV2NqqY88-*9__ z&TCN76)e^!7NrP1@(t7H3gli5;^x?T2XEdePhMXWCRp~t>6;dFBnf=>cCS% zNYHrj*qyL)VBd*%lr{D<5swGK!Ht3{R*^7qXb7yOJ@cTGm~|Fr9@Y}VZq&t)QMVRc z@WZSYS7{d$5UM;e#I>iFH50&Zx-2T&m`Z)=NkM0GKO%O>RYQ%YeR#plPim#?fG(xxtE0-uRp1F z_($caKW2)pWiu%WGbwt>Efn%!*6TFZl!bYl)_Ii|){yw;aDstIIQa)Zqm$2C<^JpS zBD(WuoO0WZvm2?OpR|HXd0L954wq=JBwqf99+!ayDQLK{VOUgzjENMrc3aUE`*Luy z9yKKqf%aD|-wxPi@T&Y{KmaPHVqjE?m$)ZwzDq^kI~GR0(Z*_6 zo-|AU0-9I6`6q#KN=6VJ1E!LZVbvGN*1v!l>*nF+xdNR;=e1x_(WXPq5}OXv1Jz6- zykPPCq~SeAtAak5-4VM!NPE(mZ?HL)($I!>g<#d!3>l9HC4-OVEYk;JvXM!JTr=#V z1ZHg}AdoPovg2xXVNnAK+zuBxt;xP%CZC5@aYqYa`vtBo@o51}Di|1@tbeBy3kK|8 z@%dSbdD|JB-PUub8fky>pvLi3x`^d&;mRD#CLx8|M>XDNBzAHQu`*PP0;$1TE~(2&+(RYda^ zFDnh8Ty442FG}VKOhf@m>WY#KAc37n71%|?mz%WR)HS4PM#4*T+!R-_>$Jvm;Zvwq zDzfgSy=oh0tnl?CacntuC|Z7r5NT!Q5kh1@Hd&^cx(^ltXfkc&gQ;$9d{p*C5JXH4 z=%Z*bypGZV92h$-lBfD;LsW*{5*%B)xElnKy?Pm=LUx=>4`E^E1IjHz4wch$XU?Z0 zjlLcM!h|u~P>CRO&F{q;u1uW?eF1|p?0ikuC;HzQ6)g$mT`{;KjYg9T>00X%P*71{ zE+RyBKDC#e2Ybk~#5!C+XtX^TX&XQ_j{Pzubo+0z{J%d=ng|=tP%J8~v_?=FFCUU( zcbA|Y58paD)ZYllW%*eHA5sIo?^ZpbzuQ%&gZ}brz;M{NAHkP0 zM)W9j1f%`KJcMwNW#TQXXEvPlx3pMagChD80(#so*hy@u$BCl8ZnQoG9TAsaxdGT` z9tX1Zi+D9xHiJ$yb(A*_g5$Locp9)$307#X@b3s8W_e(43UzP)VNnjRP5HCTm>>nD zu2G2aOW_iS7dNWIV@rc~MTmF7(RC@05&1WBF3acx-VMLGv3AQ)o+9-Y)D-GZeSUV{ z-?oXi4imvdODoLx$?dpTH+8|4>a>|Gq9scp_H1Rv7-c1tZ2odJ4)g6mx8-ur^{a6b z0S`VBR@{h)lii$}u3D|qyy|>@bS+}-5~ zwQ=5xop_%$dgeta*=&%fm75h0H{zC2mB)FZX9scfB3k7~U(%HtuG&4N39 zxRbLgaNd0U=?U$mp-LO!>%7@U@Fo@;%mC7EpE#n1CoNX^hj%b}F=I0ut|&E(W$EU* z5Xd!wY=2^N^IOjjj!j(o`D ztug(xi`t=chmA-uN;!fLJBiAFK6|43Etoo8(ZU8na9=x(6KTVg_)P1H{qM+JJ0j?w zylW&<|JW-DN_6AK@a`3~6*yklFUeWObp;4{@H`OS3I0XVh8QNotsQq>me~mB!#%mS z*xi}=QHANpTf;~rT9!;4PM(H8KS>^c(e2#Lz6WcfZx!SP1@i&a1>RWE?pOeDrP2KjMVAFk3L69^{aB&G4E|Aw$ic>yQWE$OIlioLHm_zdj@n%}x6d>}=Yz z<7fD8cZU^#Dv|)7g^|`C-0YWAXfmLI{(|u3cq;3bTGNrA?cd1gA5Pjh!YEe%Lk-@; z>;6JAd%pVk)iL*e!fbAEa4`ZZp1HRx-L`d(?I?Qx#uGxMl*X#`LxBu`fb(AU^acqHq?CJ5xpvWBc4y3s=mIR&36QRi>QKntW9oNgILReW!Q@`6e9*STpX;9Hk4~&v z=01WfMBCnw%teR6TQ;a@Uu##Y zo3qli<65xne$e;c5(5mVsS_d!x`&9!k;Fu!YvG*gg5|97=yaB4_KSg3EJynnl zBcL=_$mWSE^>lSw(-GbAxlZGc=mCbBU_T^v_f!c8$9xmGE+0JwI470VcOAd{Y??9@ zEE+^1m$)EM`jvjb5mZvo^l-*Xq2UtnqjJW+AdAHgtgg<+k0!Z%rR8;y9uTh+NDnPK zvLH@kd>zgoyvPK-`bRia(rgeZ+$a`2{m zp02%&d$zlpT!~h9KKpS{Euk=?#O1@)?2t!OO?^Z-apr^yAWRu?PPujS@L5_BuEf*o z?PBKOzGa_>(hm$$w+gas(Dfr7qGuQM4}pT8308TJf%HquOqCN7`oR8ik}QAeBV`VM zDry*In~;!E<%B&aXmc+Ul0_+$wS|69b9mEpX}{FC#*Xb}vKDt{kBuXZ{R9r8@PN^9K|OgdD%n{yuau{pC3{E+x1sK{+&vbC}seG-{BXVZP*fHDMHD!M%kUE zTJ37HXlEAVZwLQQtGr7Lh<%b6=_YrHMxoVTmh#)~HSIEEUEYZao-eJceq)#rQP44( zZANC>S`GeHx>|cG-UYE#b;beQUi@Lk*Qb;Uch-+n?|2rGv5Y^C%IIk^H7Q@r`?ksRb|C~E>G})!3 z`^4S&`$PDM_*+d=Yhc&gNsY3|!_GUW7E~sWVy%!{=2W>Bk5B70zNunG6ML?uYKWxu zn|Aud(40kLB0Zm6$uUr*s94R>NPq>ga`zr$>hfSkwvqeNzF2wr=QFl9yS)_4mk6UKb zBD-CdgtCp?WCJ%tonmZvItEiygRr#EF1w?Ln`0p_4n+m4%N{+iZQJkEr<|gPMp8p* z8Lz|PA5N-*$Z3l%9E}W=FhLmLk}cAFo`Yz(?YdmYIuKp084Mbk@N?$+b9mHx%L8U& z1)tyTg>a=M#NCHisG#G|8g27fexRuT!Nwjiy%F%jNVm-LNP)!PkfGq0&xxH*auiU$ z@)kX3H`LV-aXt)pp;<{Ojp4E8}q?p}j zkE$*RCA?N1bD^-Wp#rwJ^T(W^wl1@fVGu1bQjk+jpXqw5MoG8KO?wDW>v8*Cw+Lsn zV}VUcs5JABJwiM+-U&3R@0G2O!|Eb$i-Q+V%8tg=*|0@`V+mWdNAAR~hv~-!#2{=N z!%P$)Su=*@3!M07SRZU&@V;Z*K-=o7a3y@oNacXdruNG8p1rF8JUkp!{^a$^%1XBZ zV>-+gYA2iFhQDd7zefOCsK2A9qqVPqmkP!&d-c#-w$F-+nuV)@8ylHx_j7NTfq~1L zZf!3)p4V=kOpNz5)_W!te)IKWUht0WOPQ!qi#+f!CTG=uK4eT`jf?k{6eG~ne0leq z5mOV9xSlp|R4u#-L0OV63wrb8_4QDE&Y6--;6(6?KrFE@6Q+C>V(F%_UAkw))ynX3 zI1POTwG<-V;189CRkOa^B)wT|Jqeg3xivJ2W&KBy#_$*(WA#RLI?XoIOpVIi5M}|_jr6}scWW)EwkXKhJZi%1Hx2$Kq_s(+td2n!ho;`o2lGiW3gnas&AnU zT8_nn&*|YGT7&a{mK(ZWc)TEYbb^+LDcWk^-`?Xnco!@kHP+(q{$mVOeM9(S)YkM9 zUZbtSVYT_&i>~bSd{~c;Y!5?fu%}!5>o+yhSnFL&*#rz7CK!|Vx{i%TC&=6`nF>C^ zFrdW`E^*eWQ>X2JO0aAN@A<-6Y+F|M0M=mj%5H7&0o*D?xlyp#yG2#Suvz2aCL5fC zOL_yU?G~g)y0AJue{1deGyf;RLG;{--{pZg&6&3o?rA}Cymhmm zsQGArBG>mey+}D*kdCpSSncqAmXSG63gAtn02flNL9fNi0#f8o{LJRsGNv_%_cwxgs0T(e4qo__PR{Z$8ta3%W9;#2~fEIV|~ zTiLT=%nUY>>CexT4AZ%e5%Tmizv)Z>XXd_~4ADG3@{j<(reb^?_N{y88U^8rBm|l} zvo77nk?Y>d{x+<=1&%yOHDnlGAPP_cz@`W!iKH^-8otL$WQ=r$v>Z>UG7wQNE2g)e z$X#!Djj9}*ojMcnGCA+<#jckuhUJ0!#cQX424LQwljs3LNVcuYE|`5)JA#?374tk@ z>PTc3BQQpOmwoH6w+(*0z|^={)ebqvqVroj@lUIl0N=#>*S8G(L@l7Dv0UG zFb3%Qp4#ez{o9ut8gFC!lp@ChZUC3EK^bB3W;Qzk#2Gzg%1%G8zG{!R%tS>Un_c*=9u0T zAOYP|tM;1U9K&!h2y2!%td+gC_hKTLrP0zHvfjp)z(Xg`ec)eqJe!Y-q+4MvZ^5iA{hz=*7Zm?!%=5rwm z88B?RL4u({={*3ClFBb!Kh*6z~6NpT2L-HiXsTPMroFa(W~YeWMHq7^mp_5 z-`lTwB1ltD_CPtU_=G#aaJcktz3s8+`^Cx0iD$>ts&c@eL)HH# z#Kjy(xBg4NCs!W&Ie%VlNK0fx$LjUUglm}iX}=*&?N+gD0o}@tu;PT3%U+w==*Kvq zP|m?aI{gCTP^3}&_VO7U0G2FpOIYcplNVfa) zWr2WC_6G$>P+uSM_k)Cf-g}c@67hq8z_Qit0QMQdbhX!^0UZUUGtHM3E8N&M zbs7@+;y$1LvqV2$K=q9MOqU5hb1O%aLBvFh|FTx)Kuv!r583BM3;dJw7U#D$AVI`? z^^-J}pa93+njWfwXX@wtjoukvznC5p0hZ4ku-Ej&mFv#?nGS(H*_G`+JH1opVSeMF z`uin8>H=pM4-YF3G|&rDPI9V4Z&2qSFq?7oQNJ)&@U<1mE*`AfLzg-M#tGSzI(s_4{Ab&hEI2=-2acNuZ(JQ(SpUHI7N%QySuwXad&qO z?pBHv3KX~E?h>5h?(XjH_R@3DefPaz-=Ab9Yh`E4?AbHA@(p@HfA-H9wp#WCsnJ`0 zXOui9KX-|z$uk+UL>3|oe!Si=wOv9G_3*(G&Dh3(;zy2Hxk-A=q2m7smz|+5BNb)W zu_F#td4K{Ui3+n@8)%~ttutF!zE2hj18nWaj5hGfnl8NR zC)+>SsEizu>VY3iRutBor<|XosEIty`~wsTo05U~OUR6fb|NpY$E@zb>@Vg_H>nNb zWwoVVQ-JiwMo7B29ko2>t#6Px*`0JW%WIG-Z7AaW=`hg2x^=*2>@mF|CsrAY>N-0u zzXrt3S&SB{{^)}E?dBw9-)L;wR*Z!ZjG9%tRhM4VsE)aMW|nYdMUM4J3M3^>nS_Qo z5jq|gSL?4Ll z;1%F7XH9kT0IAqDxm(hv4r6}%tLtjRk;*{2fh0Bci+RzP3FG=o4R^M4V2|){W!Hmy zUQ-NBzG~&D`gC#MrM171GJi@M9BXByx^H}3W|5~#t+2Yi`{dpv5FY_?!=z#DBMa7m z&;N9x^XVa|n<1UE_je0{r35+dmxv#(AswAXc#P{_KVXoV_dH@Ws4`w~z`tH=Opbnw z9l>WE(f6+Y{7p>zwbqz15Nwo|{PPf-<@o)>Lt_JvW1I5_os{7S`M^jiJaDx@axtY= zgoK{FR&Y?@2L*=TjtEcOP+0~t9-|3~G?8sYSHO$o2T0kH)4i?c!Jn|8s{qaD#id?n zwMd-BY5nn&&IaC50iS%!zc~ih8)U|LiE{F~EzxdvUoI&I6MP)K2H?VKt|<#7?}J7#Xi?j3`uE z(gTaWg0$Jdp@f@tM8t6A=}e-l+`2R$;5-T{^mN|0{fyd{Ws$kJ!-E`v?k|nqD-J;G zi}Q+78-HgD+AncES8+pIv)cAHA>e9Uh<$k9Vak?lSagMFDbSCiqEZ)PvjtzbYfP)M zf=g}K@#&Z^_-w44v-$Y0rbna(`l(XQFKi@0t2x>}J4TSxUt)uztaR(QKQV3N*;uILwhL7hdn7t!My73b}5QljLKqp<4Sm#=|C0(p%kSG7? z<{tP!0N6=iudQYd*j`kr(6MCMva4=6Rpc&6%g6!=RAl_L38evQ5jh!Kv8yl6Tf%Rs zcQ-W|jbsjyDP5sp|9Di=#+3W9(Mb+YNfA|zio%pqiGey|#5A~gxVyV6Pma5>x&icg z@W@}H)*xN@vts#4bjKxj6+M|zW@sbfcRXzYi}mY(KAJ8Ox%0CQIutSi@9nf4(^cU) z-s>+#F&`uz!W5KQ2KAeippg{vPyhV1|FqDHMsST1lwegxV~nTrzqjQhGfqq+e5v6vt7_k*@E9hWz1NLQkNN)&?fIDkv)OZ^U`$P$ z_lOoDyu+VzlV)QU%vPNknLa^8S<4uvsifR=yX#9f=_a?y_tt9Zhq+HZ`wtcT8I~~i z#k~!`N1hlbSZVcHc0JmCy@mQ5V-ekLGJ`8T)aC98tye5k#1;6YVQbWb>(Pe2kB$A- zElv-vgWaDRRHyhAcmxi#qvYau6U2{tcyQ;@M_v?`qNoN(mZ=+>U0Pq7TR*>P)eOBh z-_(k>vty0;-Z}U`)b=6Hy_2?#+1x_lFLUM-fC3 zaLielT0ggTrQ;}C$lFMCfad*;J&AH^UJ;Z0k^7hK0a(_>$;2_Q%Wf=&c1 z#Xhr?D@#9p58I3alKjj6LI^bWR3m9Vz3Mi(g0!uz&%D>`?$E`m+DK!a9URVKg&w;> zh9>jNVue#^5M`0VWRI5)q(~RI*SHnWT@1@gAMSfT8_eUem`3r+26M$j^w>Sm725eU zDCe_+&rio)ib=8eDNL~F1)#mVa6Tzm9tj5g6+`-^OuPHZeE+Fk%)52{J2V9N9!OdU z6R#p-mPpj70ktc**}&0h*$&}*vcXc_v`vE_(p?}*ndtzNe2dl{b|S{iQqd!p+ozDAw4 z2~C@AE{nW{ya2<+Y~_bxdT`7!<+#r=!MG&eGrQ#zk6}f`*rD){0tm{3uTV{ zo!0;sFo|}*c-IAXOOY%~d1NZiP{*NI6 zJZ^^%es7Ri(U{S)=B_2GmEtB-M@!Hl299-0;%ToYmPforVoi8H=!^cy8I7#Y^agm` z=_!Q#hVtP*K}!RismQ9~uE9p|xUx{Y=l9qz^~@e_MY zH8+x0%EzI366*|E{XUe?le~=5(>GXD4)%g^gaXf?bA#)~^R?GVmqb*hB2Z213T~KA z2;G#*r^%qv^Va(L_b%w)l2#T4Mi_h*-(~xU4i6br0O8RV_XWYK)-Ce~#Gf2}cktr) zucgK8Hx0IgrN5(sc=O^tc)05}^zaqNH_9;g$i#1y0|IIU-)^9yd1JKfb&?oBbZF8U0JMezl^P?``bn?*rwo%w4x`E*+VU?6n)|d_$PX`6LHFTBg#B9^F zJdr8%F}E3Yxz#X=giL-RReW_E*p zOoGlXt?Zp*GMSR$3qEs?*l}92e`&X8)C%n^?XU7786~G*L2)>~I6JQW#eBdkfC21| z>=^`kZNfb!9$~n(h;SIo&$%qw)UA2EWD-_Av{+_mWu=Cu@mV=;8Z~y61E+}KV1kVc zkJh_j$CXcIx;&6Fat|rr>(FrmMhLdKwF)oe^p&@TNJ6knqlPeC6%5LWKKB#^xe;y} zCut%<`r;a=X?i(F7N9zmE zJe?ieAi8-qKy;wMgP6r9J(S+-OaZ?7^Cw+JGtJ!iBV9>^+5b5AIbmqUKBB}F7iC!| zo=E=RQwWHNK8BS1|K%e_ll)a7K;J@2+*eQl$Q6sOtjy$k9V&5r>|M|~`o|THML^Tm zX_!viY*y-4sqCN||F+6?*uKZyxHcFwd<}Vq%vOHkRTl>sg4m#LpsZ+R2h}xAo6?qZ zy!PwOURmJ6h`D$-buiJ>G)rK%OkEtz;oBMViYzS@ky_P`mq^XXP&qY`c*^g7Kb|Xu zWkc?^tDXN9?~o0`AveSg-rcoWFBBpK7w*Vm_`Aj1vho?bk`T1Mq|j1~NDcex?*cS;g| zK)Xf+0)QIl`v7{M2{;)eMzj;_;mHZ+t2vn!AAjNgzKG8S5m7Jc?o(e_LXbgvz^3~lIM2cO?7gmXO3?6c-_>sHiCQ23;SiQ3k^_uWH^<-H+)H$#Ki>3p??=>0Nc z_*#lm=*;;^Eg?)-RM_*b|FoZ1aXs@O8O+RFG7!xO3I|+rb6iq*ov@f?8=D$A$!seb zm3#eReCTjZ^Q+^aj@F;2C?(&#CzUP+ZO~gb6{T{nuU+q?-g7&cPbRb5n*3*Xw_@7i zwzl5781F9~x;|}i2nM`OIv?z!4G_IG>`b=|@44Q!9C>@U7|`>y30nRh;9%Y7b!xiV zWRa>L*t)ugSw{kM2?l)^4?Kuwa|w0_<)+%5Av4zO3CH1>x^}WN@o~J+PzYoz&~Z95 z`&n3+t|`=V3>e`LviPdoz4~Psl6o%)mze7`#F6s1D590;Dv?WF$|3tQt7#-8&RP5E zpE3+}BHFeh-wrWFseRto-(V>f*Ib(x&VIE5ay80ATU$i{eC>kqb585`Fuvf~MEVBW zQHI_p!(q`Wbw~JM`EPLxgc?NDCcHn@J|}E;s)S4uPp^RKe*@c`v!O^IGOPU|ThKah z0K0GGYJ0kvsYrEo0Be|@qvfW1La>R6voz`&iNo1Zq?jPSc=1^(YZUW24r#$96Vfcul-yd0j_Q zW&574b>0X&nSAD%lP&pvrCIvqV(slPMRX}8M)F2$W#a&wc;}6&`?EK-{kT~6JaxT~ zB$4ZIMF(0QOy5wGc}!=oba1q2k0MXLZ3{v>hH4_avn{~o_0O7=VkYlZ_9tf* znb;L}GcGGRwU&R0GG#|-fujI0av@Fa)GNp&kMFne4NU6`Q90PtAE$kp|Qcmr-m{M7Yvqc14>mD%izdy2pUSS8?n&46S zHjEii*CFW_gj$7sJCgX2*N$x9)sx#2jO9}WKw7d|$N#~LDRaGM2?o%D47;|T5jC2t zIs>c#06RN7UteFBkN5K|2SBeB&|AR4k;RaH_hz#ty1=C5J9bZc$`&C(w7ACrL-W?* zHwmhKkbG0Cb$}x;>>)QqAfJZDPIMXF;z2rAG~C9pkK#HTOUuXUlIBFa7jo>2)>xq5 zW{6-X>`N+8uk0$RU{C#YVV&nd<>Hfly#qIki)a|=3;Zz=`jF{0@1^#=%Rn5=-z}$o zZgA%c0P8@w?3}?h4@b|)NINTR_vDMO|8=XohaehE&jo18()XDo?(3Bp$eYhPTCz2& zvA|+p9qQM1le}now})w733Tc#Ye86p$0&Yoiz3Z0@Lq7swH;3);Kl5f9_Vaa09td; zN-3ZkL@K-v9KQ8=10knqW7ycq*#YMTmRa7;{tn&6OLkmn{-ODA4wN)<9Cq-va8GIo zOw|QWuO7U9{!Z(aE}smS`$Ti|J^hlYV8#zi)M(Skh)bUWxvP^riE;iwVw8XG;_gar z6(F1}25Ca3%97kmb0$Jx>Gv}pQf#;Jc~Cj>bQL~STA7(yG2?I8LJr~yua))6-~SO zY4W!m8aa{$UhY3b>Nb0O;t~=Jc=d7^JcJulT_~ortY%}8fQeO8m-_ z@4V!aWVEmJb;c|lWa(_M(wFUJIc>=ly#(;#)?KeFeG~~57@5lH$6-K53md}BvMbNi z4r4(^^tcu3CkGpCmw!wr+U}pzpIov$UZJb#_~`68IesVDaHEnhgp)qi@_wz*ta)eM z90;GpSm%!$tE@S4A0Rrk5HvhIJLB=%hFS$~6~%&+c5(5>3W=hwF;xy15Rj=1dhq(d&BpS4>o(rj zv_%F4q)W}rawM8Kh=~!w?nOmwxBVzjP_9d?jdhoZkEPdmo>zy7yFtLNlph<_C{1e0 z+n0cBxn`Eh6Xp`Pk{ zv6vm&t`*ofpn*2Y}ylbob?e;B;$@?fXBqLm(W?!O&gvVs1`dAX0@Y za7sIaE9=v-;=0HqAq+$&82UpHniU6xK^z}$wD&6KMe$)ye<5BmJ%)YGyjIk&(h7p~ zO2=z6g$jFReHK?#VL${#?haKfVdu-`@$~BPajg)(gtTh_^XVTLZU;?jd{O=zGg80( zFg7K@yVccKh(1=SRadV;%KC8fvZ5Q0-_))Wm^NzN5#OjG6!b_Gr<5{^5y)waclG== zAH6hDfj&+-AL~BnEg$bMDEQog%1?`Pc(AM6V!5c2(2f@_HQ&4T%joDp%9C=@(MN9Z z0f`X)ATj5{zKw+~zZXiXejlJIVTuYv$|f`THb<5$20S$HgwtK68Zv<(KZ_s>AK%-u ztz`|XaQvXw3@T!L85jN^YtLhG)yZ8KQulG-mQ#KJG61k3eAFwop#psuL!uMGVQo#g zlfwk*t=(rLIrAIKi*$t^6EoN1_(X;}I)q)KLtnx`ATMo;6$?AL(x6>Xs1tCw86+0* z;8Wv-2d}nLYm}OI3IkG0q)AIslTbZ8KW7zN&^>-#B83tJDHErZ6X35ZUR)@?OGM)? z+gfZL$B4z?8a6J6<|8kp;W{T87 zIlw56j98$}7NL%Ba|@~GWkSf6DuR7u$2B_QZ`0y~3BERmhXUjsn_Kb6S@=W+7Y#8R zqInyU*~Yi^+ldHNmwIv}QAfF&qa+9^S=10>gXhwFO|KunX!IS4>dfV1*-jpYa*RQ zxnoLM{9ccj#*^!dguzx9PB_uD!;7szJsOPbXgRrsqRNS}iJ}A=Kn%fuSvlP|Tni4kY6}9Syi|qOwD1C(eN`Dl zN2XxDMQHj4n4rDAzqVZ?!}k~8Uqwb2iW2DU(7@kBI2qyJzC2(txVry0`3Isc#=uo4 zdY+6g10@MhukYwy+RB=OgTn-3!Qd{Q$v&#tLb)1iVYc4Z`8-iBVl#B-u(QkgAB2vR zT%_(}`TG90sc;a0b#WDlh0BL z-+G5p`LpDS4dE=%IOt`^aBqX!bXwr&*>Ph5o2Dl&B2?KYfbkXZfZNZK5$fo~o-C+P zL&Bl1_+X!1Je5$|EWp1|Z|QLg332)C4P!#FD_XKSMZsJ|YaQYu0%f3d;{e3%0_|kI zA>2Mr#!Q-JUryBx22Jw$zeBM=oC`XCzWrFLs~R02n=ivOGr1@66`*b9C!AD{Qe*ug z?TJeO{ovrskkgc;gLH)$PmY}ZyzV=gDt|FAqVwD4DEfD~4eiM10#j|wFA&5tfffU` zGGibi0~=op@B8D1qrJH~bWe~KJDvy0X)yOB0!@4#gDvTvZfhZJfkdJ93W`n)pUbZ% zKhy)RWFi2sbLWIkK7Y%KC2C+<6E5AkOGB}=>j=`)T#&ZW^T~AMubk$j4&WH2gJ>p zaW!&jJ1_3j)VM4n&y*oso+uZ(TxMxcFd;DQ$y5mrVFQUwIVJr&l5(Kal8=NmT-Fs%Ch z+VG9ufeoTrwFAT#rp@oZ{;xvrqp+SDhAXZ*LD`%g7k3l8jfj`6&9 z=+pL@SR{%NXdIam`nVBl%EN3Nf;+{6vN_*abB01>?SjjzNDi@}hT$F#;t~jHn-3E$oB%j3NZ_M$Lp`YA^MYjc zxL#jM?XGAd0(VMYoc8JU;Gnb?%XEiN8zL{M&1I2WBX62#X{H=04Gs?1(Gi@>Wn~+| zh%eP)9yFYd2(}#%^sE)A> zUlaKP@D7e?-J(Oe#&!tXY+NH;c-`J+o5=LPZ<%q-;NueNM7@O0n{ukqkt6?{!erRt zwzd7*V^X6AUiOW}WZ)JVcY?tK8f~0LGFWJGVJ5)H7i8*Sz*GQt@v)>B$e#yfEhodD*McDb~Cbv5^J-toQy9^HySm z@X-2fDw#9^K~{~8T5Q0p`8F&xUsUzwu2B{B@oGm@`bNpG|Eg;s18!+h3W!SF^Rm@h zRYAY?1D-H!PW973ilC<78HH5EawVe^-{1UlfI6w)?wlX(SH=ewthmJkIxgqU)W|sm z=9I}};RNyFfx^hI-9tGt2Da?i?-=#@WIH{XA1bzV9J|s8F&^X;lp6}>3dWhL)YkBi znHw7$t{*GscRt4>(Fj4x+{<&OpV!xkA-)%}EgfVBJhjX)?bkuqG}UOd9a zxFreWYQ)l_>*Oq!r-&$#UWfUjQuQ8)MLPvDV#zL^dbQ8hiy9f z!?;j%-g0ob=E*0pPN!KV==t1o!nW|@100Zq73&smQ61aANs`4BM?94H_Q7D%=Q#{; zXeR>ioVd7YZm)a~diMhfW?#+q74!i}L2xeG$Lr))ua?wZ|B0n$GM4iL6X{N38Q1+} zS4lte#^swq6xGe{v0oyO$4NVI3>WhzMW&s!2hqs(36~UYlAg23Hbnncr@b7aM21G2 z{M!1Oi-G}K#fbLAeattva3u0QJCdr>ATup9J39l14`4M7$qXIH`+Y1j&)xYjI}O== z{NzCbXae-pN!vM{Madvrd)Nb9@JW$H@HW%|frhPRTo9aY#7kS)A(>-9p?fz{i+X;_wX-&1{7IZLfyx^9}Hw}oY%n6#{@wG-78s5wgQC_?e0B+uI)#0{0qoQ>yCZlt`u+eiSkcp^k->maTD z7E1%)_b|3S(IuxPf0tIY!&8>qjwi9w)PTp$_xyqLG=5+5 zJbudw>l?)>n3ZVoc43OPFp-S|$g);#+-3Nu49iDBY`N%C9)?Uwh|*WAF&gbroaqvE z8&JZ_%u00yW>6`v$BbyG)t7!19Wv`lvm#Ag{}UjW!#)J_dSN;RCj<|LRlx_6Z_myY z3NTpu7~D0aP7OPg5cX%FOIL_%Qx`<|H=%$YPDP}F=|*obfthW(o_VGn>l?W50_GoE z5k%o3F|wfSa|#V*Ll@m3^*+>mZPB1-O*Lozc^%GrJk-Q+zbqeH+)(j1*8H5=xhpNA!hw#Q zu9S9j%3+$HTNC1*<>JQwCiy1l=*jN8z1SV+e@g~Zu!)eAl#C?hy0Ya20;io8ki&v6 zi@uBZ=97tO)mB&6GqZ82)9=<08~OT@Vx0`{)nYSd3^49%VHw57>a~Yx(JTLT$mm0t z;qG<>NHn0Kp{`+`9w4cH5%;Y4ws^DWQlf#0uAScGBDivK*qU)VSyR|Hi2juKA)AUZ znC0hQp8i`l#^z@Nte`%!_;_|&nzlg{k${U6zzsE^15J8Ft-1(nFNeaJdP#!~;dl5J zoK%l~4fVz+X)T@G_os;f18u@jMEp|^y0k+*_oRVL_a0s`VT5Reff zme%BnEREubx_;?r4YD^I`?S2m<5~bx!y&lZyT6YH?M-lk+Jl9;@x$?oa4XIi%UM^L z+@Ko1pOMd@fboC%Yj7%rx=Kn`y#v=J(?Iu`68^eyU_U$gB(2r%Mv2S*I}X!Le6Z{{ zJ&}kdcqEymimZ$1)=6+K9u^jliL3mmISGD<@G8C#4{BJ!Yoq`BV zsu6b#6rB|08-+SQWNZd%eaS>hb7Q$jb&8AIg_$kbwBtSC!eV}HfCqG)+!U&QQ9Yj( zYo#<50`LoT4-Ptm_91Fz;k}0^=jSJ}!83PKCO^(Ql(~b!4hiF^K3~Qm-^C!__oQRx zPwdue`H-WX&#J8dHf(kZ_NP}PMm71dxY;F`vXz#WmX)5(kn|12QFwugU_N2Y2w+Q; z8Tllv)m?^nu?K${ECry2RJ!n`+6=rLnA3s&&D1ASXk|9;TN8<&*0wB{-RiP0_iGjm zk5xiK6&2lJnZ;NF**u*{G%uXG_Z1Z$DrSx8|3Cp zO-$4KjI3N+V!pSs{0MV;a@OyQCHYuE@sCJ!oX~qS>)Te85?yMT2Jz&rmF~l>jfAV+ zKUe^fm(?F|o4~@?3Z@oA zufmKGj;U-0f~q4B#E~x0rVD?IyF=V&YlCvZQ83tLiv8%`yuqvcoHDUcd!Jl;a^ynz zPZTyq1)d*g4w<>MtlHx)ci8X+l*Jr8jf~ve4$**8mv5bsM=Wd zD=pce6fxW5q`0$-7E`5_Rklki=;$s|u&pSnb~sv=XB%)>tq=31xBr53=(FNSb)3ZC z0oz;i3xtOWo1W&zEDkQopD$S&`abQ|?XJ^mfU&Zm`<^+r_pJ{?)HsCq{uzyNC27=b{=2Dwl?UxaF;L%Oln4|tPMi1o5|Q_`{JV6I zyk}AFy#<8tJ&bV+1c+odeD<#da7JiYq6nc79jZ0e&DG7gN}F-hl^()SAnP%jKfr~V zHG zrR}SwYD07q!mmjUmM~(wvPl`%ENkS*4CrsJ!>!Pw0?Lj+1+CMZwuS>4UEuhOS$3ED z<_Xth!aU&PbYzphJroQa3jyj4jt~9t&J^qZfEp7ZJoshHGg+0Q)7`q)I9^To@5DU* zBsjZ{vT+*EWVA(2sOm4SN{*V;s5bRhUqup3ZRp!&WXpWX6oxF&qUO{@$j#r=SaU0G zlZd%F*J8`9Iu}l+q<7c9QhA&H0Qgd1Aj0OcIQbaFaea>Mvb=2p1<29p2qt$6uHszr zl2|lvVumjZrPc9l=@aA=4_1*USP1{g4@SuD>otKjfk=-mS;~nlzb{iqAW|q=zpuZsgR^m^ z9t~u+ON(;Z&({v4k1iwj&mK6Hsx8fF(ka79E7tzHCqFj}9k~S*m5@f55C42=;Sa7y z5OPeLMT$sU^v1Tjj>a}m(-akpEiX8cmMBqDmlnh4O3sWm|9~xPrQ7;nZUX5o0O@f_pSc~-V)(i;f!(-v)uoadi%$|(nrPptP(*IvR`A1 z$^lO{=reeUz?;1ee=^=zGbYLMt(+0;w_VLDS-zvmljyTPZxKQ`Ctooz!Yf4LdmWt9B>ZM%~iP$(vXF&gG>z%w9O*^WEM2 z5rTe|1l=@%7b&6dP_=Rffo8yzG176C zfcf#490x4-i#K!V5GGPY2pikigLOcARZ~?{6N)Y5Hpngk$fARS3MUD<2)(+83?r%q zP$`{t(YlBqOQPeG_t6|tza2Q@tY+ckDbTe26}tP{el^9OXgxmSRmljZ-Q;}zH7j|B zIGS{}&{pCr*_Whp-+Tw+!{>&w1yBjP!hRk6(c5h#Je#94pVV4OKf262P2Y}kd$+}( z@J9*(^^xgguX8h91oxiT?*i{75sSTtG94|4xlo6AX00Pr{N|E-?0L=?6Pe4Ndg{jW%74U}8aAQfp@lrJ%j@kSl#70*HETai=o{r9#>O{As z{jC+Nto|*T%N#8$jQ6YxHef@|Ps0T2oE{1_q_wIFR;6REn!aD!e6a_HtMwz=oT`Mb2+=l*pcb3^c z;C5xN$>fSLxa@fGGISC@)9KZN=OT+q=(hCX1`{GqaVb=Y>|w<$Rz)l_~%s~GG0?wW!dS09&@FJKeo*&S-%mZ^AI)P==v)2KC$ zUUp0w=lIP%R-r=#)`xV9S!)MC+JYN*03W7*5Cta-vhZ9utALke`WzEHiX7H+Fy0wH z2L?J$Ff}zD5{LN7x$S72XqP4m*P~x%Oy|_O5P^V_bp=}fEDn{_e!bxKQH0`kYCXd5 zA*v&BlhiIOX{r@Igj106bJ_r7rbnm!M zs-h0LzFv`MKvAQ&7HE@A_yTm zy1pyXSe(-p>F&vl5N5!v@;?*ev#7#-t~$Yr`|1tA0|9XZkVK{^7g!-{Mh4;RofJK~ z^F>ljserp50p(0%Ww7i>g&;)!?~r^(8mOx$&aK&y4&hVw+W3iY)ayiXomgL3q27LX z6_so<2rkg?^deDc)Q&Jxn%enLJ0{bSu}16nzVAqa_KIr0*-X3hS5=MbPt2vnHriOw zWRwlX(iG{Xe@K74C}twUwztUh;=}^BkB?GyEU|Aa~`fDeCn zcOS@_ot~{^q@8g8t1us?L&b8_>=Y%i$CG52FB~5^q9zSKUS3JbIBDtW<^Xh{xukA) zR8biEYlN{Ey2`VtmpVE6iX0jcA@(Y%P*0LA?J3R<3u{=iO(1i65aU{8!8GP|RclfI z_`AGcOcT8>^P9RvDw#XAt{#&p`2J54R(tJv^HSpLt5?Rv5rY;NKW8sP@ywjHimjMoZRHbLbN%49&e{T$b3TZnK~IyHb1=g@$yemQwum}6AQ$x zenpEno#RW4t<$IfXA&}ja(bv_ayIP&W*$tRxdk}ACYJVH_+9ucZb(sp_I>C0P}NOq zo+%3cf>GUC;n0WPfX<=#eTC#Jj6&5ipk)UywDyt_t3|%N8ny-XB3X2{1&$lDk4vSW&n{7PyU)bY857?4LZ;jfd-t+_g1w zZDL?)gCioV`soVb^+HGHSUox%$ApS+`7HV zWmi-%?vRX}WjgSC(5RQ5v&Aj=-xI7a`V@_mHI2ZnmcRkp4Y;#Prq1jDH<`O_cRzN{ zg>YkNm9;=?07?kBYLGw3O1*8BB;pzvW;%TPj$`)q9Iq7*F6?8iAaS62kaqQ!1aTxAc2o#|MU zH3!m2onn(TG@_pvUpyizR1UL=Ns=|UPSS%TxPF;l<~Svc@46D4ULm^0=oG-`0o7^hs z*?$e~S?nLwJwnfQ|LpXCChncVOZm*L8UIJHiVEkluQd+`e>){aM&H07wyLt{Mt2lh z9^+=ud8evwgE=F~g&}jO8?$4`jxTW!{{E}fsXNs?9kB~H7WM8;n7d-onjZ&pEBsvw zhoI~Iie?Z_+$^~YR!%AZ{M5|1!D4PRSX9b&C&nszrHN5e*4N$lsP}h+6fIZc(^T1H zc}#Ua(Z=#9k=uJW(;*1gb%+gne;*K?XWjdR!TeSXJzJF(;YXc7>3#{z6LYL7%H)uJ%(hzF@K$rniydZRsbP{9Ir26d}yg1pSw&ZX`3%ircT?p z1`p&AGFnEZ2CuO~B3@PQj+wyusrkCy!UP#O$1geEdCyl~%FnsRKAzVUpr5w;i9Zz?Wp z03gNM=S7t8{JC#mrmPaKwdXWtiN{t?dRWz`N0(Z{wheyT+t+vYOoHBT=~Ib3hxBJmJo8iq7!qSPM_y0gdaxiSkcrjsvD0B! zP1XyDrP@dm=%_h|)e*T{ugOFIf0sSqyE21>XAHgGU^d5bHY;)ZUIv76pQ9=;J3rno z%Kom5E2W6DEBsza2DZzmDw};1EHv@*-I@QjD@wmnRkj`77Vh z(FZOB(-bHMQy1gx+lIVA0#ZzwUQbDy$aosAwN(fy5FNHO3> z$C&6VD)aIL$9TW?ql!jO5W@9X!3I@9&VVPawjGQA~^f_&hVM;o; zaR|Qjv$JzNn!cd^N=tjbiVG+|JyHTwr$n$977o~rv6XrNvlTm8h5BDVQV$FMrquRo zKbPgvf=Lkc&rwjXu!2_n`iOUaQ#HTR5Yt537W2S=i0GO#f3H9U znvvbjKTXIt?xA63wHcW@E;K~XT?lPcYcsN(;h{GDg;P9P|DyM-sjDTZe0;rLJ72QL zZ%h}olrcQ7m-cH|AkxLa;(ExooD3h9DTpcY#4YS* z;LWv)2)a)>-FkSgecb!-Gr}%vqOL18jUaI8ReikbVrTi?drj6vZpl}a1(1@AIj~F5 zH8nuYVMSPjH(QBGiFTOLU~;r0!U7x~y~HLC?o5cxt33&;s1k>c>D)(;2`+;SjLRJ2 zflt1KB4gdNpKBE4n-l2$Ai;lw{b6Z1SBa%&Z**Z!eBq8q zsg{2*!<|@Di+M)Wnjn=Dk)T#Og~c-A3W`#OHuVb;kqE$*-X86Evf(aibv142mnl>R z*T!cpE4!V8UKFA7j_%jWNk^0bH@uj-k}l(*CY`mLf!LuDY!Bj1}8Y-X`?)g|baI z^4hyF>T-RVaQ#HP0G1u#cKA3KXLCthr7=IZCI6q40SOLp3D!`?bcfe6ZxpHanGEk& zLqBrEHP%sAJ@^2{>h~@}aZpr*bPF3AR$bn#!v%)>EQg2chty&+m|MyXmFH{Dndf!T ze;Y2hDGJL|Reqw4pe=?9^B=}Ty3&Zb%6?9bsmvSjdFnSx+f-Iv%rmxi{s`e3+&AS0aD z>VcE9Z{js|9QY+kSIB70mYZcU%!`*uj2Q5XZFq>XX#Q)PP0$la(->}Csz%*WP*S5e zqBZd&L1Tq!f#XiZ$@ea#EWqktOseGe#9@}~)nr+7@nF{gH$Za{(AL@6+Sv;li_h#4 z&mB_mSwv`^UlE?z2q4hm#13KT2&m2m1iCoqWZharg`PTX)lIn!PJ*Gtd8e5-S>r=Vk5Jw&{=Crh0wO4y?b-_L;pC z&8KGrp})*_BTo|L3G$JR_XM_vV22f3)2%hup9^gCpDyfgFX!=cQ@_&8 zbv%VV(}u|}ME~tZKo>oYXkGbtRv@kCX^i8S#<6vqzRaz*zuYCMngd!+ZFLzCsX!oB zn0S-u3t_!5vm@W_O56$%-MVxx!%kLrY-eVFAQYJ*sdjXVujmBf%Z3}|%QNUSM4NU$ z=kVIgdSTb7I-W`J<@RQw($F(FWEN5O!~(CBMIl}vJ@kwE*FRs>q&4(aIm2RU$vASY zX>Dzma|jx2>^aa3wRHLkC;L>tSZvk9Usz49x9UU;0=`3B<9_Glw!g){}+Ng>I_`oG=i()^+@7Gne7VsKTKUyV4d5x zj@g)vZ8f%S+fHNKP8!>`8r!xS+qQjI_qhkp>v7G0&M`h__;>N$Eu!<>(wFQ6v4?CnTRn0;N)y+{h0sdmHE4vN+I=l*L)6VL0@I@#L$(z zc^moWzg|z;`Y_?e{4}Zjy2(Fz(P0i!@-M}_Xo}7j0x*mrx61^Z^d)p8D|V2 zJ(PzaHm~7Dl^vhKwc1?+JISImbc^!WXEJ!l39gWaa7dbY(Ps{W4ed=0+}&BCM>hK= zGoWl4p)S=rh*vfi(8%yVg575}lcu8lf_A_@d~%io7l8Dy;Yv`Heqcfqm-0rKnw1=x znt_2BvZg8lJHS;|EnPq`+JOx>U1B=CO|wp6zn;5z*pb;2^$eKJeb0osAGowo8m`ii z=_Dn6i%p5-fl(<}`O#QJMaJ%gC1p*l>TDwa2aU4d&+{n{^z8}m9_V^!C$H-hum51^ zis|_HRno?$(8g&nAJ7BzZafoWo(t`Eh zX~YQ=0=pytyY6I|*}A%UNgpb-7mXriO$qYi znWc$r$g+^?+YEVht|*_<%&S#OEa%$p=i%gZxZS@IOwVoZM*lgt=_E%|L?uzB!>67_A z`ggFUsPCgepWY&eKi2jaTwlUpFL&WXmBXrf8sj3v1^ZsvCV zRs{B6)Um-ZJW)!0X(RS$3eY2n0vr#E$rUT_(v_Nmf?{u_vKDk{kuu_H@H8V`(qvpo zR@IVkXFV!R%q;+JpuM|fddDfKKW`__AZNHrZT3OrYtm&O5}o23+(mz*s6XuUGB22} z$4L=}uA9KhJR6I0+TZu)UE1k?XQ5U9ERHOCoo^HuNt;%D&1 zIx@%)KsV4+r=E&CKwf*VNBVbP&Ame^#c)`_e~*ka7gKiha@{!z+nfGe1Za(?e&d!l z-6^!8c&JlxMuLAE@Y$YASBUdw*YSGV@rVc2Z-6jt8iP8Q0COTg%4A>tCe+Sh%RMQE z>B=%vtTXvn3)7P=(sTB3j(r>zB9wc=3f%{H>CY@EiD{{7Ejx~WK+iv@Y)!(v4=a^u z1Z~cV44uR2&W#R-ddtzj_ahUpn=f|yFx%&p1F`rqz*R*icJ?^XS|rU9bw+4KLa`Bo z@^%6#+-mI?jbb|MZ+X2Z@UeQuGyqCUk^tqBHD=78I7F0Z#hWwfqV49`JgifuJbplR ztnmCZaEGkKrUPYz_EQNRY3msw=RvS6cJd&uhi;op6a>kOuOHmY-Py#zo+E|cZyI76 z4o5#=#I{`4B{n)Fz^25~#m9yP?@IkiSbho0=JGCJe~6@v@OyZOw=Q2_Hu2G1(fHln zot+WJ-DEcS@;f%?vooaGlQLNaUu|893^ggc7l`}0drbCrAMg)|X>Twwfj=G`Ym@HP z(`(LeMwF=udPa55T&F}xO2A9V<+BD&L@1W=mT2ODB+M8%BOYNnnq7N$et)@NQ2^YS z3Q_d|HrBYE@-&nEG+}Qqb(*pFYAv`2qx)IJqQB#ADG4lqZ|gF)bFNslUpT`E z8#DVKD$oT3gHt>Cf=; z94EtJO-pmrsXfSjksrN%_IwX-ti)yQ;0396?WlQF`)a55Bkym!>VF;6nh1XS^|m_r zO7AOApVDL=QSlF1O@IUy+JEh-Y~HX1@LQ}GbIvLPV;>#+_;Vg@&AF_w6aUsi>|qn6 z!8$uRf!L#U%XPLf!LG+r8c->#U5(FmG3iRO@X?f@`eTx3WkTUGrdk^z%{oqpXnG3Y zyvD)H>anCF=CFdgiye6V=+PnD|8P5QrsumS({FNH72!ZEu$(9;B_%SL z;q?QZT90FYTD$lc?HIQ1CQ%c|vLzL*3d{?4M=vzvkYaDl)Z z@M)RPjosMlO<}(jNr7&J?A@gjv-lHc#0wJciLRE+DIf}4d~hZ)1h{^*=pc~ZSlIem zyW;qpiWGWK!XG~20d8zKy!b@<^AJaNkdPqOcsgYfdN}afG;W%z6zJEfG%5X9!Ry6~ z=<0j99I{*ZkIn+QVTu~YIrM2|7K&9vD65GiQc*B{nz-6Ln3e;v2w(v^wNS;h?ZpXj@_9NgM8SCBV-F80BxBaivAgLjlq~>D36Xj|ZT)r<^ z>q8iDzWuYbryv9MZtU23J6(lPHM4)a>v$K)W_^%#15du^g zc!Ue$qme_Q_WA`5a@zJ*h*~9=Y%;}S-3C?(j)C~_{?7&yCM_u#1y%n8aT<@UvV>kg z46Cw!XmVSO<>8f+mA@n*hwQqbRa3AX0QdQ`=V62 z)MV5q)5>|HT0t26)SX8#0hOTcde^F2Be+A{OP^XLdE%c zrWcUZJy~v$PrqT>uQ7e8D-Q-t_+U_|B0n=Z_L7tu-3W43`^Se^n4Z2f0eL5cTc+j5 zOuxD#MQn)h1?ZOBP9OS3`fcW39$ch{os_K!cP*xs?78C~I`j8GFH15n%f%}y&a^aL ztlce^E#fI^ehg0t2?y2A63TD()Yo8pI&cy1%*<>9`BV}rx0lZ;Z!n6op0OAidIjy4 z+|+tQd0klQ^@CGiw8Bka{ra4JTrri>63iW4XrJT*YWm|`{U6r`1IQVnAD4?a5;m86 z4dh((!AbQdAHeVh=$&_|q+Vwrw$p-A_Pv!cGDugw-%@>$QSIA| z&jK_RzxPGkOe9{kn|I2qGM$-Eq>mxNT+2PUX}^(^MdR`$PMho~S+->QbT=nb`(J14 zsrSVAmeYJv_8y)Xqf2k_BhqB7;NGjiVX9CF;1UVo6l3KXc8ec`(0kDbvUKsXBuyIg z;MsB~!Gn2)EoM)e%%A*fSRuUXncsWdhL++Dh09g>c8jdA25vVmaxP=jg%Pn`vQq_5 zwszvQC&I7s<)6HT;iqOp6c;v}5blJYK39RQ+T)uNMom71^P(Jdd>qZWn;<NxQ#~^+yVq}^LB75SJ{ld{pEycpj%h_3 z9NVJ#CbtMCDPrk@81hXLI+Km{PBhlB-uF}}W5U63%^MX(i!z=-wl4h|4kMtHEU75D z!RT;Vl&~s=oXH|M`p3)`Q;RKrGAe{nwGbIYHY=omv^n=`=Utxo1_X$ZfF+iR!q zW`{r1?DXu2jre@3)?HrN;e8FNVA~9^dh9_R0}|YDqm72!2XOzx0%7{EiSm1 zG|5!A=s>+6&WM3r#x{iH5PjX!f7R(EufP+}K!E*(viN+bA8*Zk71_ua^`EHnNEfuNp0`uhVl#lL@Kt0q`K zir*$@VAZPX9kUfCnD#OehwPeDm`UEJ+CiEv|RRW4&XKK z_>7lWM^$`4_Cvz9BAu^XR6ZPf`x*KJg#b&(hE0T!Tr-_@6CHYW9#|- zpZmT!hZ2K;yI(~>x?n5ht}a+PYiIBxAj>=0+Liqb48><^bQmy?k~GS|1lJ&t^WW6{ zWax4Vq8iqmbDhCT#M+-x!ov=e6c^4Ot7)qIpt@)2WOw&xUlKxD?krv{=~>ne%qI#< z^JAtP^30&sXDWt-no4eejfRI`UZ(!qI(~XFjQhQ|*Q=(%j3rV$qdI0jkW4tb&+lt% zYa7#$8=-S%e;D6X6{Ut&_Z0!#@j!TP& z?%Q@7c30idPP#8!_>XL?CBRxWHV%h|MdQQ?;+A{2SJSQpeLw$6x)C7zrZY8G`=*`q ztW{9b4Su+?UquY07r^(SSN_De{or=K71eBWSj@su^LxeMAykj$7A|JQMl%lWpXq!V z3Ye#Z!wn29aYNj3?QU(@ea}Ym$pDgc2yjb&IMwxXfdW6f6B95H`5UogF$o7+O8(qi zkh=HOkFR2+*4r;@Q@xyI>d}-SB^~+3CGoW7{QKA2lN=706Qb-UD(mXWeJhU?^^I9J z2V6R;z@&s;BNd8_#A!nj37Ar3Dq|XYz%iVHQy&gAdyus4Zm_XX*&l(;L--aay$&aE z|12pK#X{HXh+)?d zuyl-w?FEVyG_~6Lmf}6fkX}C5D+BJt<0k-do34(A z$TvYt-IDnXI1t%}Zs%mMxU`VX3&5!Hrrh%`L8X&tkK zWbX45B`@@J#O~0kMfrhqi5>j+cv5#B@ZTy^BtojFWy;hLF7XjUWu~FI_s-5vAhroQ zo-WP`!a!WY+{!I+Nk&P!s6<0U?89$5{lTYLy?hR+^%PVg0*r<|F4ZK^Il=yVhqs1a z4`vB@_HF)$V=_hTA*TPhYWXDhVOr2AfrH{^cnvL2IypJfd*8+Qix$s}LMiL|Ox+!h zqYac=n$Yve7I3ngdcFEGJ;L=%`}Cs3!rYB2G|X?mf~H#ni!&y zOiM{nWMrMwUN(t(Z0U z1f-Y-;5czZ`D^7rUR*6t3Li4sNO1=W3OyLCyiWNz$>F&&J2up%_`9qNM5lT8YQADT zxP-3<~R2z=Qp(3JSM%`vSyO-9>aQ`e~67DC|ZFnw`UXh^QV*L3eaGGnOq)|i6 zByv_rFboau&iojqxGQpy;nw@JQ58^l*}}^Lxn*{469u&*kOSx?FR9naC+9i@iou2n zetq>68xngH3+e17Ff>s68I8pqf+VfG4crZiSZc@DE;j`jeHH`wPHB3mZ9p zNO_ED+>_U~vHTjA-vS^ggaW0w*P|(w-8K};l1r*}0*^RfsSm-pyDFB&+anP7mTxn6 zb5f`pC8>Q?nF)eFmXQKC11CGiiwr5R9Nc%5a-{VKF$dMQCJKY28_cO9VFhG8D+a6- zbct>|^H2<%2)ciuP%=tTtbp%2`{W4_!-LGhr)TsjaFDwv7$8kJ zypI`IsyX2C0VFYEA~GP!16TLs< z=ck>GN<)nRc8#CFPksvq`Wgw~TO!q>Y6!m@+N`@~QzV}K?( z>+(MG#w`Hv%rgBCZPFjG)TBvD0p@Cpun5yK(gYTJL~8PH@)3yxgj(@fL^+JCH-ZOF zjNYH`TKZSx2gr{#kA%k^(+N`qr|xeqdGfeh;{1G|dE3V$6xt0bYI~!~ST`s`z&Qn?5q+M+^f}{(*C|q#1)$(1exH(yJ$vr?uTQ&}tQzqeutO)rX z!8vR}%ADRGr%4rRH7=+$m;~<5O7G+z96D2Wh)^PZJGo0&1sh#FUC*bIWC?vjRA9)V zj-ubQFN(O)+4NCd*(oukMkr1Ze$y~Cf1%8yqjIeVcrv?BV?_GYkY|nce8;tT)|(7A8$ z<5xDZmj*nLf{yQU4yN6oyFvK&gV5cwI4;Xx< z4a=izM-EsB@7a4g_^bhkHYV2C1Z)i&VArk(SyvU_*LzUL%bcs&F=itYhh|$<uBx;M!QzBxEKh4f?HXpOD?OaGbZ{ z{pFD*;`%bcm7`bzpv=9E6|witJBQtxEV*m}EOsq%#7k1-QI7lL#JYCAVpZU+D0Ob< z=s5O$v)xrlLNm8R+5~_Q)w1p6VB_1u3sL`ebZDE~A>b0JummKfR_SSM>||(Y=;r38 zZ>MkWMu7-#%BUW%;_8oqQNjE>%e}H`npYl9=dN>BtixYi~I5Go`cNvumjh<34DM_gR4D zR1D8uc=YcJ7{-4wk&t~N^&lDSBi?*?-IkdYPCUi;POVm1!b1Cd;XH_wHzi%MoHDt)+MPOthO(R9Vv-87*%qB!adQrKrW}S>=oV|9R2ewDFeq|86 z#ljAs=kzGbPHgut()oq9@dH^>rD>ioFZ5bBHz$Tsler{piSl^#x z2Q#(r@I8V{7s$QN#&%+MKJ+<;O|U4M|7f=Qc;?ugGfPuL6HMZl-+kD6R~x(I$@|Mu zPL9WeSBHFA%9u&yHhNB9zgFG$fbWq*xZC?G;C`ysmMvyHbI})L4DWH}5YQy%WM8Zx zO6Ay%=I=4xqO~)3EAHE{KyaLX_d>@3R9~-btbSu7|E*7c}1AF!M_9wmwQUD>3k}&iJ0!Zh@|aP32FLT$%1=`)B&1vm0VPXOcd(<3+t@XemX;zF2=>}?78BWC0g(q z{|;Vee~ogq)oJq*`8-!!AYE99MV+k9A$|=fsz+}m7rr56Dm$Zs7Qj50LS2;3kY_nfb2^N=JF*}@_khEu15kk%PKEVhM_B^J4c+xugNl?1Q+?1{V7)e} z%zyYSg%2f|+O4t#XCF2{eVW%2q=%5SS1nrZTHjCSyapF=d7rD%u0|B6zzNLBZFf%L z;Q**eUhFSsHsZ%$8kgiek7rCAOAgNc101ImE(cxjWoD3k=6^-QM z&%=qMZC9EkY1Ni17`hK{i;m4JoI*{1tDbMjLK{j{?y3365o{t=7)g%M8NmTYit5;4 zgmL7OZJUK=M*UWY?qWqgGeIS7$ zRjzSybS-cg9{~`!gbEdqGp8tt8X!TzVmg*+QvKq{qr()Fde8`Yuo#$kJ-X-ma4!l7l@xiN1whQY zZad$!7fVA*&D7LJv0?k_+!9!6tg-4DicyVGRFQLvBc2h?qbwJ4H|P$1>HuGpeGFX&tgyASVomE+l3*N3q8o1tv0ADz?bJxZ9ec2D7&u;E|BYHjs%8{6iAU2SkMD*+n!5ZLu5YCsXtZiTESg{3TX zrjz^^a;6|KcKVtRHdgW)rQwY*@EPTpN%MTx=wU=KNE0@F${4IvWD%8Y1&hd%&*{;f zD32lwn>=HvtdbtrzE>W%N0pLrn^-j7km;tMT!nc==Y|dt7jo3&rJ|~b&J(jN(oIn2iHe`5EC&inq=$F3bV~fi;QqL1A{KBsnSEZu=O(>HU0b*Nu z#kcXs)hcmGdpmH`-$y`$*?QZ2iXScfn+4zm1LDScy&Q9zmiP?45ie_ieRZm1>)82) zfGglxzmVK8Ali%s{BGlQ71;Q;Df0uXdA8Ctq8KNi+X@dfsbvLA_ z@DYAst=XZ$^7gVi$!uGXgSYv5QGnO;!Ak4E0!Te1@XPJl+cSc1rMycgWQ&)JXRk}d zx(s^&8&wry+LBCn7OB<&=i8<&7-*Gn*8yhJ5fTD@TKDYGq*NQY91ep5M8(<4%1!%e z6uJ!ZA?u61C%Bw@6%l}!)hiU6%vM$>ittj+N-_VW&gJdr+*8)OZ|3TjSK9*02vc z7kp$85Ys%I=Gw)8%_b(5xyCPeybEDhVqkice!nNqCc;qOW&3c9WX_&ptR8*3z3=D& zQBsywp2HHAfXux$y`7Xs!9ck^LKJmv2dX#u&l21ABq97Q=cj%sa@NKRWNY506y1ha;T zB=D6__tkT)k;mq1BsD;!{9PLFL1tM#OF3YS?Lu6pD&ROmM~C_cts>lt zka3uyk`{d5&yo=k@u*e25V;z4#4(Zj@Q*g zqD%72y`Y^zLJZtf6-knN^k~pgFLxpY#QOP477t6vlFJz#x(^;5m@H5RzJ7+DOXVi{ zy8Is=M1XF&Nn8+;6{l6xE~Wt=GyXZEDK6cW^YwEYRuL^tO{!!UOmxej`|WUa-I-@f zL^g#@n{y4>af$uoTAio&b?&BD^q5j<;SsJ(=2N2mmb5Y}n|AqX7oU2`#etG(2pvXJy+^TnkfI`B8u;V03tk6vMnouPa}DV3 zX~Ggi`_|o929y=({P>Z-c?pmj7PP%S)cETBGadT_xo~;hemNd! zVe(CfiV@+zqa67g!L!lxT!lIMNM+f<$zdUU1~;1^P2IE%MV0V&zuHDimT<4MlX|JA z{lyyLfH#n^j6pyan;JrCk2-cPN+5vxv>0Hh0{;T*%ZUE+6bzi4 zkCIW26ZBeXNJ##M6-h4ch>Q5cBsJPLKfAQ%dBrnqKdlYs8mf~Zl~iAom64+ti*SQh zRoo^R@Z2mLO@o-3ZoHLC@i1FhX}VZs$Z1@wL()Jg0cctn%MY{~!%)$63?nL|+!FZE zZF4fQ@fnrqt=m|(_&!@ARYat&%aB-FL*1-_?z0(2p;x(x7|1Xs>>L9-#FY?3)tvP9YEQT0&w@70dvQ^WsG6#>UzrOg!DwQ+Y~g+|A{jDo|9t)F4{Qa|z2h>HcuIJ?ITT+Rm&^P0{$M=ipG=uyq|!;9iX88*)am9@ za=a1+EUx319(+u~M`=r>AzIeRqxh?@kFlMEhQ)FgnWS=-VQl)vY90Q}yTyhcRRBhy zk3i_>HuS2bm&IrU4pVi|akne~u_)C1HvkLps}9)jqwA5GuFXw6o{m-#<5DcR#KbYu zp)tC=^WwrH3#xF%_JG)iLfTcAaQZ}#hqmcG9=GeBfdO$OZnL6qmXT7_H60F%KSf-6 z8uC3%7nfdt9*OUj!x@Md5zLIAGmqv28_o(>12Xv(1s)-SU!_c|->NI(JOP$#CfAd> zB8S@ZA=z@}0aCCcYk zb$>Z(IJEgb$aut+Y-D6H6_X*-+%{< zpr0upR%(gyKPkBnZ-;WrURAAaV{rxgedczYe1DyC3ez(AuhtBkD7QwT|CZ%LV-xPo zerJlyzf`1ZCoZZ)yPW4^Yh|Hb1gc)+uc^u}W8a(^pivKnP)l2*SVs70o-Ji8 zdcwmA#B0_$`Th5S0szuxTeIfIPR8npwh{ON)wGuH3BL_eYjymz04+6^jk+p;*eKiv(AgDJD;^l&v(2sYG#^uU_sje$aVkxO)S~ zOlQcFI<`7R1b8$v>?a9BR8eKCa|Uaet`4@1_N(QHPA{9RX=TX@m^M{@7r2|J08V`xQd_&OHdt|{;Cf#Fc zac*7B6JUwIA59={3w!J2o7uzRc!k;)OZe2Z5YQD}x_$niXq{+8kUAqrvW}RU;1z!= zmyA8#Y1fB{+a?8`1ma&kc?9y)MV9zqVn0%>m9A{st3FrNs+KOd)sI=7dkqmFfY*w! z8<)B-`VI z5Yvx(Z44k|^+3aijjMBgV@G=2sLXk@!f{oWrItqf{O$@_y!TL)k}?a@H+jQJUOeGY zgAe=`NcYmHlJrHNs#g)*o#BIwyc`ej2bh^U01p{I!?%K+gW%xC1s28!-j2PBo023N zkR2sm{4xj-C-NpWF@=34O$3l4$)bIyWzf9XwTmIVNQXvM8kJpxCCilQ^^Q%hWxZd+ zrpN#V8fg~oVn7^xzG-k7o0q$OBWbUS7uJ&dka0y_1h&0BH>E zcBGlsPa1YZWRugXbVxMlyZQK9Kxcl(NhQxF#iapZZ3m<{;UDm$!ukRrkQ?kHX}Tre zw;n|v>8)hQNXn-nz}! zdOwRNiIBg9WisO7PO>%$lz6JDAIlEKC5V5P{=z26nfCp7O_FB^(_176>~-b!xpi_! zBCA);%UG4xgEtQg6C{Szq~O2|S;fRBQu>%#V7v{!O)Mna#UDfyh$v2E1xcciq>Rhz zEa0I7V;>=x%ciBT+3_;;r9g!WSyWY1RZHGkCnnHlPZ^4NUFI%Y_j5|Iq z_uGeD)2U*G(;(d5vBIq$h!O9Z>|QYJr|BtIZdA4JX>6U`yl({I{(UzT>*u#1dI!ln zH4F1H_QzsNodDlv$KJeU`f3=j*@_jk4YznUAwh{D7czp&t8wmkYgyc)5!__DBX$Y1 zWRxEfkmtqep!pv=86#A-q5S>Lb)+aUgG(8+3O2u=7sulF4-e&zHMN8#E&!oyjPD(r zZvk8D*4@XUdv%Kaekl<_M%YdaXcH5zii`&RzhR*524Vs}n4My&Pb9vJ8JvV0gy0&d zHwY(_l|Ndc0mPxF08IEk@Pygqyym#OXFh^NJWz1v(Z$M z+8t#w_li^nijC2lviLvA&}=ap4$bq&Y8Ldma6BL1!6&XdboIDrp^=zSPyjB!>uWgj zWko(njKSGIcri-{b^>W|iEL#C$2IUl3^NS%J;ZGrrh}W{IEPV5SYx3tUE^pnPFdf1 z`ItRU8rRsmA12?rpQ_kwwz&1EG0e$u5Y!W@eN2U2g_kb0p^ET!V}!bg258|P zR^113x`e_-&k)B!C4-K3wxTn1<@MIrni~%jFKFH#L4a+#A7u>=itxPoTs=Loi$%kN zJQM%QwWOvm{?`Zm?`&crF@A0`%r)PYk++$ekxkTCIgr=2?vFLavIaJe^#~*eSpV1E zUk@jNie=`>{2K6HD@lQ~uWVmEhg+YNx;7&>#F0Sg>Xo)11{|9*XZ6-I$d{9})A);~ zy1m-PaJw2LfH6Lk4yhnPRQlsF%*7!fA;I%8sqw7bDf`Ul3rgq99tHrHHzSEQ;eKF;Vq zkGiEGjHvf#eRWk8pU1tiy~Tn}^B^*mj+B%X)4Wo}XrmKvjb%G=9+^rXtqlbx3>Zj; z8x!M9A^Z>IBE26Z!o3jfneaJVkl9*E@}Y9J<@*jTpafL?v(ZzRQfk$JG#{;gGnBH2 zB&VjtW4!a@(|$0!ZA7bd@$?o=TC7O;m`vEvX11>)UU-5YXO7PWTC^FlBu+XU-FpVV zA3y1}HE^V(Qyk{lCb4ch_)$tHi<6V6wwpo>uSHG3uXJfJjN(Ra$4>j+1;Gz*gJOyg zRO4jE_KPRw&rE*$`@l6uNP^RfsA+^N@os{MDXmPw zpXWgF9A5RxW*onI!o`5v@B4PPuMyo~2Nj&=Wopt<&vrx=P;&mbmC*2|Ryylyw1_x~1}z!{rBtMbl$ZQd zSRqa_7$#9JxG)!4Es~X_EE-)r8C{qOaGI0}wT1=UcXQCo8_O9Ud;sCk_J|_3UmEY7 zJ`d+7`_Et$^K%C5@4ehNo*OrAe=hvXnpv$*5*YLN91<08szJ@0SJ!o8mvnJVX#M`2 zK{qhCA@O5`_Qm;4>x|K2)Kwgmv#h!oKb^OVcg$Zr#2NiG$S`+pg$NN137u};ppyvh z|AicjbborgSy_g9CA*tLZQDiJe)`l}7jHK7pUvwntTNFez%gH@ z0B;X{UtT}Mut4pW*_Wy0;Jw`n*yqzmvm37CK$<~btD z1#=4Yjx>doXIfg!AGBgu!xTT!WmO34FP%6;LLjDdu&LC>TZz2rlk_@qau*1yX4883iUZ5N^F1-eNC9I3J;cnT9^m~ zxsV0lK7HosxxK7iJ0<3?@-1ESv`XO3)4S^qgHE)+_k6WuSQRjtbn!QwO^APOQ@rQC zfg;&5EUs`Z^DzK2mDO~v1Mjhf}&8!=ff}ESDZ;;wip?L z0)dN94s)p1rpIj@$&bu>EGSY1&eUyRBjC73bsDaCO&$4rIxj_H)ZD%Vpmm+XfiFOB zahg$E8zYJG+_2=*2cjmXi-stQ6=Fx8qQ6`8`J~7*=>OSdM2`yDktINn>MigCD`r83 z&%(wdn&3D`@b`Tm_MJFd7({Ac@Tqxge@hsyLVyGI5=fWsM36!I=a2k@Oc;~{Dt}6rFJrc1sVhdK7AZ>p z>`2ipByAkZaJoQvwbgCMf`4@g23a0>c)0JU$4`+mS)kBqP=vN1l(;tYz<91V9SFu# zu7;0?X;dUtDnzZ;G=?(xY2B+oPay302lWR)JuVEru%I_I;(|D@MTrzyq*}$}`*J(G zSAxmL?eObYG#O`mHn-RP@lOAPaXAS`>jQG@*`6p-DU0S`tF4j$4j$@Ytg>XVQZD&aTY zQoV074cgtU#Ux{;)f3r{#DSn6c2<|OFikJtUO$#UAYz{UbM-iWWMQe(3VoPywsE@U z*t!BB^oYLyc@fy<2c{`pU*o=vMv*548IYH4?<;k<3H@ z0S&c&^4ip2%$e0^c)0bkv6V)UC<3U^5zKwOZk{qkm$5(_`r~KaXi~G~@x`V3CEHw; zvC0Q)$poTWv3IsbA8c6OEvV$#Z{@W6-aqZ5RHG`5Hqi$-q}$9yeuD-$)8#SRteJ~U zPxuzFN3?f$&l*W9Zy%Nu$e8|0!G3EOyz^@tvuGs>70sPoZEx1vL>R`ufwhhDM%3JB z3J^}gz8bq4%dA%ga<3_m3CSsg&rs+)uK~wGD91_-blM@x5*iCeCpl zxrR`10cIQeB*~oj%RRLkT@!>oWn0eI&VquPcCPKfRu|ZabxYQRv&#o#gmz!dg>b-48>vN@z%;D}h)ERO#0my`mb@#8Qo_)B^OvRnE^GHLF>V*}_MWM@CZP)B!eX4eKwS z^)~k=GrCbGZ4)6@MRg;JROUrQq+QNLrj1=LAE)rR8Pr7E%iPE?;Qc%1>{hNIx-iR< zb~kgSTW2b#*KgTKsTmobSDjDyhv&=Mp}VP~>B&cZH+L~1n?C0SO@{kUME6R#*EAMrR0+l4Z(NG z-oXCXHkz$WQqIZ!P?->5*AL+$1^t1bV@3^vs3)N0o3ccgs95UsDsGZIE9F&+%i8&@ z78A*DAil@;?ew}h7Z)c~$x^{yKN2Q+eeMf^Y$ph={)7yL4mHN>3zUD)hsz32EAR@= zQwkxy{j=zxJsXS3UKXw^7l!x|D-J^<;~AH^(M19s!Q8Q@duI+DqBu;I(mAFnJjS1;V{;pH)qYkWo$%r(s_!( z5w96;hipJ&uv59LRVN5C`fXx@i92<8beo@U=E>QyeU3g(gqAU9gTi``xBQ28MydwH zlg31q$_e=A>S*G`p`s`I4f=7TbQ?rS@CMzlv&CsbcBopG=_#n(a6dD$hUzvdKlse)}XYm~Q<4yYZ?K8&sS%(`vS(~Zez=5OpQ9U?L?vB6wz^ZA~0uXR6xnLplp?bqJdz92#02~gB5if~A}J$Sa1 zFoToso{z=TfECiicPq^p1_9o)A-C0RP$b})+ps8KVqz8gAQ&-_x7q``E82m3D1wh0 zL)|h*&f&(X*oZI;pcI0G-Ox!*j9*p8R54`vDbWSOvbpf1Oj13Y(D73i_ntNaHTYsKW{_&uq?}v24IDH)Gm+DzkK1|@+j`sK=AYP)Be?5SO`g}j13>^Zae=Y zWyPpNWOCvpx6%F+wCHlAIAV9dRM_J1>>(ub)TDVmKx8K9^W?=MC|n*0&8>M+n93Be zW#plw(eIzA+zNlVvFE;h79u2g$K=zr(8kN_pxf4zD%r$hyAzj1fp^ILhW~2%B{^K8*ncg zD!}Q=_(HEqq!fFC^|{aTNA5_(^mL(?3Oui?Sx1|=U{C(S@3iOk*&L1Ed}$Mt>~h+2 ze7m(PX*h@se^LH2Rlp$A_xN z;fY#%fA^>vNzlKTHtvm1KJFo$zl zBs4`iXr^tzmY7nb0odjzOkw2+_$5jgpZwH^FQ=N3wTniX>C7mSF3Qx8O2#Uo8c?fO za4nlJ@l}eBN^V*GR#s(pYG>u^jWm-v`-A3^G|z)O0WqRcdyukN;OV?~)f?Tu4i+Z7 z>tUkV@h8yXeNS+Ezf+T@5VCcl_qWk6zn%3~pJsi00UwU-`-I}Ys%H2|MG+;0E62Nw zJMYu{VQb9{+_u zxB|?qI~cKJUQjQDu%ifzRJuXkn_W7Ars6L1RJv6H!+WdCjSMRqPm4D?6oSiflThY2 zpFRqA;4kekm}j5oHZyw%iytlOkPxh_thJIe4VUf#lJPG4kEB8Y{wF>KFkW7I|LX_; zr#$3>g4&;$cH$)y85 zVm^#JXbExsuU!v5?Am55f`(WrME>8&ASbXV(ElC{{*Vx7O7;8VQO0IO2R#MAn%THA zJ=_Lox0W}sNo*$*gJsSKHM~W}Esy_!K*Ht2pbx1a!h>^Gjw>Y9IzL@7EVe27wXU8k zw}Hb#GDUQ)*X~S>_37)}+4Wv$N89uH2}1r42B~@MBHXNOTD(Hp+iI223Vq~VM7?$)S*dp(aBxZpZTeTza`8jS8%A?oF9v(5)bW+z4eALO2WW`wDe6w z7i})U%klYnNurLAnQ)@s$#h<)xeZUA-N+?uy1?%=uTgWh>kzGIKc2-x++yy3NS}~J`^QJhNGIF zFm?cMcCJpPvHrz_A$P*G-Z2bWe)SBfG0RQ)=$Lfg5#*Jx>dv!a`rV)=XqNQo)YZ~+ zAq=vs>S1Bw9(1%Nut+~Pfa>!j0^e#u$`?;vl&Uz@_UXiZU|a8S$Mtdg^&{KAuaqAH z{&zv0P)~Eqx1^if0~z6N1-x^4aVLIU@D=odGdSJIZiY1H*GJMoGgm(~LNwoyxGPOf zmwy}6wka{#5iQ)arsq{L@_8kO znd4{=b7~ZmFzw1Ur~9S_w_#dV^Vo<3+n~U=(Fz{LmCY@&L(2q2K6(kYdR96ZJliOld$J_Je_1|Ot1vucufv_iPhlr^#X@Eu4))XfZ{pg;>K<7{MQB-^lHCyCJ?XWrNpg zd9riVwY1RL8cAj7<~|cM&nM2trq1)Ku}#a62*(zNqDr!ds&+);n5ig=(TF?8k!x3! zV^sL5jAeIQW35w1J&Qzuw0Z3BJfPUhw}&JJbMvE$1#KoAuQQ#k-t^V@FaFE|97=Sl z-$q2?1!{o1$H$<#S&xqs9saq39f$sC^tWLMMD=VS9TpB(`+Aq|LR**qNM+jW*@1E! z`b1iAYw*?qo&d=8bUH0U+}9pug8zO+20sx;XTo^MYdgr0m;l)%>GOKni?6_|{SH4~ zELYZpDN8H^$|uNEEWz9qW@OX+r%Ect=pC|qM8z=7C zHf~H?hAt*`KiAF%RAIj&DIERMG28+V#EdedOI+Ay>(uwEU-p-+ zgNv9TDB-~Uc<~0mXX-TF2{12Vtx42*sS-_YeY|a*IsKib0)_l;LGzxp&)&r4c;v)= z^QBIo(;@Xl*u%HcJ7_wOu2c74Msj)fbw?_xbtS3V_ut~OQb0kupX_E zx}PciF7>{DLy(t)^MJGtRRZjY%>ajx*-`N-I5u;q_+=MKs*vK7m8?=&qRDSD4{PNL zA6X-y^$4@HWP~%?)^8 zIeqqSRTg%TND7JV-R4D$-tfCP#P_gAxd-~JPde8nOcc4Susu);(`QlIxpAvN%dqId zaAr%V=!TY~z-sH1JJut?LK08<@br4aj&z~EgD0PfU5(})_natyim8H@*mazU^+;g* z`DxpHx_t`4Xy71aLA0n-m?jNmL^Rv3>K<6qxYqk@a;Qn)WZW9l&vj^VSVB<@vOPE| zJ~BVVb`;>BymN2eC{?Leb<#{6yI>iZ#NX#Ay_CjvfZmP|JOQscYs}!XCHUph36bfQ zHiyK5BgR#`u_KeAJ_<^;&)D`P%D2dSi;mUUC@W;o;`xUd{7v?Cr zcWb$yb8%WD=E~O^h-@3}FQ|wQ+KS3I^patT(qq)x-A2 zVgNU&Uy^tm7#kPY!q1Qof60b%n<(IR&?C!E5ldQ57S%W^$5% zA=XC2&));9tHNdAsr4yxgqlF1l3kcSrTX(i>>-kr8d+nq_t!85Y2~P3%TVJ)ESgeP zV)i@{fLK-Kk>!LG1WQU9jZFL0`8~bojVBxWr^GQdM0GIPVCeJxMU*T%nruAzaN57O6ZG`Wzwh-9y5=X@`fwFc`FL121lZxN+dU`7bs3!c1nvVV`|o zylWLi&Qb+|!GX3RyDm_S4JLP;d7iFo!_gO13h}RL{Qrat=(6$1`aishIq5?j-0lt%*N$k#H^(9N%Dv7D~V70Qer1om*)Hq zMxpsGKz`@80>JZ=F z)pvAs_zER2Db>1S4yFn~Q?RNF5DSju_$5SHl=n(29V-KquBU*(k;2b22PgY~2zIvRUZOE(`~5Sk)t4>k=}bQTfr>@ZXB zx3XW!z4D(5tfPyRiX!Y}KNHeHOIvbB(2le%?R9!O{VHikfa%1Y&Kk2($nBh8Rcb_% z`%^7OA0nrMZ)G=Mq^*;G%4R19Pk+x=CYm0lUQ`^BM5k1=Pc@OO?X3eSTNJY@Rht*c zl#Y#S^lyxE<2lLv6})v03(CYAvB)*S7HU+#f8xVt)Vn-AA2BtWK|oo=l)LYL{Y`fo zF;rvF>fBU=vi}u1F)ZLjWT7d8p=5E4>7Lk5gm0soD?U)njKRam=a`3)3g%F2txs&Dt z2*G^jFzGnESU^6{xQbh(7*StcLyxq_AB$)n!vmS6{@;qzApZV4zo|0{5gf8-p4{yNWhYn|r5q96?s#Db>oUEK&FN`>2 z`%v738=br~lmYH@MFq51+5c}nBL>~Yj9(>)6l>Negh>J?3YSI7frFP5Zd6>e_E6SI zH3Uy=@5R4-@wQy9Jfo<3?RQS?Wbpa)uC!?FJ;C6X?K|{cf0@+{=#T198r&pq!aAb0 zB7hL;zq~FcK-flxRw2h7ho1S~N?og#M#KRV1Uy7<;Ky$09aB#V_{<~q-k|0_+t*mE zZR=Pl`;x?DR;ZLk#e8O1TU{#jHm5fl`LIc|hE@@*hl%KD8F!ly%*y#sQV!BI+yy!v zWg9AlWjO_+g-s$G#XM{frZdsMqu>TGdso}F!v(0=QfT}dJ(n^NTBYZZCd664K~cgx z0}D|E{Gb0odsV<(TmZlFw1Yfd@^$GkM(3|);BGWs9YGT=yf9&@Ub*IC62P@MOFqSA z1s-mh=jRsEDt!4Y5xi$)z|5C{WRe9sx0Z7W(MPaSt)BH=ob%^rZ)B3ptI^N^E~)yut6%gcy8mZyQ%6WpJJ=h_LYW5A4lLPHi8q#?ba-3iaA z$nI%ZqtU~`9eQ==r_YbNeu9zS9db8V!zJ5kMfQC`ouR*z`y#5R2(5Ut1xzuJA@EOu z*4m@8j7LQZc@jCEGAAZEO=OqRd%(qN%1&=XpwrwbFI9x$ZK%ji-0^`-As4GZEPcyp zG2HMXrN70o^7&=4TI=>QDKTT&n9RkHyHF+9e5DOU>YfomhlJRH zA=!b~Y_;m0fPuaj{ZMrVn0{Vc&0-^`>dP1v$Cf6#Z<{c}=UNLm>GP^}rOtxOp5*s> zCitEWO;MNe1zv6GC&syUk}*wmu`7)?2?Vk-qOdAOa8}uVL`J!oweYMM>ID9ZFo`1C zx~581ant&#=!wX%x@u^_1mkomqkin$^Bc9=pdWauD@WfQsKbnh8d#YsXg>+XeyL&c}zU8*!2 zm(`}~%9JP*cR0<0T5x-RXejH?fIY)2cy6U|mpgdh0a5;ua+ll80C z51wf;jo^N(?tm+INz$(T+e;RRWt3gu?$kE}1(X`hOXPN>Mzgadoot7dmAWUG2zjBf zS9U9HJ3;WmJ(B-?T!x^*y^e6dlAlgYM-1lnDi6Aj&?WqRh)5t>3RC4e z%_w(Y#7w%+9=(C}@+~jG8CX^Xox>$FsZpDmbsQT z7xC0}lX&+R84VS)&L(y=@=HN(7F|)RXJuyf-9X z;2o3$AHwFwLm(4<2fA1Ux3W$OFowWxme$UX1&Kojfn~|~bl68DQLF-t1t874e!yZP z4DEllY)vO@TH1pL5v$YYta}~8uN|wYk#cYlnU(B`XD{+z^eSx5OiXG9hXyGIhbRXJ ziz!O31>SE5_UBDmvUzZ*yxV!Q?Xfk@OD3dBernJ<3dGN}t|K=~E_>NLpXIV4@)Qz= z`}CW3hJ{1b42769-NXCD%+rSw2qRA76MFigmGq}D9_+Yw>IO-;R&z4ZCBuV6@)qwo zBGD(6{`kMYZ|GBeLd|cbxfFqU0dZNK*l`fq(k@sooZ2CRwzJooYvV1_Hf^kX8~h@LM-d9ri>NvKe(;g)%Rznl$|}m8M=ffHKW!I=8wfxIoZPf@>MQUh;Su>Dt5~4!I2zK|q*z`cKYtzq#Z2uO62tYMlX8Kg z2tr+vD4j}JrIvlMds~|}8zRAj?~q~NmRZY{n1qC(e~IX~+A+ZD8nnOlCiI^$92)KD z4=61HoN=?=UEShias+)25jhlwG2~wcb4l=sRM=61x2}N2bLqN?Tn;EW4kf2*I^8kG zr{v2koSyJ}j{H5kU`>%kgK0#p@SStK z9qpDo>m!a*Wma6>R??~bmr?m8hVH?c2!u8?&+gkq&HCBJ<@yH%QH=WMnd{IyvPlkG z9(%xRbCQIq*877JGdA*9*Wf zoq~+Xu^KC?KgXmyS}WFiW>m?#v5TvHrQXQIO`iFma4RGTCXnL1!!*h(GgSwRw~21U ziiEFzH%7UWBL)t{Ndz6#dg!1az&}D~?%XRd-3!Db%H9D3k{hJE6%h+?US7NWT=tU03NO(JKkg|&f0Y?Xr#;eG^lhCC9FwSS+IjXd0U8GO3lpt_79s8f?df)=CkZHxaeI%oi#SVi zP;huvP(De`8q#EI!qm%akSA%7-RBv&*TNSLX?sa|nj|>@E69T<;TQ_DyRA!|2Fod> zL%(}sXW7#(F$9}Iwo08IEBe~`^3Jno@ydV`Y;(hh0`Drg#w~s*S|9$&wobKjd-$4W zyKp2>mf$3|x{TK@=c@Zmj(pl}jRA)pBs1ycZ6=)=c9(NkjjNH!SG0c2xhy5ruoe~L`PO(D$W%yX$nf9#zG%8-ZzSPv*{kKlcc5BsmZw80$<{#Hcm?t8QnXltuCe-Yg_ zK93u^q*Zl64auwycuEU+x)c1kdyCv(jOkH_n?IyjUtn3Jjv2bDD!=+QZq|_e5?+;$ zlbY+k8g`aV3}qWsYiBv%#bZ&806wnFxlTG6rzKgFOZ>}|>MxlGL=5Y~Q+1|EQDy@> z+L)QC3$Po1I+$As7E#0)ioY^o1@U>9Amrd4{kmL^U_KKv@5^}fTdR)dyH~+gh0)+s z)fC5sjV8b*f%IYwgXqK+wdu zqdwSZsEHN+RB)t8QyF}6Hh0lIF5nrmzSk?%}!4nxlSFap0mD5T8wefAR2xc2np z@AT8tsI6sUVAw}kfbh+wJSGE98HJ%(sMk;dm98 z>b-tz;Tlo3_VPj-iVqL=&#LWeY73hiHA>yN>(y(`{=>nL&8C})`Ec@N{Hb^;?`Wq? zk7mszd3@q7bfK})HVFAzqQ?W4XZmTUN852@ncuu&jh_L#PK)hG4u#E--j-fBR3d!~ zEBaz`;*6{xlFP{G%$%2QfG$st-41sTS&i#q!Ex(;)931>zh&hKiGMONDO_l-?|J9l zH;d2HOYEQ38Ps@snm{j6mt6PQTGIji5CVAkgctn{rk;gYW?9b2KktV1TvDp^ifa;F zrQC`ngO;rKcTT4cy3;_^p0?R1TH}SuedJzpHHtx5psZniDqS3?2;)#7>Yv!g%MaQw z`BC}^CUpeH@xOBlLY_Z)JBmseB0z1Mw6-_6xO!?f{^0n=jHZ&L%plGwr>w<#G@o4T z{1pMX73m4Oj*rP_(#stQ9O-x9^fQkx@sqmZK$$CixAK4pbLLcPx!Lrfe>de9WJ!^rkQ=Co zSZJBC3fhW_F`2Qvm5^RXo=ka=@OsBJr1icfQXT8VQh$Vz>!w-LC=gE&a5LUIV?wwUhLB^OEn5w8VRv`cN{ioJhNl!GMy@m$`CMS{Nru! z38RXajxHgl)BEQRrc|J3Fn9nHYENY4^%K%A{^gFF7A#ip`zIXSJ%STwY7P2gqf;c_ zD{tz~mio4qjIc=7$?Z*T+}x!Dr&Y&VpDsmIWC1t|=oei9*oMQ5#yEYUyBEGLOR8x! zr0`&Y^rjWqG+`;Eo%hUds1}>?tkVXLkNhL#=)}9He!{yKO8}KFgvjeoO<+!9Uw@i z5AJ825EV{~uhab1J=}=#h>jj`QQ(&Xz$SF)M>=brVzv70DH}!R2+PkL?Vi;iCU=%l zO=Ib{_TJ|9{{Cq07IL!@Zb^f(9hq6`no4A_%+i+9%JYh9%w1{#+$U+-Z|au(Kc+Fh zAyKnM*p;`P6)CEt%R}0#f?MxAL4?h3dpHrZ#aV=5+wl$?qz#Ev3^FkF=5>V#I8^D6 znX=YWN;K-x)_21w;wlI`7RTOoR16Tba$?uWI@_7MTbZ##FZ$S22`veF-R$Om98h*Y zFVr}-@Hz&1vAr8~fxUXj}&=Q64R9Nd2*HZGx9v!{-t4n#V&fo(f|eg;{b<~`?q z1t>9fQ?bY-NH0bji;IqILKI2GBgQV9M0s-WH3N-NJ>QT zrz^^?*4tR%Cwyv@zkxFUFtfOYmwFsH&&zx?-jFLqh|Zx++q$p@LeY9mX|FRyB4w~rjCju z720%G&BHe~!YGQ7QHU3-78Oy8R*=i2>{@eE7r=ntrbJbPXc|8&yZvHqq&<}?+GLWW zWsZ_Od83Z#671>C-JcH0+L)UVE1I<6NQlwA1&*osG;>qI5kTH3!^0w12#x0RvcB`6EZbur~~o z$G%=SeT|vibC)FRt&aOfiucfhGGB_V7jRTnW6TCvUgEcO4fy*-*1YaVN?n<=%YHIOKmq z@eH&c$dK2D_Nj~7iCJzxRkW6cCpo>wfVZW9l%v3$DKrVg54iayb=%gM1>2*5Yi`Rk zLeszaywH#i1cy~NuG8gIR3S7(t>=i@DeV{*&Nrujs<8(V%9PBS39DY=rZaNuDvI?B znCYa>qJsmx6YXCT9|U-%H{~vKf)^7c=7Nw4S|k9P-Q1KaC1ZBJh}wn>vUpL5f1L#B zPcAnnpJuh%kFxpG)79vs8Zlrws;V7Eglfp^p>sKdhOk*V+$8%Sf?4WKNDOaDu;M;1^uQH9Mv`3g*hmH<$!|Sho>wWMo%eD+l z%8{-VZ|w>KA2(}PbmJ3#Z}+?b&s*26tBNDqs~4aR+eR&kPrdW5w%$naa+ zqpo(;HT3BK>8~2YRbQ8Qd3SddE$!{WOZQaoJxO7bY;^IQCaxuPR8z2v1GBSYd9Ue1 z-u&t`1Kql&F2b7c-b%T6ySMKH-%lIDo~A8*EA2|!pFJ~)Sj zp@1Pv%X&3vFRreNr~ znQJ?mA|xSR%RmgT5nGQWWZ#n>A^?A)4GCQ${D|Z_>^HyvR}2*-Djw(#FVlQ*J9U$P zI*{Fr4eq6Ka(a6Da@D=H`L6kFC7##Sv|pN(2t+1&_lQesM9FG)Il6B>j1Lr^ z6r_QLd5i{M++G_xgGE)Tw*5oaiES+Ql$H0(#0!v}^tg1jO-98Vy!*=-s6;IdDNa_t z{5azZ$BUczeDjSV7qnTb%r)Fa?=S2AO4!OcNP4j?%vyxU04`~NaW2)ZFfE$l_)TZMQziU-B zl3v1{xuuOE!xO-U%;c{)+UnC_(Wq&vX;?2 zyRB|Nj9MEQ(8kJ*BLWBd@*T+uoH^Pqd)Ogyk&!>}Yqs!lzkqCM25=7^NkB1~BZu%! z-WJnW?yH3Yxs>~Nym~Khkt?ha(PLvSF416}v@_7-LxV$DSlE7DLK+?(bXWr#BuOJ} zy7IRqVK&BSYvpHdn#OB{?z+j1jqIM5uy*ldGfdGQWvC3aO_8pyuG>ORIKJ&Wmm7zg z+B!ivIE8`%@AWm!`0q*`_6h*?{w6rvh@L55s{Ns|-4+hs^VqJkwQxBasTE~a%%z2e zn?rnH;PS(+hZbbdtN|3Vj|ga`27$Rb#C)l-*FdT6gTW6XHiXm=S{awqAD2!8VfTOIfeS;yEDuET^Nyh=+q=61 z1fMT}Kn3%S9XDJf!Bt0{zYPfsJa@{+-V|rCqQM0LiF2?eK9Nf=mV?7tJT4J~kevb( zUb-+(DQH=!f*mhXzuWuMx&==f?P2tZYq4_m4?yK;VIip-oi^w7@o)h$dC+ey6?8Z6Y}q1sUbk@D)nsTF3&R;@wmT6PT;C{l(hyoFHAhi+UrZ=A+tq1#@u;LR~h!4={1V6!LK%!LCz)BQZtH# zI77FyW-B)QY+B4>&kXT=F7PvUHovtkC~0R!|I|<2yv`dovo;r-mK9m0+3c{9%uu20 zIqhVKtZSsl&(BI2`<>_W4Pe2{c8+Qvp|)jepJfO2ycBXrlRWVftPbh2Tf5ga1YC0B zz}Y0H|J>i-2u*!y=Nlrvzylw{`1gYpwf4DBggq8V2wq(3Q_*9{D5ujTPy0`EB~u_~ z0uRrye6uorFN(nYb<$TJc>;$E9e;~JJePWLzbeHS+wuYnovW=*em=f!>nVX4e#o_= zODh@w=aUi;^YgjX!QEdJ#QQWQ3#>s5e$)d5flk)-jGXa*w_woJvmHS^{o9KOtx7W% zQfRwzvgRy{vnlKSz~KD=+;vnhiw9~k&1o{dwQz7&W#gpD)ivFI+on2)?g9+8*4<5K4VvujcVcJGc9j&o4y*RH#=`SrU-FK}F z{}qzQ2)&>N>S;(yzV3!9rGORZL=?_?(eRhg3`#@}udtQDF-J+&Lx-aR@9*OfQF=+S zN~pz565BazJlqBrQMtp7aY1{eSu3R;LOq42Zs0H%k6QlWgC{m_Nizz&D zSf4J-lhms;Cv$f}RjjnH*x`;#BSdQ{oMB zE$#4SXXfOMrj6UNtr$Y9^XzFcRDF9rczo%8*c6=e~ zNZVt&1%w_fm}P0@!1iCwqz-S@ghzW@(u3ogW??>eRMss2#In*7ph52$2=csR!Dtt!!sm<<62?tfrCs@>aIC=QD+pCDxC8%OS#fO-)hkV0;&uIEKzf zpT5)Omty9;a%F)I((jJ+I8D9SfHE$_l-joX^<(e3d1Or-(DI%o0JU!KDar1;H5#_) z17>32zIiHXQ^qfAk;`@J9yCSA^d z9=dR2IZ{#l@paKB3`&(;j?Ilq^83Viml74*5-t3#PQ#x?L4dJZ9!(R;Le_F6CUY=S zJ~Pti&91JT%W8(@^FB59K@s@_W(qe`uKo77hAw&zAAtG9QS=I3#1-Q4wIexlh{>{V zKXR*Z*UBeNPs+Iy-%l3$O9Tv(jEeY*srmB#E$7kt5vgOHWdl@f4s&3x3{Nw46S2E6>2uy^EW8= zO55N3?EL&}ed|j~@L~PuZch6)*TcIu_VII@CZaxd`7OmJq26axS%6r3 z8%vWoxKq`R+8&3L*uH4qTJ%ZQ*!?3Lmt_dG4{)#SBOB(X^xWoS`;P>yh??N>bH^zz zz#Zj)hCsc1mc3iZk5G`dHH|>qxzZh*ypcPzCp0}Hu8XD|mdr67K zQ~}WJC|ervCr%jgdbA}DMiM8ei4>&fWi;R;iVVZ|L32&%H7a9XkBTtFI41@rMD9I6 z2iRBZx9+>IxPZQ%P!kUz zY`huUh;Fo}M;7f+{}dJ-r#u0Vz1VBWwTtjQcxQQ~_fC}T2#wX}15lI|A#&4rzdt+5 zlT#TeaQ@i7?ahmaCf`_b4+_X&P#!17N8 zoCtY)bM4sihX+lH6R%L++K&@ip3HtJaQBk_%O34?kflw3FhP{Dh-}JYfeY2L0)84;hxZx38&y|yb!_{%C5uM*> zP8%rcZ`{`DsdGGKY%4uB=y%buFPAyhcSm8wZuIHJq7iTUicui3-N#$N6QkaSUV(*Z zC29dhsHQ27RJkl}EcfrWNIo)rX7BuhTl7vvlMBG1gR(UoI=^-7pGD>GO_+^V zaAAl9g9MRcJiAT>?BZZ++W8;sT%6br5h_@gS8Y{au8un#Z&q!Z^}Ah9tcg)?y?cH( zFO}l?)qG9jN`)|=z=7(p9N;bJ5AkcM{|5iVeXA98p6!zgVbHXqxY%O&Z#J z;Ns`n$LIb0Dxm3ib>o4gP-SyQy?s`zgAm$h&GJdw&)!=gjhc%fuQ$7|xi!h3tt#~( zC8f0$`tjG0KO9bcAY6E&2NRAE;lY}*Yz>l&8ujXau)Ue-<}jA3D&%Ot5Eg&+4p+X z5p<~NY5cA6$A2r}!> zqD!+xN`(9eHKrg5ganD>>?)70w5~TlPL1RYx^|Mh9{Fwhk^a_1IGh;iPUccgR4hd> z6Gz4j($HW#@&$+3+dPfsiuGL>`F^mjASc)S+=d=aFLKlQO`Fps)9JJCrjLii+mYa7 zkb8l!sHkwJ6uedTi57fP38gqxikN!{IXM;m=>Dm6m$n+U-MLszp4fg9{;r&x$FxX9 zLZ%f9GfV|La^Z<(3%oRL*Mw6HXN3LqMqf{+rNe=tgLH_-z|F+96Y`ioKGjs&Ng1~$ zdD_UUc9P{gr7tR`QJ{X!PBr!#_Bk?a%L76onFeD#xv^0VY}f<`{tD^Z?8*A->Z&yh zw8z=u+02(n%~WYXJ&2-Z6kup+i7HXIx3`xJsSVq~)U-KPV+!)kH}Zgn^-hzvYSEp-o;?{a$@OckZGj@J9a^+%-m8F05cW=k z2b7hi>vBk1(Dj-X^j|u8Id*X|$c6Z~olc;6(TqApu3;IFH&*6HG002-2oPV_ww}E; zG)nZx6UjjATLWim|0ScfLZV6u9lHuub@G7Q463Y2Mwx4B3CMS4ViXgij8L z2JfE)LM^iU0)BA2$5;Hm#d4o9nuCEmVlXf*#YUEB)m5thaPvGCrz!&zlZ< zvH#E^koW}+byI5-#+9xFigp5yKntpt26O6C0UcsVbvU&bBC_2d<<#$7#&y)R}%4SNFH^5gv| zg=%3P^*RMgKQ6WtZ;1IS(Q^8-7G#FAoE)-?HP%O=6b=?cm)5J{njbZuY1nVJgn1c%+gnBx z0^`){ejH$Q6*q1F{1@W=0`ApI7+}XlTkCc5J3a$;_!- zBaRv3!E&A0VH^*ZLW|je7VCUkK8Nb*#SF=U@Y=)ac^)FzGcW%S)Jl zy4+rxT`|TE>M}yYJ$vrC+;hBqY>!VN;hOgn=6l&N&aSIE1G42p0Oil@W%D6yH(V&% zSQKM7ATz)O6dJT$5WphM&Ucr~KL;%Nc#A(g#Qx&{gwteRuu%L1lMr(x3d&nUb*t82 zNQ{_y08T8x2D}eV)!wH+BScvmQ;gmFb9Q+d(*3+e?Rj?%0WNk}OQve7Yvzd{UI4*Yls5B+BdIzv&&_Q|;hC zC%m`B1(p*p#Yl4*>1wL`&pR}$!IV&IBdc=^xqQvHWf`)A)db&*hIo0rpC|hY!Tzj> z!-i{Mjw!RcAgH*wxL4ed4j??n`o8W{>qeU(dpU_UjX_@De*#n);ih3Ep=EJ0V7q_W zo(;Tl^I2aetz82@K!C>as;Q|`lZI|yawyYKPhHC8^G=m5R$p4AyBA(Q>>FM?dziJ& ztD@vM*G1a%hCUbvm5lq`IB$|^+&b}~mU4yQ+Y@kBRpaL2)@1TL z0`KJ847W{wb#P$Txv=ot4|I^83jyo;`N#@*gDw1Ar4cyP5BlA9A<(XcjfIsAW2olby1t261@zxzaM|=Z^TF;v zDF1sa01wh+g8&}l4Me{nh6>qNmTdYfQp1xYYtn+n(@O7~4})VPEH-r4)O^S?X1N?8 zh}WJ+nYeUP@a2LC);9|8kMV77Be3-pzJ;djl4WGS*qp!N)r&C<00O0p;H=0Fl!Nt2 z6-%_cy$KtGmF0XiY-sL*kJS&;+5+&xul--$=&-)NY_x?=UQoauK7N)1iK$g>D=^LH zb`04tqP*9yGv&bJrl;Z&^>IM`P6_rJg4Q4f`(lz01zTJ8bVZ^v>*0OudJ+Mmb`Rf=|BwcKqDz ztiV45V`Y&eLGP@P7B58nek{Da@!7D)quAH|fjWQ6>?2Xb&CxoZ4}L3cMm*~qitUr81H5P_=;V?g`vu-2IZ za0@~jh+4Xtm#Z5TiVlA7AE3ej_gc}T>{h^p;M4qfL(1EL+s0P+$4UzDUE5$E6I6y9 zUX!Jyq|6oY^DdexHxu+A6(&D#~yU?Mp;eo@&+wM;1YQk zaDkZZ?gylNrdx4yQ9ZuBcK)218J9%GQq^G-$Xr1& zidqSLv=I99rLO0}@$>VKyN|aEZh)hGs1Cs)#P{AG)F(hlF6Y#Z}a3t-tQbqZ&`QN<887BRPS)Tj=R;!A6d zbaLq5M}1AB&l@)K*q&z9b%?N(J?H(*wL`JSW zg@W=sbUC6siLdG2x9=EdTj_eRp;%+e?Pl5fT!>Ta@RCENJh%v`Q=^$&;={;rUMAnt z3~zU7Lm1)Y-@fe<{8?CNTZk)cbs3nwogGb!&oO1y8V}yru2-b<@r8QTR>DrAR=6j{N-Q=!U#Vkmc83IKi^fqX5-1&JtY5m0w>J$(>r_7jMUEFVV=UKOEbjTBY0`k5O5$S=q zfro`F%4#L#*`BIbHH3XWEEt^y6$uzzPYd3B0|YeJRZdPP&g(hIqmkQv{jI;5+W;L@ zXfsSKwx6%K zf|n@0bX0X8axK501U$Yyg#w5^_K#Y9bM{M>)t-j)V6ZP^SK8U+nxSimR0M^VJfxdSI4Fc;b^`u`F2jnS2W%d)X; z+nU(sOgyn|+qN^AOl;e>ZQIx}CidHN?mhSY&5xa|>|Xs5m(%D;kUU@CteBf<3!xvP8#yr~I4=2o{?Bz`piwG6II!n727K z)U_E%hEh_J-)6FJ2c85T#h$?vzV{y20`Cxf_25cZaMBmNXw~kj^*i2Qv$XRJ6lV@c zQAG@FZ7&bvmkJ>A=9dQ5<06bIhx^C_^da5_7W|$VCq0SZDR+tfcfc+wcwg0>R^;TP6YkXKlvOpB17o9jdC5$S*6CNBMbTLQ%BfI#V#*Y&T z(N?lw+Y%(ETHS?eRRxUNv}qJSFSTQHzi}5Jg$6N)VZXBws73oP(S5RaWL}LZ=)Hdk zy+6AX`?og(<#64+9BeO67e@eO;%+aFpG*fg*LZq$9>7ag3be?51BVn}H@~ZwirWVj zyh%@MOu6wP9k97GCtgPvpozCvM&S_Akc+$9XGu+uClIdMrI6>$Y;`!pXMOBg%`wa8RMMJSN(3guKl88JGsJ7m}RzopLBgM zmrR}YBer;DZCkGgB!%^SQV{2mw7*^D{Lj_^*acu=cCoZRJ(K+16#8#G5IV$#-D>YE z^gpEC8d_w2=wzW*Xt4_P&=juLHb!h%{p zIQ8kIjXAzm;gOb_`3NJcr>Co{4Y)HSh8=uUR+fdm7kFk>c~jEGWFP`4Dgn_$V8@pa z^eMywo_~!lFy*JKHP7r)Mh+feMviw|$3O)rb_3`cOkn4=lc4e4bCBb@xiJ)}%WnSC}YnRjH6r zsY1XE!AjQVs^0E;(_-$W_G|$;pKSoD7_g06vN#VsGQ?J5F}Xb;4u{-dr}Bg-2>!b~ z0IIVIAns$sqPSnoS2B?_#_L3Po!(tDR3CP=8L)PM23y8Og7n@ls3iRzh-&p}9pHKw zwdbEFahV)^!Vr~6(8c2TMA(iY%iOoiuH9?RY;xAqMm9;vWUA8% zf%i^(M~~|a0#Wp(7|?eb0T~%7TR?2kaiB`l8IAWl=3@EtENkrWDC&F8)8=Tz3Sek& z*Z{8Y*iHa06?%aF@7JxlKkFj0X(`u{(3rYu1q-P@V_}pQ%8N8%Q=l4I<6yvGD(9cF zCUF^w=F;y!=UmUByw;G&)0q&LXhkewF>XQYnRlOl@7UC)ayX=@^7n>-<;l{$jZx=J zO)&<1g-vl){<biDa=^9ypm91wpD^nCoyT1&&t zoJ2||&2(P zZ!>G4&r^#3*eP-2?NSd4V`J!~f)vvBD#|R+-~@W-&COnY#Z9#J-2s@7ndN>TS3|wM z2(+%xf*FmzepZ@jIVwR%A>#Nim195#CMUVQVHd(tXN~0wfqKIOPQGW|ZY1>eGV@R3 zANWBMu<`uCZoh^VO~h@52(Q2>!*hp02GZew5oi&<<d5WC8IVL@-17-4irv% z@664YhVju`a0MnU>vng@8e`l3AJaJ>_Fq*c70OsJjuc9lim?e)e~d9`g19EsJ1~cE zQs-kJY|z9ZB~nYPB~+8+e`^6UBtxR)5Q`qA`HK7pMN0SCEml2)S3(@}NzOQGR?M4L zi3I%qz7OH>XOZK3+wO5~LjgpWtjZJv-mIT{Ki?a|?R!411`iRY7bUf4xBCoc0Z-6D zeZVbLLW4Q|(%*@(v6rDFqq;>GT`tgF3{wDnC;)iCDBvGB1+nr?-}CdIFwCYu0F#5D zY2Zg^);qVQcV^#@feG%2W3AvVeur>fj$;U>@3YtLd|OBWwea-dv}u#SK;_iy&^N!= z!-;T%hHrZ91d$T8wxl`V4BY$Q-`@+Q6dVJ%1f2Kl;gszh_MXeCm&=hf?)gqg>}{Eh z(VH>Vb}dwC4(r}Pg(~Mf5Z=}Y6Je)nvO@RY~d+ zt@gt-y|x^2MYLjn=n8R`*yyY;X`sLQS{_{7vUwJujcPQ?XJKdLmr~RV-j6Zl8$PF7 zdR~Np12bA=D~ouLq7-j4x2w6tk}{Jh4>f`{Mh#oVtWxA)1CKbV zuOq9M1%;mH(~WC+`APL%_YI>up3K#s5Kn;BAF~TvuBV$Y4Dr#D$HQu98OCDI-frLV>+R zM-vJP8dVN&l1!ZU^06t4|C|pW0mAP!QQhff^V`>5R;W1IZ4{(#iM0f6m6ga#(7f1r z^!N#6RDlUmRe7aQabXggOD5cD%dqc9owp2qJJa|t(-6I|q?QG{2@Jy$?O@%yiM=@L zef4U+jI1Dh>aD zlX*2Rn{M5!vD4GG?}aMm_b%?Ogh&E=b){oszvwXF*c$fI*49GBtpu^Mvfy_*IV@Q+ zfSKJnawYbgnGoj)#;?M?*ALGzW(6^>km*@m4oMV!p74NU*H#8e=U(DcHTv3t65(^T zjrkqaq=8k^R^L2DS*nJ+y)^t4YP7M|IyJE|skofg25)32c&UT2Lrf2j9!Gd%xM08c zT!U%bkRGR7<$#O5n z#rGKq&U3^*Uy%dhkK~zcpCBdL(4fAHy{g#vlRik-pk5Ed8WH`RQrO*q~kD&*!d=ias2=8CHqq zT&5!$H&G|gd>t0&9)Na=wUS!O z&;LaxkwmGrLQ&4hh}tFB;yU_|Qg@XfS+7rQ8-Uj%6T|uL-P+6p$BP}~}gIH*xK6X!|-}T*}UZSzt z+SpT%Rp`=YuzY}-IVdikSsFx8(wf?5vIV((X|-5=XAaN7g4~?U1GoH}GXpQ3kI`s0 zT>H-E^)KSA=&?h_32VTRR7}zUV&mDRt-Hkq1#$?!!$Q_Hd@ibQnLU5T%nbGA^`?e? z1d|T`{PXSbFXdh?(R;f?T^yP;s#asd#PKnpU`VM>r>eilmt@t9Rr5r)BSp?y_`UnY zcq|7Z9_d@pjhOh4))dLst7Xyv>p`?>J`bPsb)zvpm_Vp7e83ozQnu><$%eJCKtC9p z_Utz5c^izhV*`G&UcwSAY0dE&&a?9L!PsDdu32ou>ESh?r0N>+IyDU3_9pM7L!z)( zQ4|XhYiza}|09E|U``OL@Sjg&Ph7b&Td1%_%=-o{I)KWIe{~YDnL*4`*vh4jf#Q;_ zmlB4MKZ`+DsrQ|7iPV$AFrN zy_=WK+`2x+fd)^qtQg4x2OHp#(L@oeCtr$)liD6M{`Ox3j4KD;N-TOEn}H0@guFqo zfzMXAz5b$|&&PORDk3dbxq&J+TBHiEI%Pb7buu3M%`5!%Eox~0@IFg}UnJ~#_L6iX zD6m;7o>;)gp=Q8tXci+HvSiE4;Y$xkBZtpl4~rhu;P=nO!%z>fYwteJ)+?m`wYDjv zB8P3LNTUjLyED&7I>B#o-Yf(T+{hj*I53W}u;0XwnJ{E5Yqw5qs50nNqLQ4dRVEi` z0}+Fb-1$Ebm4n5^N+a?*1$+Vb>iRQMWTnxLMR$^UU1bbelDiG40hu}##sgj(MJ3qF zER!>#d$N$$q&i66Qr^8bEXp#XYg7J88L!UnFKI?iT6%t;YXaWGzcl>*IBS6h-T`Jt z4jknYZ$X@a=G(}wU|iN+N4V8A$Q%TlokCx8MgmN(kATiskI0P}cQf}MvS(bP^_cC@6ig+dxH=m#wPwo)0;%4fF#JjNXHp1ac56@U2j zY{@#o;&8A|D%)eA8H!1B$e?{BK(fiFcap=Gu_Y+9#)}BkpmIgga+~h{0TTOhw zcSa0VC0%b%s0o4JsNs@a2)mIk?qPMcUERXb6___(x^YHh zFgvH>Ceiw+euOwz2h_lVJ&YKFQ+QZ1q5A5B_U~YIB)t5s?wmQZPf)04z|Zuad0?I- zXYPoG5na0%Ue>bT;_t|CY}SA4L6$P1UDbSbW%msJy<|R``qikCdg!2?LI$>G_5^J&4|}@Cx>utt!J!B_cxSZcRX!6 z{fmqHT~)Z_y{qCufhxXHZMbBbQ2!a|qG1ez;4}7(G256QmK%1XkJNtHPEX^bTM%Uy=KmZ;jh$6fMZG?6AHho)95KSW+%4+P4rKpscW&UHGjd6%DqU~m z!i}=}Y}XD|)y~W3_xc*|_xM^tNXl%rj~cC|VI!|BaYFj|9do_nE3$Zq=qysG>J_c3 z5$^k<^@=sk!;Pkpq5?xg?RZ>uGL<Y<4#sB? z*b3`bCIG|+``H}M4noqdPzqeh?Onm22*eQaCJ{qef-m=XLY-eJ)+`cBp_$6UPJ1i=8?Foa!EpU7sM@&zVzS+XTgYc{=(W1 zNgLZ?KPQJ6k(gew_iw+mC(E1DEwQS(1`JF3xO{^`_&ll8>N|&Zbx|3s?na2iz3mj? zQJ+w4ErV7k3eong!Johw74Y;Oumlym`Rvp69v-PXfdIGp6{AtSc^zNee#w zyL&K|OlmS$bv#L@F2EUNdfsp;wt)TF1ORl!gDqjTY*iTH9*C8eqJh}sCO)a`ev@-Y zst_VO8X*bg4XWw>yT2<;tN_>&XxG+Pp7A^ftT%U?+T|^w&VD&1(aTm?Prm-=K>r^p zQxywxRgxa$k+Za8)#M}3p9ypCJ*UoFxX*&)?yRPkH$I~!MeS+C0vCggbM zsXr6-lv_{t|MdcJV*qp5rOm(MXaMK7+>2JKU%$33FHfVZV*s{4j~kSLw%ldfF5Kqi zHc2DrOfDQ(IV?R8?$nkrC?F!blmN-|Mh+jBxd zL=0%hT&(OfYdSr*r>mOXwtv5G;?nnLTqHti4p5~`NwJb$!{+fk3{CQ7{Qv6^Sj@{);KeGlsF?J*uN7-!H(tr#PY`0 zN-x2U%6G1;+PXE|P|2CJh(Ux%w$Sz4}_dEYnVGiGJCv-V+G`|C$Mq@L=K!pmyWk z)Nl*nDESR>Za2F?h2vm+DomFq-KXtCr%Qura9c$JzVQxpyr~CprV%1h(`ikbrEJU{ zKN;MH*B=*vYX3+MzRauJ>gY=!z<~&kpxM&*cNWAWZ}5BHBOccEIZd_i#8Ihmu+w8m zftSbw$@)P<8DZZB<<_A>BMB&Y(Lve<6TP%$R^Xyr{CF)W6{25a7ymZ4blL0i0lnk@ zx=Jpk!vuJ(ZyV$!4Y+#*I#w>>?cnq06#+5LE?5aP=nBCHQ^|i3G*EEW07TctvL5zW zUCFxv=X{5~9X zS;K;{>n>+V0KSoK6kuKhS5sm4+nM&x0tHC@89ShEhcEroLJ=?|SoZqlH~cY8I7Xu3B9WMEhXnu zTzZgCkJHzm!t&FRZo`r`B(zj6rTF#ba6e%sEGcLd%7P#`e->wxb~b!Fu6Rg_G0l09 zo&r#{(*`M$BP+QIGmzb?M7KPC-@=oHq}cql znzvk8tua0zOZ3N)8!xM!Ex2~gR?vyo-*w;0!w$(~KM-pT>kRT8prYzVmxgY1iL}!pVx#z>0TN;e{fCPXQ9J-{$c9M)b*|zl zElpFbh@Y7|Q@W^Tr;}C<>=ytnW9#_N%NC0dtODGiSA2QhfJ*+}?-=v$HfCRde34Rc zQV*&R*F|S+V=bN~9eCcVm4&XuwgiqhfW8S%_8os(DI%JYf#UZM#W$G!?d9WOY|s!t z{o+u?BRio?`L~Li&RYBHZ0HM>Hf?^bmTW)Hsuh9#ranU``Z=H(?L%u!UO)`|+}URh`rGf?j%mzSGIYhpm=#s){%?3C7YT z{zcmk^Zg+_v>k8O#l%t2sP1N-KMV8uclvr)!@_P?*?uh-KtkOaVE-98Pnj$4=HtZeROphI9zg0bk(SrT6bmbqjnhUqi?^vGe;{Ne}@jwQ+U?goE z)7thiU6lsL!&F534^FpWy?vedb%(x^2HL2#8VtY~bSb1ub&Uh4b3-LLW;>aj!bs2p z0!sDdzC*`SHs<4_4qh?)u9w#h`z|Cc!r_MKOQwBEE&9RSSs3E= zoRh%j9t!QU8dK7rJNKSeTA;S~{lC86$@ae1J&Bm$h zU?R7`yP$rXMs0fG<0Hvt#>|wIja$c3*z6sr2d$KjYsFMlkwL_m?T}FPl1)P|Rrc@I zQP(!q+jd48IS$38?S&2VCT-v*wbg+@729M{f$Rw1T>wG4i7JDEGkQuI5Q0O6SDEf} zJlST=Wv4ohnb|#POdnht!yx&){^mF7uu5|DkP zNd$X+&t=O1835M(nd==-=r7H<(P@cZMS z;m#w?1#~8qJ&l$p?Lqu^)zu4Q0|EMB+qj3+k#MGSY$$BN@1b*E?B`gXJO(RiZ~%j1 zdg5XPWqF{=sq}mM^?(J}*{hQUEHy4_+8RA(svrFJ34tl4@5&}w7?=PAY<0a+FekCq zeR9TdenUnRY+QRAI>5x28#BJ&M;1;<&tKWG5yaoE-w2mD8v#jc6AK0 zuDoAPCO=ij(K6O4UG?iM^qnC1v<#0x1n~oBkxCqiwBND%`R`91Jhe}@n6TW6^Si&@(OZ0*+74w!_lj`pFJzq!!$u7TVwbH z%|f3iw~F3x=6ddBI(_RwtM8Q~mkgNE&J7JGgjGZ+9zl0dk+yliHhZ%>Gsr<(j-@H= zebT3t${>_&qo?dBpN?wpnm0Q5_zYzb&#e!QnJs9}@Q0D`k9%0xe5lmv4vwRgVHvm( z>BmLe9o_7%8kF^i5@AtRe*-sd{mmJ1iRUg+d$GOSa67R+%sWFyxH4F9Jgb#r;7)ei z4pyoaNiQ!iCai(zB&$Ti;Sm`6w-|bhjn#Em-b29=&|iPyXZGLcgt$)V9P2|-dS5Yh z7%)N|Brh$!3q$`Ht7<`k>VP+8geF_yUTUEJml84CXHR zo_oEU5!$gl1Ky{F1&mSfZJHI7nORT?=_Van8EqF%!ZmBeYi7O0g4o$aGMm+=Z!nqR z&?B{oqgwzg?H{Qa3UdOeX3<6ds=;@$?}nY`%b2nfm~AOBbqWGvqGoK+mWfc1u8$7^ zF1u|tc2ep1@9JH8xqE7PU6inbb>8iKbW3onA~?gpa{$G5xyYyt?++__V0oWF35I*M zPKPvH`Fpd4?OSM$o7iaAQ#!9Wr;fP7mZU9R8PAWe7pQHXbyr5 znPU%r+*rw5n;)~_qWO=Z{WoE{Risevf;o`UWwYD40!8hrE%|r})x7IT$tH9LikM}; zX7t}5I~+VdZ!Y^Zkw%leaRa!Es_Pe$D5L^ zZ0dqb2HU$ms9Su<-gXs`&FeUEEIeusdAdiM)o5CK;x390^tBj>1RW1@2oNjb15_NMQ58m=K+ zn_#75=8Zaw@A=f~&clcyn$0Dd3krJNi4RnK|F?#AnNWH=GCnb5h+aL7A(Ba%m)*oC zGSbr8eBT~>djpaOfNiM(CUsp@qr7KL%Q|JmC+tte#M&PW7+kk!@!55Oqk?lX62QC? zgW6WD>0vuq5?HE#0|f7o%N>-p1IvGY%@q`=?7@HpeeqnV`_kpCz?m6htI&^3Wp%6!xU^kcC=?e}5w932s&W;I< zZHNFDK0=~+c$$MW$LzpIUDyiZ~mKX8)-A~BQqjkwJOR7x=v^=-@lCxvsG+@K2 z{u)b%>vn6mD;DiFF5D>;QmW9_gS+I)sCGO_k>>F3wbynaM<^=6-f52*XR65gFqBAs zROX1)hYM7|G%_r=W{j_Aj6t`}>EKRTpX`w{tHUS(Jem2IjfnkunmqywVL#fHG-b*+ zle-tKP@jy73(t?iey-$N05ahF$cuv|rX--OkVDaaZK#JK>0j3dBMCL%k|6%1>F1qBjNJmRv9I$t;s!S?Q+;lUTE7j8tD9?|6&5>js93WNCLmT) zq_6wty4(&CDWs$8t< z)H!4XJLVzxUy&dz_)z?qHZ$f8O{YEz@FL5 zqJvogTico$*Y+JkE0E}$YB{UU3_KNHv|(QWzTER=?*@*lBH|+p+9+!}ivIgGv7ghy zGKO^24)&V6@!+`%SE{`iG{{mF&?MEFiC1Nakpp?>n7x52g!6vKV$}36%xRWv(WYJa z$a!G=JDjI#O^zhuk@~u>-l7e=&{y!az{_(1Q9LkbAalhD=7i_^=ht5HLOiAwA_Sh@ zRjbqf*$Q5H-T#FA{KGkMBEmDCYP@ykUvj)p;a9q(APQeJm5WqVOO&sFt{S=W8V6@}<{P1+ z{xcfwO(q4w;{}rG`}jC#9P67WQwrbafJ!aCUcA)5q>={ss1Dp02OaM5F$nst9%Ukk zzibiN4#Znv(U2Qil}M1iz1t&n>6a@d6NfsRWF9+-W{|Tz*H4|^{|fEAyhkq#DTy$9 z-Cu}*o$I`leRX~Ji_T8?J1z-rQKDxcXH~2By{hB(TUFZ--5<&cs>C6Hgo`CMj26mm znF_pf~*1@Nzzo*)Fmi4yo*E*yuBoedtlSy z(nWCaW)MkXB=8;vf6e??o*6EW&b)UMQ0)biri&IVOZRSrmRvQe%q|Z@9PcJKb;z=N z!Cl%k#t-W`E2aQB6W5)Z~B{NwW~dQ6!!!(nRRPy(;IS=%1Y|%2dU%a`YV1SP`vqeXdu010MfaDt@Ew z<6{i#U8+z=B@t9~0DRnl^$FNRfejm&o5IJKvSj>hb50cX+DOl%oLH@cQ7Nw0-W#o5dnK37VOd2S z_+lEwf&jzXRf__iLW>_cLviJ3Y3z`aC11pL$`CWqS0>8LC^d@-JPkj`L)kzK(!a2> zWCZ>m)U6GR)s~Dj(X*_za9&}qsN4?=a^}v4@|C!jg4gxFNjpx+;i$>^vTnxU8^*> zwFFJ3;2}i1*$E(^W=*vwhrAo+k=^U0#PJzunqeeVG zJ-U!-wzr8q?qb!EF9=)c{I*sq`bSy_LAw%wMhn|lCu?p=8iC0Y!a^K1Ira9Mp_>1L zsDRu-ZV^iFM)D_=bPWy=w^xub7d!X3-0lyl(1kjvRQx%zku(s1SYNLwKK9la3=wgC zO)e8f$LJK8gi)ccNz|SywoBD7H;Sqf2uZ6ehBGt#Pd!!!1Yo*3nX#?f9pNA}WDI*A zKnmLfrZS)4Zk(~mXIWvMeYOvzkUx&yuZIqPFxwjK5oUX+ZmaHX-y_h|>LrR~?W8&Y20d44{ZAQw2WFtV#H6@{t#DfpDFMZdRHXUhL5 zN@+)sW}=mzPc~u4!0ND?comD)v=}pM^6J#{5mn7?sYOvJp5Nsc=_7-VWw4^BP_=3j zN4pwMB#H;`WcaHh-|>?ZwMgcoGa(Nz#F~R9kY@iTElb|Ko5y?aaq<2E-#dgT-&(N@EJi5_jA?U{3?J1$+a0s?)vx< zCzG`j$hWpai&dt|2MY|R1%Kh^K#ArUEF&ai|7_V?6wqg&KpO+HY(&upjv!>t3UYG5 z!0e`q3iFi{m}DIfRJ^S{oU7}cG}xRD4_JVMlsU~JD%~OQ&E{FnFK~remE^X%Sv9GS zle_P;YS|-z!V6Gt<=~>dn)-<#-b~Upwu+D1x7XimRR^|VRfGo9-1O7phPBicNWaR! zV`O;8q&s;jx+mm2VgQW|L6Bh<8k~uJ-#tA9_Z>S}dfQ~N+yGFkw$b~A5UPDS<39A% z_+Xvn#5Dv!buc~BS={w$qXmIaK?pi6nr3ONYL_5!%u1QKF==`0{IUkp{2hq}LYq>nHvikz@PD{^0|+flP=P%} z!WYiORq!YLjfJbX7>09^H32rXgNMbX4A2} zYF3#%AgEHXWmn*pS*L~h6E(c1Z7QqE;XWWRf0?x2>v>0S?wnw1`EOih1v7v%pe`c- z|3QcVrOs3`vGps9%VxN#jD69SH;WfG^PjM4Srp`u-Y0{2wF8i-{6%ss=Q}ub=ltO) z?)j(sTEyF=7uiKyJ7eX1xF5Gi)x z9XiAmWgOmM?CaAjw86?ct@1N!HMQEiFoZrgF|;*P_(=9<@%i$vSx1V#ex^b67Q1ah z4}~i zK71o&(B&m_|D&hxC|7~^ZrmQ*Rz5ERbv3TxkRczU``)vZ4zp`|yDZd7#DH9ss0Z+- zU&wy-5BabsZ`L?~^;89pfiEhTxXs2)5G}ji_k6vH-q`ry4e260_+!hMT&<%?samI# zpM`%FIsU`hy_gvja>GtTIgzn>P12^N9@hNWz|%%?!6xvQeI4=(aY+T=zJ8nP41cJ? z36rpHwN^M!jU$bBozF0rI8rhX{x23*bt%RxC-KZEjzvT=S%wMJ{3!qGzib!Z+%s`(z8ob6a2w#y8tBbDgG+DUr zLFHOMDk-4gm=QZtUzZN|=x5q+*=ImGpr4lUZLb$Pu8%45EGadUEwa*v4R zxvj=gEB*LG0u4U6xWF~d4)HkbKaNJ7Ju2~a`0}z^lH>1q`d2kHK!E|}2vLbRs|MLX zuF?fX2?oP8cdDN!6&;@Tx30np9 zt%a@I#|)vZ7IS28j+I`^4{-*pjMUWGdxAUSxp|bcT7nE8~hAI$Kf1I_`S+nxPEix$AOt!fa$-1NM20XJ^+!N7lrtI zegVH-^z_B~=8O*!YdHng;{@f#6S$KgKDoR~&ulN?-=-PV%~Gpsu+M$!9gWn{2zPf2 zVU|IfN4_WZ=zEL7OTW6h^7$C40iu!5JN4^KL2shTx>plP{r#Tu=lO3+F1M(07UM-5 z!CUxjjWE5Qm@6rk;q0{dZx6i zR0`nd3VAGB`gpfMJ8T=R*-%3fy-f={+IjhjfM>sP5@bV0L=8eDkyDhL(z0rm?yNu5 z8s^NJRxcg=khd5~G9sPSuoO_tW#Qn4aaApcBz}ZxcGRhbk>9f7Sm*IR1o4szMh*_= zP~;JGrp!!DZD)5r+&|^;IPMotTwa`=Ww!hBCCUC$cmBhwNMq-4$*o-*Xg*RFrCa9& z0(ByZ09xu*0v^-dr3DJBmzO{2m1ykj!50p}mLG<1Sw>&E0Up>aT?LlmP3gx|RYfHm zNV00m9gwdd&dR*_$0ie2s{8%#{oo)X%$WJzo%3Do4c6nzqCEnaAO9jFo`=?rFxp^z zOm`hM5^13Db}hWRUlN)3S~vx0cU#+c-i%;?fA|8@9Q$G;ZO%k_1`O5!Wb~@I*MTSF# zkbjIYweSMxng_zPzjS}zR@8K_k8WDaJcTE1s6iB7`GL#1+w2SYlfVA%wN61$=rXCb zFXT?~1VJs8(_vo%H{huA=5C7V61#a_6;EUM=W~h^$bnM3X5+<%oN5j{YT_6_m<{8$ z@54xa}LB!l~Q;2>;LI45Y8V7cEFtrQJ z2pIwfmo|HQhLKAFnTlks70L!i*9Ht6aicrp)uygn$(AjZ^EI5P=Gfq*@`+1dI=Z_( z#Cgp3ZKjk44Vpt|O?*axsAC@9eLxwfWnrbJFuqcoQirqo>%BU_ZYPcPN0>OP02}@^ zz}W)T=qGZ(EcZZo>dn1;Vaso^L-!8^5|T2+MkGoJLo2f(#3gdn)Z-EdzcwADlYrTi z{4C7qnpD~xe#Z;yn(mNaC-g+elfZ#!#`F3wVQ<@3eR;hRV-WB)U1n-$%*U_j`>z0? zkrnJ7OWB_#FuS#=xxTqlo1O%O&t49Zn}W~%YO~IGq>%u)rOy!UUFFkZNgsS4C_bxF z##shg!cUnR3hHY>VyTTI5$qI0?KRn4iq^o|a(STD^7)ELg|lwA!TOJzOfMV^OmlxA zHPaE!WJ5-;XK<(RqDsX`HmKvdH?7j9LHoPcAA2K}bF^80&frdzSfGbf!1ID}ht%+hJ2En2 z|1rMOU8s);9mbw-r;<}pON-Xcs&r$m$vw$U%Rt=557HFsXp`Wds}>b-39LrsP51ce zYB6m|U=K!ChQ5SFyn=mfVnI&dGs|v5{miYb{w~YK@5FE5{0a%>!63IwBPg%H#~m4X z1j>rjp6v)o`Roku5fg@_$Lu)Q88zU{um`=9g5toxlY4l{EUB<9Suy{0TfJ=9W0sxm zB7(;#;ef*VhR2?lfFm#)`=Yb=`j7#b_KgPFP~^mmotd6Wmd5DK@UXr)=&$2Bi&*a` z!Z)Y5N2ew~q}!n>y>HaX4+XVye(2`%IpD&H?jsZ~FM-Z%fnUB?ZOy|D!jrCUh0hw6 z4Eubk;u@B8uNwkHp)@%a0}E`Xtf_vwa^sOqIHlmVSSRU$=Yjlv>c92I3>FI$fIVC9 z@N|e@3e+X4iS^n(xVJ$8>Jy~{zjZ$c@mw#}?!UXD{^EV35)@`V4+Q9sug^HR4h}kM0 zpo(ioud4qwS6lzIH zw@X}NLIRus0fCqTR9JBMjK7aT_*=Cbk!n;Wd(4i%gqwokpxfZBEq|>IIZatePR5i^ zN!suhqDwGwTD5l5VsIwx0}VS~N904r*(UupYOc1MD3JQBo*GS8c$>OBJjCl(J6S z>dq?0$0C8XuZY85C-Yh%u6Ae7MP4PBl+k%x?Rs(OQNLIs@BeXFE>7gI%Pp2 zCAU&6XVg05(dGFQqm;`!F+`NuWAJ`^#^E~YWZQ1C zZDX36Y}>XuO;b&it*ObjIoa09wq4Je_x<~P*YkI4)miO*_G{z9tuf~|Qq%xg>xSPb z4h7r1FG9j^IHHkzBcrM-Vvn+2#h%(pmmgK6sm^lJhCa5(lL8EO@&RscM~tSsJV|MP z-ncPIxnte=Kk6C;dC(#nGH^|)ffEdk*n)lt0qA=I31sTz7UPmTu97Vj0-)ukFY|ivms-fzF z6)}cQ{zKwvkwSKyIRD&8ed$G7BA8$3I zi!9+AMPWl|L%K@K*64KRmJp(bz~dAR(fItc${Z^!ovp|I`7$tZvY?z z?R;Y5JU(9E)Yn6|BH6L?33g(794Di94M^xn(K*fG^-CsUuJY10R!JEo9sUZ=!l57; z7kceV0!C@HgCW>cR=g^V4*fcs`3tCSGabnQy5$^Ry3(P%I*!J3|hohcu$YS4M=h|T(%k4lggvBitv{E z_|{`%+t~S^;W1ut!#}*1m)l@@iLj;jxS}g)RLThjJXF`y00O#DGam%N`s5ffA)b_9 zVjmm$2Vr}W1&lV$mOL`hR`CS!4;@k;dv(gOeZr1>t?ph?yEdlLef|{e^eG8v#Px?Q z9A^rDlJhUM)%`Fq^v(*pL#)yUXvMqN$83A|#rlwEL)6%m$7gXqu^Tp!^QCuv)p^n?_UlqpQy76=(g6qG{WDS@Uo3Le#Q#`kg+eqPVvg$4A zQXbYzN^Odj09v)FN{t%DQlgRNp$MGjaTpBR!2F&`QcmqLl$1K;l6z%e-|n6J&9Kaj zj8XF&qk44TRhz~jBAN(7-(PB_YL_Kwpv^|?gMG=sS!b;P(*mVL<<=loQY|tv_UDks za@Z0TCf{|3a_(ZV87NuPO8FEnA(L?sF}Ihq1QWXAdOIJV^PLZ4tx<#SW{ltQJ#jaU zrY$U{1}YjmbnK-)^Wr)`(~92?TG%Ivy!Yd3GKiPUK?li2`V${|TGcxnMjR$A`ELiv zq4%wl`pIS*+CWTYYQIqvoMXK@>^^;zfE8 z3O7yJiK(_3hGg}`D7aA2c)zA9S(n=3EX)9h(x^_`n@q4_CRBDRokN{pkPCHuAhh`Y zHF4a4)Dt*IDQEEk*umW~ZyrL^6XwmJA!8q?igGL7r$LaJAHtLF$Q7dKmnK$jkwa{t~)SIN=S(a_P;(^5ABY>T|S zM>V+5P57e(nKekm8UABG*Nc$cF!j=$P7Fx_tq6osoyIh;tKUh{+lgn7+ za9(-V(5E1KoG=F!+& zfPx8UzEC+_DqG&?svo9{5MuI*JCe)55Hn&Or3+L-5$q=>*kV|W;y*+%D>$Uc%=;q zElO;a*#u&H`mVlMb0eLp$?jj~XnS*Tr}AIJSrH=Y%X-;wIw<_U>-ty`@x^P6oEc}M zHO+bIk47Ee=EDy1hDBt7&0D>$HrJC0l~aoWtzmjQ)>G>8xlseGKg%p>G55Um3Cg zoR5u-P3U(DPJ=+8<@xD(?Bm13!>}XI;`JTpo-u-sVt_;@VKJ5PHwhfc+QVYW*dAMT z)-J197bi5EsMs9|_Kb?&?sQ(~?^($71i~Y-AG@7%V^4xj-F!Em6Xp_17(XEPU~i02zGcW6)uac;K!-X$ zGkujAsK!`V)c^DOIGWMdFFU*POJ;XL!9RAtzkkQ0dVX)zj*Q6D?oFJ?i^=veSZ<8@ z&m5bikbP*xrDV?VzO@*H6cHJr|MUt%cuBHZ&_PfW$nWilmbC8|j3NrH2M!p~?wbl$ zJ}U27)v$NApIsSzg=MyVCOSj=rzY_Ku|h>9f@CC<#Kknh#8vS*ek|L|9wFeyQ zfO*iLzwgGMXQmTz9shgG*JPl(z56_rtS=4t9R2;BV2rZQO=X%t{p;{F!7BcXd7*F- z5pc|gY07xAdywg;$}pcIVK0$wbx2R!sVQI8bU&XkhPP;DotFxeRCITBUeDZQW#xHp zyxhp-_z}c11Ji%<*Pj~OYDbLFaX;KazEZCB>Y^jRME^Y!wWZMyz-D2=no2g@b+e@ofzahQLQg)V{T2AaNoT`39xQ z>+FLeeX&K8BQ28}fY}kN|N1Aizp=o&dZk`CH(TO^`-Gs-Yh)DPeU0sh-T8H z>&7Q$EVZ;eu(arlk_1>BSuLEo?cF?G>Ol+t&H93Sbz1DmzIW}-UQWwtR_ldpxReK) zL3v_rTCw+E*Ds*#^L;oITXJ&(v0nexnx(@$RME5?%&v*=i$w9eOz8@IJ^IAkirb~^ zeoF>VxJw4&JwMdojc@AxBoIuqf)+_AOclCrGw8T0QzbZQ+)h}%EY_xF>vgp)rMN}D zVZbyFhW^<@J9&StV$CN4@74MSWd4u1_3w(}OlbZYFF1yh^>n?;8T2ewMwrq~jSq

    L@+jHjyM=becTuK9Wn0cW48+=rNi4v?As*Be{@0Wa#Y0J+btZTzGn-mfEj@JZp= z&%wNu%o?w7l)$bT;V#Y8tKR%Z_ngqIFN3DEah{&;clUR%TXBKX<>ui4DiUQLF-Qxi zWx7KY7JJwK?5Zg;wbCqAx`K}w;%m{WEla*9JOF`FJME{3~ua> z%Qf#fAVT}Jwnc!qXdofLuCdeSFs`u-?2vRT?HEW}X5Hm^6*qSDJ4HL5`99`pP+~>( z=G<=;x!q5NwacGd^!j}OV%`aZZihPbnx$OI)2!P#79if1aBLoJ`?5qH|4&FfNbSS9 zndP-ncYj5k=Dr`nKKeUN{>+-#y95AT{I{QDN{*IgsnX@mH^Z}*TKl8$5cW0 zN1Niy92Vk&h5XmK_yuo4aDhEfND?0QQ$UL0Z$RoRv!XT*hy+hHas?k7hj8R6p{M?+ zCeSPV-?Ew(?C-7`(G*Vauilwq-(B!#$yr=MO#CVpB{=%j$2@RvQ~|a&qdNaRe*YMy ztFb}v9>X4>Rbe6l1xSP=p~6zX=i8&KLP6VA8z9~w3f`n2754XIqAv-zeLo_>>E!>? zur^J(oTd0{#00!*UK!wMl>Gg>1BY8ld+Y>%5S378M!D3x!%Plb)u!@+oKCa39g9xR zBblDju@q$kKu$!+FiTA1Dm_qilird zCyFXxypL0xp-o4Mo=k37jUGoA7_nmSk&*csp2PSU{yq2oSL>4Y8ZD0Ax~l3e^`qT% zEpH`5K?o&6v9&W6sR<@@RINlL_Mwdn`j<%sYCOHr(ZQJhGdHk{v=)B>(z1;yWtrVd z;t~14knSmk?&WGU>F!TGr}dESWE-{k;?wkzNX(AtWI5>uweSKjH-IVfuv0J!s1>Q; z6d|Or$3xd_3saBV%igbqbX#{9;bSl4Bm&cobpvC7kSB4tiSITf+G&j@KI;eVRMsda z=7yguTl{BZ&S_fSuaPu|jIHop+l4CduRQhPX##3W<|^}LZ}AC-%OARb*5c%Z?kK@dI^x?5j{>CzU_nInES3U_Fi9W)#!^b zqRuNlmb{_9w9peQ9NWSVJ6&$R2fiFMJ)DxjIOuTGdJqA82;&_Vf3A;VVhT7QHK`iw zp)|C-Fs1G-O;kFs{@*}4i{9O#64*8;QpnT6g!8ybp6fZpDI_E$A`%B-jB3EsBJ%(T zX>Av{Y?FdKyw4Lk|77S-CG;+_-<}a?uOMHZ^;}l7;z#ND*%X^qktYDp)t+hDQRCkw zg2V}$bpr+g7V}PC#JJQyC6g!n{mujA^Ku18Bz{gpc?m%dQEF%BwtLz07Wi?9d717` zXl1gFm5!N$)GX@RrpL|jP1GqaI!w>D7Xo=Tv?s;DtFfu+#q;8Q%aJsITL9NVtzqKe z_~z3^r9jg!QPxIQN!S4`Ce5C>UgU<(mWJ6wDRRSa(gomN8v6U+I}KOf*x;|~1B)hY z{oyR8;CS==S&_T!$J}3 z6B|^)eW_#Elcz~xNE$r^*h8q3cSZHl_z^ZcC5=@cn5JmCJd-tQRVcOHqP}b{f+;sc zMzuRM(GHaD@qG{k42i?lg!my3u#i9c5T;{ld1HDUDWRbGutfE-a+UJi^RU$lHbJb3 zjZ@#!@&YN6DmBVfRXL76!=8x;DZ_^GH%u@mV3IQ{1cNh}tZWXtlFo8~{00WyF(})I2kE@Z%I}Ck}3JayY;?S4q z0DrT4T#5%%zb(+KyE7XVs4srfES>)yg&2`07dkkI(|QuraD%$IUxbv>$-JmP$WDe;~_T_4CkMEyRsSX>Ypj5o4^f#D37<*e`N z;Pd%R5<-QUp3=*Hrx2c5bskPMJhY8q{1EWiE%X2ajH|VxA|Pf)70}z|Z<}ygz$`75 zbf1;Ac1gnWKVEWJQT-^RE+L`5GTdeKk;CQWWjnPActbS3aN=KCUEMQr70$2GJ@FPDm?TAu*`Wf~jebW}i4YJ?2q8Sb zq{5d0@)}bz3?gqVpx!TMtaiQ#q`TS{yA~DsBKGP=nF6D}q=dn}{%zD7J6?os{KtGL zB&Puoa5BqRbZW`2I0b0lFVhg14?kC4J1*I|T1{Qrh_ z+!^_GvrL`MeQ-6b(Z*vcE?uRPpj$#o*%$EwW9$-h1-gfcqrjIal6&@p4oWy@!lb|R z8n(n?;F}}?!9Pu&|JSuAQ|9Je^p5sj1Hh;J@?Z#%7+l8==9Ob2yVnm(aM+t4r}%+d z<$u@Vm=Z7xe=%)Wx>WK`OU~LZaRbn4mjAx?IZ)8a(!|8i?L7twl4?*~4;$ zhZkFiYAL_iyEFO3=1!dx-oIcARZ zS0U~=zMTmKdLu@Wy9dhh;jZZ8f()59;OpB=8jxOS<{l zj6LS77~J-iWQ$IZ8~`F&!9ze_B;c%Y(a@KAj^v*f5P0a*;&I&@!B(_vyjjTI?1x3q zRoI;Q33>>yUNM^0`|0*H`1ou&8K`XM|A4OFz~y zm`@H(J>S)q;u{@AG#1LoFMQA8Hcl?iNC-|pW)0s1-u9VlL$Up_u<58NQmXXcm|eJ* zWtYatz?V|6uU(abIlB+2SrqF_cLYxwgfj{$$myqnZe{Tdp8s~&xq@}X_3=kT#1?fH z0s?{F6V5Gfl4{tT=gBo$D18uoaHQ*>Rrm-} zL`0+SU@m*(OK=BRkFS@CV2r0ddX66ZlEJL9qWPnU6W`QS61srN<5Q>+MSj|xYML`W zB|iCYosyq$uFsTJ`{6F|lDz%&9&3_T8P?XY&g*2siWX=qb3n=MxDoKpslShb4}I?^ z(qE#dTGmPFE%}yoxj&`qd_++}sxtUtY@SO@4pkfkQGJR+`&~xF4t2&{666@Mzg_Wr zgfWeJj8=oMt_Dd(0$!J|B?ee{s%*UA?)AJPQA4_w{L=x``-gZ`(oR^}R2@HVxZ%8WGuC@7QVWMsO4WG-GYH z7=D!yN$NWLUi1HmI^b7Lw2VBr>nry|eCNE+$g>?fKmyc}ZuZE%_z!b*4uIS_?EEES zCQCC!vdw&4WdLJW$VHMo89*+wO1{iTuyQPWc1hV#_lI$-gdIsEeI5NXC`n)Vp|XMahVf%~NuXzwT^g=ujSm0E(x)&_r5XqD>D)A;>qE?wmT|Mf~u1nrs zQ^i<9*4b7Bdsp$$q19Hco5fm zvEpXaiiBKZUpsmTFt#dk;oXmYxwLk1M+-mmM`FWSkz$uyL~ooZ7P3zdi8tuMyf+2*lw5An=9t$hbLWg& zIN|=Khd4$QlO|O5I=)Kyc&~DdIbR7ktob#ZBR~-BdN5)A{Lm`HBwf}x3SI$(0;lFn zJCFWcpLqZOU%SH~3<48*$Y4+ebvT%RbX%a~&4g2==j7yMWSoGVrpwWoCxLW8S&|%1 zpKgL|`eTco4B(f$orl7NN!EjPNm*S5wF;f56UXtr84W9QFmu=xjyf>tvm&??1D80X z47BbYeya-#qW^?vuzy>RFyduOiMo^4pZ2Gh zW+GeSu@AYH)?^DW><-<=qbX+=H4n;U!jd$`3;;|C3W}hb`a8XXalDBvL6^oR zXW&s^9|Js8BfF zO}6S55Ws&FF+diZu!QzN0A%G&%_<4sUs?XS=4=186(!|g)|AQ^EIJip)w9d&^XJyWT*%nt z^|4@Z^T5x|Y|-~3(CKQGftASMEZA|qvr^;h2KS?O-7sDhwP?Zd&7z!wO7-~1qbaSS z@7_Qt+r1RO?mp%8QQGp+QQC0HkpLKye-rP=40oNx*fLNQP$Fn7^E`3^g0F2Nj(*2Ac|3%wfMe?agiA(~!2bne@oI=|H?0xGN5mNFQ){pzN#d5#b z$s06{etdFvetvrSyv}+FI}KR1itIztd_ocU@%w9)8nfo*n102#My?fIt*>;uoHaAj zGo&?*JsOl@JU9kH*AWDpJ`73p_t>R`?JbwO%k7UW!|l?5Lu;awrO@Kc5iyTfI64r7%Ai2RrJ-ip9M=GkG2NAPvhYS>}iaL zx1lc<_`X;Q#Pp@SCsEs^WH2K&VDsHt&6O;4?nsbXS`TSLe?l?+!2rHF|-%@7>?` z<0SBDQASC4+pXHRwt_V7Wgbv8TwnB@db3cy*>8b1Wmw=OHrUsm4YTosih1;ZP#eJ^ zFhjlV(cp3D<=?)+p+s;F0u*4dm#Dbvw}42HM^c+D*YGf zVJ^^r&}FkZnC}AaO0d-Lvg`Ani8o?v1Yh;9bw$ewdS}v&n?$k z^8$*xyxt@P1YR%WIY`L2Z|A6i{C5MI)3R!3r5dtSSc~ThH_7J}T8f5}$)7J_S>&u) z=arlWnOWt@VMWlRy6w%qtH;TVqJB814yF^6wY*N9Rt zPMT<{40GDOZLcS?mi6*-Yv*#qv3Jbhoakex!}mkrW#pAtZ6$C zFcVOszKHv62$N5e0jA^D71Fms~a^kkd52LWGUYpmyu+D?2;1)Oo)kLPBVEq zEIBajuO~(uff8dr(4;vuFiy{6Sa)#zMS13FBqQ)_hLwXELT#{rp>q-0VqqL%u^VNg z#QLKMj~UM};pg&rJq(FsL__fl2qXqfj-9Ql-b`Bw zl2oa~g+aMqK3*SQUIxCth=|++R3^h?;Nmcd)^U`r<(%W&vyHL|G3nAjzT8Z zJLaCcoxQsGi;46&5&P=us%9qqo-+)cjAlChM+|OSll`h;ouwatN8U|U$m)5M7I$&9 zi2kdAgi^V|H-8fszsFsHQ|dCZk_#ro`QMHm+|B0!g9O6V&mXeAPG7?vhdFUxiKo-q z52c~aB5GU;TP1uOLsm8oyFP9cj7(%A;6%W1LT1AjdG1bR7{Uial&U6%KCcNQwlrsN z#X{BkMl1au(geeSMgF1X$+uBa8SH%V4PsEfbynaWFdzz64SXwxE6?ZlLL7V`AC4YOxd(W%M z=bFG%rFOYAJnZVXYkRccJa(lpP$=lVKL}}d3{r4mm%6J}n9{0$iORwXeK~FVwq8*S z>Q)$58FDZlM4p2*L4F?k9?aYNsdr`;(gxjNGOD8rf0L28ZL_hbsxQ)yJOyq@qs$)i zO|Gzv3#vYRYW56nXK_++NUg4*b`H<5pfj`{oz<;v(G#dq+3 z#b^x%Fftmag6@dtNgiCr3J}fRsMGBeBQ2KwcQ~&81pQ+$JGtw1RHK<^kTGtVEal_% zWaZJ=RQIK*e!G_`CWtX*AFeWzh{OIlrhY$z!IW&B9oa-jcB5XvZIcLnvpU1|r11u)^#(w@u;xtWpy6@N;>dNMcxI)^B}1^VD=$Yej}~{RJhh zX(c81j7b`@Q+e=>_^Whkkz37b)eh`;nSO$RC6i<=C zkCVjiaHlY7exE`k;$}x*AgsXjj``SZF$OU$IT}@&O`+>_igiv!Eff(H*;G*AZ#75D zx?Tz$B5FCJfmn%T5{~Rp^4i2)L#4QN8PnYOvt=nZY`A;{%}Qe-&yLOm_Dcp0e74{u zLf?8@)18)+?Q^>x&T_i00^c@1klloy7iL%ASUzrXK2L%{`1aG0gzNm!x3S}IjUI98 z9g=qX(Tq=GQbCn*cZ!bv8k0MY|4l*v!e}f5aRK+N`}=+2sam4%ZG#H%#((fxvr;cu zhOI1#$%+S_0(X&|?2Jzf=?-62E}dt3kB3^W2(;mE`go5dbLW7N%|!A0eqDR#iG^O* zbQc*edan^>6h!$ejToY7D5#F$N4G=_gvF8ZVz9Lz3{2{zeeBJ`i-hIGOP+92^9?E* zfR&wugv1Xlbuv8sN$h(_L}EF&q;X^Lf$t?_534ui`&|pEFvrry$9vBE^FfzCG@*5M z$piOqwXCTGbe8m9*-%wQ^V$J`xERX}QjDT9#6_cJ*T=4|i0|9smITnJf+YyDI}>q9 z&wu}#bI8$aNqG0>d|l`nEKf^YsV@?^)#i%Znbqt=9L8x^bVAhhh(l_Um|})F00T&5 zO11Z+_g4}Ar1?8B^gD@Bx;Y=dQno-Ky5G%X_IfkR*u(_bqjXVAC%geX%^F_{@lGx7 z-%-t$JROSDXI*&M}AS4X;CR{wqZ<>(m zH1tyXrP=VggXHIKxF6`^LHMPEcFT_>c&jPp64vC9W^$(bCL3sgZrrcCQ*sN{E0x@#umw~lq@xMcAFpgC2*85Q00u%oi0kI0< z$!|q8AO;r0PQSw`a;8Yke}mOeBIeoYL8iJU`Lz1f=H>FBh7pNe_*t63$3pAZZ*!m) zjjzIus%Sxw|k8Y<0H) z4YgT3bbxAHc}2gi&XFd13%fSF6fzbRI+Jq+t zm}Z0xE=3TRp16;AWPI)=&hNSl>a5QFOr$J$BL(w8(^(?sC1f6@? z{1j}=2_%2c=NxOrEpe!aXWN{lP95%37qs%?J?0r{aKZP-C~uX_>Qk&xD+Qls=?r`A zBx8#2)%dj;HAK%}+L;rUGr!a7I~;H*iCiH7FFLbvoPprGY&Gx4>FDgY_xCjpB@cHG zAQHDvqf<*(NDv6uq|4XsPw}`DM1Bm~prNv{EE1tFa(whb>0}-?B30SjHVD430i5FN7c{TP8Sq zDyQ_bDA`%@K6meq!T-RJo2D8tlFyfgu{B>mE;p*`Ft}LpZJcakc(L24=xFrJYG|vq zd(yDg{bin>FB!$>DjP3>5}9DhI%M^GLVZ5z+;?6yuP6#0dPmql0dH- z2e~LvjS>PsJL9I(z&vX0~1Om?-wd%Jyvu>Otss6AEqFG{sxNl<52=)9KWtW(cG&&~$rm5O~-MHd+*T zeI}Fv@$++zr8-WnmJ3P_0}Z)rpg~Dd{vikE4D{d6M;JkA60Pe{(6P|A2gvjZqaE)% zJdj7{`U022yqo}ct`oZ2rhPuhWO=C2z5x^K^;Rw>CdDW%Ea3x8)mdt(*a-1o(B^_W z`C|RK^kb%I5Pou}T3YB7H!gAFWkPI1C||kTA9~zECoJ4}5aB0o|~HvUYY+8E~{ zdA-acJwCRp!t5msGSbzr0^{6ku{WfN{f_K_Yib0*+;q zS#l3XHCBGH(p*MZ`GH0T4TKaALMtW)++$9DzH;-_7s#xN|JBw@NIbD>zwQ>pnUmhK z3%s;lu+8xJCXy{q(7b$}Sy&EDEWZEH`RROZ(!J8OgMpKa5uowO(eI&(FQyQ&d|-Ev z&whuy(lWvF?kQvez(St@{!7U)kWJLy*wJTmf#ws0VLU=myk65t z2cM^;MKg8Ctpn_i0FhIh+~4|pdIXQ}>ursmZuJf;&F?jXIS|f>%s4>3_f!K5E-&p& z@~yO(Eh!odO86UyrH-PL9a7^kPfbf1Y*gnbpQ-?+%o!g0wQ3K=#ZI9%kk?5?ilO)0 zIHgS5RkN@}AIJ9=6(Zp!B0Lk{U?Ic24mQN$hB(~RzUIZjU#8yxYNwBqOG^sKOG7|sZ%UmH^N-MAN*09QPQk9H%xBJgBhSp z*Im@aQ`CoRQw_P-M z_$m(iHaud#Y8(@TMfeM;s^YR`HILEeT0x&_ICyyv=Vq|Uvznk_$J-sDm*5k!n$B(n zCw|v)T(ps`1phAwvq#Q=nfu9KmG+tI1;>4(*e_GkgTDpaID zT3;s@6n``zK(`0jDvWkKtif-c?kEY}?5a+Z_wh(}YZg03@HTrftf{-;v5|?gBf-}w zc4@eR*4J%?@1|r#?&Dwh1y)!<-bY5dIA@9K z=Q0}t{83kg*|{BDXRs#-rE0S&e~#cjN0L>XpV~xA^-k&HB2cFuM~e3ZL9Y-}vxhp{ zF+NeR@7nz$Q8zZ^y}GWkLJI#)`&X@yk%E|4A_W_f*d}rvPX!jqXWVq{)@|9bkNJT zY^LWM$sgD#Bz{L)l?VNfx}O%n;D_j->XV-{Gt|3vMaFaah@#=>a|s)J_aLxt3328X z$kD6bUx>^ICHq0}9rdTj939?};ha}p;D+KYVhMV$8YB4kGa?1kE4WB~?cH)x|9WG% zv{vf0-CjmkP!%RxKnbzups6{?)U@_E(KaZCpyAd5V9cvZgLgYWUl)MrO;#i%ed)oB z1Z$YPxLm(AWt+=lOBv$l8*5jBvUbQ$-*+WQy)O$MJnNg(t16Z~Gi!W(7d<^1FV?^? zlshGnhu$NO11u>R9y_pvQR1i0iCPp9IJQ7a!H>Zs@Lf-{ZK*6Dz77FMy#@s&h%4Wqx6sNbK$TqIB;M5{FNToJwc7u zvp!lSi>I56rJF$_-x7C!-xy$hb8oNHMV~=8V7a{6$ewpbq^o}x?_T$hkPG z^isA1CzR6}SjGlOl%6lBB!SyWeIg{JIjL71gVMmPnm)T)UtdP( zsuLZ4A(V9d&yBkeq4f81!d<(FFcQk*JKN|8;eG)uacu^_d$~VDzBVcW+_M;PcD8_S zH(CaCINHbdpHa^2IXq<{QOe?riX_?NMXeDc;1k{TEZdzz57O8Pg^w-5=_~~%za)oy zsSHDBj?fm-h-Jb-K{h33*Ie?#{y1yIT^;e|M8V>rvoDuCxm-=&`=zrWHXC{q(Z$z3 z&W3^0-h5~ddtRy`J#&S+?lF2_ks)?9xuEZv<76H=^`4)jy*?ld$wU;4N&AIYpo-ko z6%H|7n+|Y(?(5m~Em_3?;>u#Ps4$?i3mg|OIpuzY@d(%b@yH4t~`bMVL}uPA(ONepnn{6v9v$2 zt3WPnHwAZ3OO?w)ZZLWF5!5H2<<`Rg>l?Iy0EdZHMKb~OmZQ+L@Si<=9^bUo3UNH| zf8&FHY^4X?Zs5H0?9Q{{g!Tu5_e&_g$)uy-GKO#@AhR?5W59`aq zJE9Y*Gi6>iZK4Kf@(3zYDf`dzyp?=O?H7HX!8Z{gpPm|~fWacQC2Yd8hOf@nPW&uC|P`~p2u^`9F`Nv z$VdluFpr@!A!4#UHI!D^daN!3;#4@=ZABbpaz>S6YLj0WDpky{~_(%KKVnaVT+wb@!sBwoxrxdU>q;j{4t|O$KcTy_O=?+Ezq5 zu#Mi0>6pR55&!Zx;3`}devuL2r&{K;sgWb1)fRlgKM@i44z7?Rreu3WipZfsNhIv= z?_EcGd>z}rB4aygw>Isw7nrXJ^jz#pME`|W5a3{X?ag=LJ;t%Vnm3BnIT#%mD*rFT zd?d)yKKpI%6B>9uv0}B5p={0QJEAiy3G$9oV_XS{xUD9ScL+3fJ-&e*Z%>z^{A!F; zD^n05?U)<@S3i{LlT*FDq&`hLPs={Wt~&ZZ_Q3rddvSST8RgGeY_lJ=__?7^Z2$2% z8Q0;xYgMBRamO|qkc)obCC@svP(as5N!je;=2m|r%%V^|?oBqGJz>tVytb5z7aK<2 z?qDPT_oux8MnoV`Z(Ut+N1;%S9{$t)<`mG%lCH{(PNjPb|Pg5`?473$A z2}h99(q}psPUn-?FRf;G2s7B*M`*VE_#HL1tf`*UHbR3DyXTLDuH*H6ayiZ6xZ4f#cU7unDaZEFbv!!dbpm9-jakXW)=1Z}C#bv0)3LWw%T;d^n2 zjDAOf2#SoW^t6Fy{8v_m;O-LDKbaLPa+jGx&aL<^6RGPvarx&E>DCdxbD`7%E6NU@J0PrAAsYbfL#^Eal^z zea8PtJ=s{=ou-3kA@*QJpv9^~H#5Tewew8in}t z!*rw86U>9_2B(A9F7E(mg+2so`qiGbj%dR5VBrF!7rZVAlGK_!j&SDq}zKz z*DjwP9v06cZMPHCSy`|FtLwJyc)oGer2?!C!QZ6+W-KFjvdvD$ZI>2)0;viuZD`qp zj@rkng_V}rhSzu9_Q`kG7Pa)@FHLib<|qfWad>fo3XemUEk<4?(SNR!Ng&@MH!$Mb z!(tn}1#Xjn3yb_BG4PDGJd@TEV3rG31OC^?DMSZ>r*5xgP50BuK5qf|ZuIZEw4L?w zU#-FERJ{$XZ>V1jcwv$O38TcuXWu*XQfyt`!Bt7v922iL30>{ZRuKh+PWRPi_V~u( z@;X+R7Mh^{T_(Bg6>RcdjExk2kJlGyRL`>6XuAL;=X%1bF}vQu>c*_v!Xd~$>cPhFyK?Q4!qHPM znf6an4-R;`qsd4A8szK!3FAk7Q&X_nUs$>lagT!hhY7Nh#>!7tUj<2!VPCBz@FR{H zX%?!NALM^%^{TDKJJo+Gj46`Y)QCkVWQ^f)Ti1#lH!emA=LxA}T%SUc{j1&UQU)EN zXWX!94S@~d`FX`_z^XHNb!_F>a`X&ExKNcuC9kX&oDR~2g>1qJJAgKW)=T3pUYHMu zAWRCcYZ7XKu`er2nj`pMBscvj!I7L%y?lv?^GHPvzITeNOKl(j7y2t8kkm)i_l?iZ zp0Tr7AxSxca?W(4p4;y3v@Oc5BSpOAOETdf(AN7^)rbwU{`ho{hBU@t8|n48xvv_u zky*X}s;dq3S|-mz-i-)WE1l_)U}lrMcDzNCz+b&^o?a%meIWWI_kRLdh}wDOu=4UNf{GD(aFdtDx|FR>HdZN-J) zj0i91g~jI|_S&kmX`P+Ii9c|Gc5}82WQ@%TZG3HgC*?g=%o|m3Krq3mFcR^~c>O;rlMdn{*+8eL$e;fv$Q}!E34LX@ z6|Ms65Rx36lA3n0p+KlO8o@XadY1^|9jG&o44uY!L;PVoChBtK$QU+$@M3IrT$}(W zWo~dvX-YCC06c?c+&I9yMZF3>Sd3!A&)24-IeBikfkRjlGl%nkA$+3~J?zx$ z+{m}`74H`7wx8qV<<+83Vhvf-Rsg@ZA?TZJJOqpD6haThI`lQM@dTgCn`Br{HXf@? zba9(3pyYgQgRW+7M1vc%T(AZ= zvLGKI0p~l6{~NoClVwRGuNdhpO?c!dw1AqHCNO;h$Ys|@joBH zHSpV;TNbXaRo{XXRW9|)g&{`vzj=EgV|s+kkC&adKzu7xX6~))j?(4a&{=(?fG?;At zy!_m;Ci_?*JI#a1?BJYEx^80P^12bEA;sj5)ykfLx)uk`07t*U`|%Q*AJ$A*u2zV2 zt{KPDJ=|a8B7y`g|L*gW;VA4@l-lJ64ML%;gqT_fDU4-CL_Q7|7%45eQ~5^x)r?&n9fJd3wUC- z4aJ~WLe{;m-M#3Ltk=Qn3J8BC)T?Nq!vsW%I-ZVB{k0=!w|(X~I95j-yvis;hvYdpYh*E#}6x*@)_XNC*JYViO zIkL?5eO?Bi>Dh8!&hIfsOs7hR@M6T)ngTEPU(Q<);VW=S;j~uu@`A>et2Z^sPG*OzO88@O$cgf5ZP}tVOsP z2Zq|PoAgqG`TPdKfaP^YOt?VY;{Qk0KZeKQKi}hUY&(se#`@Yz>zkVX`p;(kOBs87BqNWHo*?461LDleCnkdib(Jv|3L zCz4?QUFQeBN(X+ zi1EWH&ottLw3F0=?-0FP>qGc1z6KpWQ(^!+{+#fxv%DS(?x{If^M1vIo$6rB(0CWD z`H<)r>U#@|coFRLRxNj;gz$@Qygs76Fb-aCA^FL`$S`UOxhgAw*w9;xOtyeZdUyB4xOc=_K}Kd4_9{CzEobKbbquLiaEa+44D~d-Bncj+oate ztH*PBvs!@<@eI22%ggi+fdmz6QVFn_FO~gkgDCownjMNsLdHwt0|RfwYsS=&T<1$? z8%_2nCC21VpMtDmDQe>oT3z4T{4vwnVJg1jQmQOQE9cxZ2n{b#{}+gZ?-L<>4>NKr zs=qhH9;N<8ldbWde2({LuM)qD{1Jj;`8Xx~G7cCrO4 z*DelT%%^&&3s{sWo*0#Vx}V*ZG!Iye71S@KiwhX*m|(+wMfa|z*gxUhiyQq%a}&X= zH{O2dcf7|_flN8F-5{1l3d1Nvg(AllZa#6fk1--CmOw=jd2SHB9RrI6dmiR~v39#W zEMzu}TE?TLrc`<~w-^OlZ+3Teh$XR>bg9slj?hir-Yb9pd=$}#C^WcX94l=o)_$%6 zk=ZIqAy)^@=EsO?jX)qopJQ3!sgRLxPif>Pn|7jd4lA9?N zL_Zmp%Wu|xg@&Ufo!r-FmN2^)a>%ZvKR$zpu@&xT0vf)BM?a01P9F{l;1L2peY_}$ zfYyVlTvrd;skPt`OT1`^&psJBdHy+MN7VtzNpt7_11!HFAoVeFwSW>w6Z0q(wQ?{{ zM1gMG#qtz`-mF-Pt6fOoEp!{Lw*g1VHR+(o)w;Y&^JUBTjeMdp+O2jyK1z{aXah+8 z+{z?-Z%^nbZCZ#Mxt5=VjJnSPx?M@4J4qC+BfwSAF&<=#Fn>lkL*~ey8^EEt(;-_n z7))pOnqnC1)7*v_k%TyHb?=p&wAcaMjNbtVMm~GrwGCN6BK@3g3Aikgguf#{x?RNO zeAhD07@;ejy17+SQfiRe7P~2cfEP{aLY!HP1u@(G# z#kj~0;n$WI%O$X?@V&bT*wOIgH6rxcyv=QUVa0hss*lYEUYjIVT5^jVJx`Bu4PBU+ z8c1SaWuZB~hy302;3;N?{24jw+OLj_ODKi{3PB6lCdEX___bTZ)DSAJ+w%QX8Ck=h z9>>~2KBSrTH&TE8iA(*;8NWC0^KUUpLB=jMYgVpv=1JzPYCO=F%1Wn=xIEs>U*3hi zQh-*a$TWRpHMilX0#92Xmx_;>okzpaXH^rSxw!J+L^_8MbUFO)MThhsR=GlG<#&vH zF$7=6fcgg^z-F9j1@{4>Ziv@gN9xe1JU53s)bSTh%5c=ED9QZ}>Bb}Tw_--fRg8Dt z>}kvBy)^f`-{7^lwpJQbvAdeeBjvkvVJ4CTK-2Gz(>E|IhE0O!Q8K%H+yJJ42a^vc zPE8{b%~ar6iYr|Z(*}2jIyV?ymId-S>D;huYk-~vbC$gfl0mZdX8R&a^WQNc0%zuO z+Rs9H9XHz_!Awc1a{kG&q3g~qeD8*#_rbVB@b3JNBk(+b2}FOhMv#NxVR~mFx%IgU zJq(>ILFT|9F^2Tk2Uq26Jvh$ z!2JYub0{_rgeO|MieN- z)D4?=)OMwOQ;#j|HW^Xe*QcjiqM>Pnzg8`GF2ULDJRtDUC^;a^$5Bxc7p(OyT9JpB zJM+kJes*JVcI8jj^pAihNgVM&^!T_{yd4l%BV`+$>&5+ZmKvhmWHPc4*3Cg|J*=6_ zu(39uBl_t|cD9;$pqSS9>605~qNhi`-1N)M1>_noE)_S(k!AcbWyLX8f)pO@9^ zUaiAm>IcEruTF?OO=^IiNSjgJViwo`_F68Du99KPIf)6S5G-b7l&`MnT08y^bby0p z$8~PQ&2}t!Mf+d&`!DE#lkWBB9@L!kFSMJ%Q(e9d71NM^3NJAI#z2uP8kom-@x(9i ziyG^YMC6)(XM%nDfnGpsorFUHAU4GIivRf}@M^7p`W3#qDc1UeM)u(vR(GiL&8p`k ziD=QGj}kgpf3M@1SmgGA(KcRs-PJX7QPV%yX5t4E?;ZLwK7ZPdD1CLU#fkY5cqnr3 zi9d7wbN^mnj54<@jfd6y%Fb0-dUK}S^PZWSUr6;Hk^PwBDJX_2O6q@5+bYw!a~}yb z8#iX$eY=c%a5ce~tVR7Eipk!9bt66Rhpx(^{@V}i4@IG<;HFck>=anRH{&(E-lskEJ8ji=A7Ce!>ELS_ z!b`EONTYW0#{s-g22c9aEJ`9hWocUjYle3t z6CPuv$}J4wlKtJfPY+H)0b|J@Y-`7>Q}&(dfbkDRQo2#P+Om6s;2iqr?S^q~b|9vN zf5T{Ml_viRxzqjRwLfiR*Q{rESuGg+RVwN*>ml|nNkrcbe}bxY4**pqSE^h8eghXJ zlyS#dK&rH`LvIxE@P4=isSO=eAqL%(TkT-`n6DzMRR{wQv#Y5elWZKoO{2bzW-osE7Sm#xC5{tTFbEjvMP8?5UHC zF)?Aw)*p0f$g#$=GBSLgmz|v^bI;ED#0q?sp8pQ*CTc%L>$d=T`W#}LF*(&jeWlq+ z6GMJ*;s*Aq{B)8?7n;%ZY<4y>CP0LToozUiyo_ z51yVW2qUA2A3F+(dA%!5SxyaSeK*c?yNH$sM!PTrEpb4{GQArl`{%TJ8&xHLn9-p$ zyB_&Ww3xr-v6cNFHB;~zqc(rT(zMXlG?(}rc=}Pjz>GYweU7pvbN=gBswRseFeZ5X z>2c%!HnEoGP~iEq1Y6xVpTFXL#Sziy&0SfKx4g?X#-rHjR}w66PLGupeG9cij(hR^ z_3%K*@R&s}Vn9LjZEKPmX)OuLp5NKee=WIRPE7BcBSsas$~oE!Q})kP;F>fi zuCxJ_IsFT-X*iHA#zdVwPu;{R`;=2_RUnUxhM#>ZCjY#s5(@?}PQzMYGUFXOoJQS) zXc=-KCM5}C#CFK8fvoQG3?tbENu@d`jxlSkU z{wYbDc&q`rZJjaF==@Z7es&f&TI#pfmycAeiD+id8*I)ItYf1qRsG7uZrt>aBnq<^ z&_&B7)f8m#w}91@-yt(BIE4A}cVhhZ>a;tl^9NJ+VB)!uJZDTVD;q9ScA1vPO8B{Q zNQ96IbuJTBU_g(Mo+HOMIx&Yzzucz7gq0}6gpJdR`0OU5#JON8y5eVHIy5n*EwaKh z<#89s%y92TOG`U_e~%vnn}=&@v{TDDVnWbYl9wke*epxA6&qXR7$#;w&L$)j_fGqn zeli%%Di3T%8u8vqZ^7OBly8dR|0@SEpim=&p4Fo2T2S#tVf7CXT9vZp4h#<9e-#d3 zdyp~(0tdRu{7dy2ip+lg!T!-Toj>z-;^@`=aPl&2pJctzK5X0I=V~|eu=5TS_9Tvo zY7n+-l7_0@KUVTYd=?cOX>1l#Kl&T_z%cuT+u?e)=a{~SwOysn9WaI0gcvPP^G|K2 zCp(e$|8@aj7$dOlHJj)b8E0u(GR%A4-8?oNl(3sFNl|{~K14rXX|NhkvnM&TuR0@9 ze|%}5FD)sdE!;>58wlv3{?uJRh9r)5Zq22|VtepBwdX>p0*tUBH}NRfNZK=HF`_5$ zYA!0`P+|=|YsThaS0ju=p!#|CnT+jxR;RLOyj7r_a4?%Acb zqrJ_P*a&kv!PPW^L-t9tC}X%59ytV~_AaalF;XwX*uib_Hv8DgJZdN?rt%!A$-ukj zbl}d)HEt%)K;-$$7w&ts-{6g%c_$|d%0GiMh9rUUh0tk-ThfNhGxJ@J_fuX>F+Tfu zh5Ql)4j4`+qJANw3^XUSTuA2M$$=uzZGunQpFm}V{~r0@NcAk<>;KWsh;mbzu#uU< z=@YnlsQX=EMq?(n`I zw&Rxm%ZG)DL6aLx*iPzLmNH^MEi@cCv*|k{S2LhG-t<4WuZcMxJQCrlud|_pWDXj0j>!( zfJj(~*zyvsn#i>vo!!KfFEn)8!QpFG227zr#$JQ{Fo8_~j=MEX5vcYR3A}^GTc-}u zxl_~2(bp2seOO12_`$uZk}w6`eW++lj%{>e!Fy_)U5STkk$o~iOLgPU#dl*J?(R>s z9wNd;eRb|d&&*OFBtB0gs$Snlj;xxa_~Fs{dWWko10fwMyktg6yA;@UI-bGTp>>cd zC@`Ho4+WK>P*<>!vi`3?Cx&W8n=5v5#+U+ZX1foFXJ2O;0o9o?vY8ZeH4y)6?j=IVIj})}ciC_`kL7c;Lbj95xt}A0VfY6d zg73+D%`{SWzmLR@B$D_)Px4adUknpDKJ~&oB9CmRu6&f#bpL`U4XHd{G;LePLEz#v zHscBZisho=>yK6QHSW9#BhrU-ur?ka-NnvVtTxmS&+D-8 zD*D;x&+WjnO&StWT|tI56V&~+MEPJ|?(#-W7v4o0UG`*r@dzgMTs)m=vLdY>eVUk_ zAl?Bd=XXm9Dzw=qW=dJ=fF81Mye|Hdf6n({eX;c>3^KD#dcIhsckX!nS>X&awf5S* zS>asqLldl{{}SOu4|vQwPk8mcYvkb#9<3RaxCj#?p%lyUBq9B#iHGG3_;nhj=K8;+ zgcm1##2sIGdR|sf#F?`2_%B+3f6fTIubBp_RlvRq$#A2*)9~*0+L@v zZAxgqA^ll;!`5#NPYg&vo=Zxgf!KHe@KyyrRLHU%X=<0#&_Ab0_b%#pfOfXKvqu+S zQV3>|z$wZa21d+8Fs?Zpls9f1rvA$}{0EF<*dNunf4;gGt9W5MI9EKSc?gI+%;CdlM8k~O-zEK_0y1P(X>uuT^ z8mW+mhP;0$e*I&o!=Z{BJXFB90f=oKfZZLR+bmV`Yw@=6RD zcAXTO&Ao^iS;~rv;!p`&r7B?~+p6M?#oH>eoM(J*d}->wcj4XCtct_Z!>1#ZCWDYy z0@rp_yW^y_vD*!t8V1BolY^yn!^$}V$)sd0Cgn-@QEG=rr+l?m%D%Ro3|)52jVTy9 zCNS&XZ|jfmT6|0u0k{;v^O?x^5e|=^m6RCeAO9D=enCO%!{>ScpANgF1jhfOUKA)p z@fd~4&xq$+RZ|jR^;sGQY*R}iD+9$n!306IvMw~+nEV5U<6V`w=dGwW!AeIj3 zs!lE_E%qA!+xM;RN4gSy{iy@4Prz}a<}0#C;5YTU~k}R@~6YpIOGDS9LKyErcu70B!p7Xclc+o?_}CgDQBWbd>Hlj} z<*dN?|GH#Dl)!ETEdw%qJ+3olgbDDcV$aRv>FQEt3FD8LK);lSOe40{cDt)SwKTuX zdh%2;AIG<*(yGm8+>_iTCZ&#v;l^V%gbXlteZT0r6$T-wL9QO5u{LdCvC1Y$QsL~q zw*-#J?kMPU;r<6j>#2YxwFd{C8U=-b}j?6^_yzIKP& zMPydjx(lCr2K^m*+Bv5~oN*_A7ZkcSJVsbv;r+SSMbN#4%+%>}8)`(BDw*51-EE%F zdw)UBr;>WSO~O!BLvqPkbXM@ygEy>6aBmlv_T}en6Y<(6yC-bK_ zbB=_fKGz>=Jd^TWN&{JWzwwZynNs}>odBjZj1O@WzLx4TNv?9KkUn|#*vR3kG@Xlu zda^{PPy0`~mR$I_T^=+A@w>WtdRE+FzCPEBHl_XOtrQ=K;wM9MSojR^y@NI?APbn%i)|R!^mK_0JUTV;m ze$%9{W^HfDdkrBnW}5-dnkCc!+#ND4@6VW^xod7ssZdn1dJRC_KZ)wQNHy1NT3iA) zUD<5PNhVFY2IRBippeJ6jJhU8L{d_mZV?kL*obBn_E&V+`^JNYEl*i1y>@Y?yM4EJ zGhMCv4%b%Qk=Z5l04soijdPL>k~0E$poTanSZ7X2KJFrr>(OtEG~u4a|BrOxAbiNKQ!Q)|MVO{&|ad_x!>FR0Xac?w%9 z&uQPbw(0P@Heb|13##YXM%x`eGZvc9Ux_;4T)(bAJ=gf;z30jDved5`q*+qLdp=G@ zhGn1MXw;LjfCXy*CHN-E-bvGw_5?*4mBGSxe$ybni`7D98tlJZt`i}Qm?>D~3_q~7 zGop-wjyk}i51))`z>Q^%Tr`a?&AZddEaQVr-bK*`cXc-K;bXzqOHq6v9vbMfL~3EC zDMg6U0VmgQZ)*lZy{T9dj zh^CG6UmF%|rJ7;AF;rj}bDBW0=ja+(>@8tjjzK=Ad%E7jo&l|E*p@*^rmJmsRkSUXS!B{@~V?P6$09uVatpGZK^b zUc7eVotQN1Mt$To!o}Hhcw%7QoENL$odyNiOBRrV8So&+ItnqQEWkMg zkNE~Ldok6n6nrZV+Qsck8wtDC!;w0y2n{a4 zCkx0wGQqO?ITI1<#X$;>9#5C^R!AYOIa_5G9M#N(;-?+~-V%bKTM7>g))>L1; zR=k{r7%Q3Qi~&fNu7UP9?aje8#>lC5K<=A@yi8ur6O)@m!yN>9MnF4q(63j37pRr7l{Nfa*I< zyx3^bG%izv>NhoX)cCj=kS=)5aS!a-ZRagWuV_BAZ=9=&R^8Dv;>`EeU_&kb?dtqx zbvqPfs!)3QXtXs@XHlNSK=Bti8uMcW*`Z_aZhZeueoQ;%%kNYw@UQG^m4`8&kDvXd z2GQ7pPOEy!7D>iO;ACmf0^2J_gva3;x`sEfWz2_j9eM?qYv<)>oFX1grP@Lt<_~Bx zAhA#)QA*rV9Wf@XCj_Cc{Z!-;d?xl_(If*w}}@L!mFY_eH1(!9!HNLn(mwSM4~_7w&+=kTHRfH1|0r+V4pLFO|;M zQMX&lSE5&#ELcW=5RRKU4CeD6^A0+U@abg7Blzif^@oE@lC5F-x6=a$=I6XE=7%g$ z;wmWrS>_5M2+iqboJ940y_eC7_g9XfPC;c$y?I&AZ{} z*~x&UfStxl3Oy_=zgR=_(S$IGq@aOk;=~#9s+CUqZ9?dE878cAYy0nuE-d+0`gOwJ z$FqiyB&onV*hnAm-k*$OD*SGC$VR@4sVHnYY2b8*t3^lm3(ur+-VyEv^~(&EDX9LA zOKGN)iJ6|66r#U9Qq;OZ>MOv}q99yyAAqn=K-o*#jSsp+gA*d(`7y{qg&Hm;XsM$y&BLqVJY| zA((bw5QTEcZRzl=e4{EwAVU5ds!qIA8~>N-o5UazrOr(^@MZ5^vgly&qQw^FwAL^0 zZ*G|C6<2dHz>oNWn`k2cjrYaqt(l)cA}>33%18UlASI8aJBA-}TiiX_n?&H5%{iUu zxREF4ff;GT(y2MA@4&-UAbtWFJ8CFDdo>KkOcH`&%`Mn-d_2YS>ai$Pa{v8+1&m-u zCjc610)`y3_P~yq^uN3UcHB#j$chhy^?hQohOq7SDjS&819wy;JPKI`f0*+RnW;Q^ zJ10XS*I8`a_eYRs;k$`{Iu>8R?Qzjy52eK6tVST7-NtqCFPlB&f(*->8aO$HQ6W7c z0QD>X)$|H5&i!P zVJ&tjO>MFJA!po{tgPl21eh+9PY7iZ`sE*ZU%*<0ch%N3TO3cLn!s&^e%`my2@CBo z6K|wIkEccDcmsioD`*WyCrz#ShhWEJJ!*?!2KYjD5NX7vVXxE!w@m+h7 z7wM~~HDPnUz^YfI@~*Jnrr;pG&a?9t z$vX?zWjv0Jds%_Q3)c^q(!3^iXg);ul?6q8UnM(Hk3aYZV~rSo)<(mlHJ#NjOqxEp z%7NY|vSas~5-wR;1=PLIpw@IOeB{ENr!suq#6wz;J%sFI$*N z=I!M8Oi*&bLwcGUYL-@Q;z$A;d}n#LPm10-)hCHes{Zk}O2r8F$9yAG9Dc@rldigA zg^9@+x2i^7=r#j}kN9v;%6S69JjpT!)&e{+G6UJX4$ED(YpYYAGiugmXNV|fyb$yU zy;EDfcSw38;t0|a6&GeVli(9WX#WdZIxtYJFZ{mq?lWLj$=6_rpMW35$lp^ohCerz z#r~#-0mKG9^!eWU{khM5S7q7Fq&K0VH9wI|OupHVeVSdGkZf`G6dA19oQMW|kFsbx z;fiF{5q)WXTsJdp3u39ic3BeDCKH5#s@VkDY@J66FTp*y#+UMgv0$quh7Oqea zLcw1z9Q*)x7SI1Bjj@t<8o9lg3Ss#dK5FLoM3>xM(Mvwrav^vuQa5fncZ8`eE3~2y zZNttss`503m$Yi-V)TRbr-U+V*BP}mEzs_18eW%~HFpf(OuuCMy`8qXT219;Pnp-^ zgz+AKwYAyk@*lsm&(_OQ(=l~a0<*-Dl)!T+Do0R+P#7u}*A(DfE*j+VLmc$K2(^R& zHRx?b1>a7Z6;0$D3GzU9sft{tkFbS-yaFiOJjPu_ZZhB_GfMmZ2!+==$SHp?^3xZ5 zi3w(xrae74Er!GlBJuPbaSa92iuzwW<4)%XJqw+i#yhDr9d&kdO4N9Y$5jpz4jQ z3NDDzy{d9tSSzgoXXhkqJe4QWVSPX5r4YDypw3y?!1>@==a1*j9j+P6U`6cEIubZi z{V#QEu|l1X8!di!zU9f%ZRS9rewq9{bS_@~k01G(0MQ9e_7+l2-)%+qFKQ(63|f~hoQf`nmk4cJ>#SY^dkfg0Nw#V z;0fOZpaa?@()>G+8`k@q0*L1*NPI6O;K<9{?J}$O*EC`X`mP9K8mQsCyKCeDUCmL1 zHtltT^dD8sLeJnzQNlfkhKZXGRwN+5)t;%a^gj`4u;)xOmK8G65gX_b^;2HR>z!>A7@$&m%Enu5@a;YmMfW>j0i_`u z`Q)qRy4azA6Twm%4^R3stu3sF#;C;WGl3fd>gv>Z(0anZE-jrW)i%)P&zQuwCXR_s z7{7X3n?Ed+&r4EK&9s6j6HNuz*1&qqPXCjA@Pvv+Ohw<^fI5l3NJS8h5OTDVmlf`; z6v6^Ol%4U&at5}!MApd%*T2JwwHgS(-O(r0)3MAi75(MJ|3U%SJ_T=>PDXFboX|>P zVv`tha#f#K{-0&ipdpuc{r3;JH1E1z2I`q=$j{=3x5Wo7yEWfWrYpcwDIN!WhpwfD z3p|n8-7Q9*pmE5tlqC~fmp^MY8OowxNuTS`NnCFGJbq-7caC>BT)s`P`i3OaICA6u zrAWY?9SY!n{g!jAZ@~I7c&MYJ?W+AN1gzvg;~mRD&{-UIxNkrRLJn~aM`WepB8HPU zu;9dAS;Hjk%K=cmxzl!XNYUUp6o;98GyC}J-HmR@L-m&wi_UK0Xb?Xi9BK-xu#?ch~#%C1J*;SNP;+0k6(dJ`& z(>>hVu%K|4Am1q42kZXSmp1G_zm&6TM5unk&l1A3N2u{$!HaucbQ(U))%a3IwVy$ zB*gQ*mou9dXZMmnu~co#tKZPU8Q6KGk|-Pb zKz!~_Xdy6b>JHp$wBJ}?Tb&D=`l!iliwUXJDJhMzJ9!?X^a5*E@}uQhrQOT&*9 zEk#9faI6)b2|xso3HF}3(z^hnSPdO9)r7|5Ar3HUa?<#ff^Fdip;@6M$~=etKr!A zK^=dq{T;gHUKEmc40+?0&XB80$N+&svI0FfBwG@3V~Af+}}won<+ZVF_g}igwXqp|(_D z5T~}D5`OMK>UXQqms#LWT}Bi>zhcQbbD_gv9eOEhj?QRrA#DT|B5z90F!xW0TQV~opZV2(rc z%#S~*)GPUur2hENI~R~39p$3jKh<%+>EQc@ulWHAfT+MBd<}^Cw(9Z{yE-j5{D(GM<$cSMqrZT+`J+xa|tw4?s#t~#%9%jA<%t*di zOLmJ4EtI21X=Vt&dN^*@Tevz>lETC0P3|=m zv|A89c3{fUT`6Lzp@bhR6z^WD*YpQio0Kvt{g0x7#=Fd)UdW)IeMtGg`d!Pug)e z9Ye`2pdXG0bf0mRNJ=%c{#X5^p+g!DeiUA)V~x>v@dw5T;f-FXq@veUU^v$ZyEk)r zR3?dNDfZ~8aJY7{YwFD{>5@AQL2Jj#mrvNj2bVdX14vf}fof^;lgw=%P6cUy(4ka( zLHW-uv{-xK@hz6|MYU*LRGeu}MdnG4?M&0nPZ#0pzeQi078hvm&TE^`@q9eLROR}4 zwLLlxyCxQ`ounKOLk?n>kcHj9={@E@-s^v3n$*7GRr(Hw z(Y^IlPMSF_smtQHcOm@O4NZ)2^i|E#j3oY_;2ojW2g{tRRh|w^^t?INLs! zy&Wn)YUuj$#f=vJJ0~1l+XyqoA}`8Z;T~Arkc=@10LBhX2&LDp$6Z+B_R>p02~#=0pQ?!5i$1Va0l)6WFB&uY73Yc)yx|)`azLW0uM5h80$WK|ZM_gGn+1xe3qvN?_G9G=R*1jRE&W_Ux>2Tspw_ zVT|2b;EewT$NWgEer2s;Ot&NXWM#tL4K${u%(s2oWX@S!^gXjS;(4+=_0OaFaJc%q zx$d=?U?0bIA*iZxVXQQb$)y9NgynU%k51*^L8k%jl*XpT5c5ws`hgr+(!e<9Fz3Al zVabs4?{CuN5F^)OGZ&M{6YMrT3Z7h8EFb0TRBF{t%{p77Q~88?RnZRt8XTJRzlS8s zb6TT7GEk>SV@G#rG^B}O0eY$0r|dNu(KV)x`0)@WFHUSHOEok+BCh7CdU}%r=41FB zmPfIHgIH;%;99{!1jp#v(HvRU^xOLV(0MN|IB~wGL=27-Y180_($LK4D*(@Z{E&yJ z33$^9A<0R{j3|dt4E1^$@k&Q_R%(ZbL)RPdZC^u8b@3|t=;OYQ;T%D7;$_lK_DGVs z%5{C=L4D@iTld5+jGE7gDLcj!ri@SIOK`yw;}<8}7DaJhu>)U!YkXUrADx6(lhKCT zT~_F*{?!;@VXL4-&OH)I_yY7f=F9!Cpqf`a>162Rc_6=; zLHot;jW(mji=HqFRn@?!TCo5uLEPLn?$T}{b$i7#ZtZg;75alKyGl7??Ft;#LPnJ4gJq0d zdAVn1^SPH~eE0FWqzu+9V3w}%WUjtmSP125bJ5yjtU zBZofLe;NIkSWYZ??l}dLAjbIKJ1X!R-Qeh)=-KpWUd2uIvDOmfH*|6Tp1|=sgvs~ zoz}ZXpN<)d&vEI5bNcL?>2T`UQP>c|HV_JTz%R|bQ}^B<9^6-0s7M=0(QxUKNVlz| zG$uv4b^9q?4RO^qYL#;(q=>3Y?)$e)6lc(E_gKU7IEY0yysB_OsV;YDnvw)=VC7bYykPX0WOVQvM#%PggD2*OH74J#+cW;(x} z*2zcWo|O?!i+sg`rOvHo z!3crd<)v9EO5~j;aNR>>3*+qs*AmYtn!FEomm6NtXOs0t-^Pnmph!Qs#S0%VeTJI) zGLuWU&EBMs21mpC;507<(dr`CSBrxX!*lB}0Fy~!=5zT?Mb&$!uaCAP^Oz`DN$K+~ zI$H2$UQUh_(aeMwG5fGtv^5)of3wav1-Ua4xQ?1KuhSrOe(KfMNbRjkhhszfsZdDz zeobj*+O(e1>VI+)6xLD+|f` zi90`|$fc#($ll5hyS^5|-jY74@iKigdKl;)n_qM|_?$Ss7h3qAY###(7Y6GDn)k)e z6SP0G2pxj65$@KOv(%Il-Oyfb+*vY$k6BzBq%JUZmK0|+xk9kkt3g)ds;o@%HV(<{ zscJO2I3lTMh!p&bA1QtH@5H-yGz8y;n@vGIyE8x=@q>M{9Rfnj`%hA(%Rmskz7Ii2 zB;2+aCc}^3FN3bC4b`Rf6Y01t(@(jVO>=~M!`ONa+Qq5k0BtKm=mR8Y$8~y;p|v0s z#kBH!iWA6yG}&8hPU>HQ+Y}u%5L)o)3SLLB8;|Q?`m!1pt@}?N*!!C@s5`@pDTfsg z=L>iT&+M*vLaySViLprTWG_1LszZwwD@GEQr4;kY*DuI$mN)cO%*;eQm4R17_=zOG z@az1|`NYZxE-M=9sfVK-nM!TITc7d0>(NnT0pY3ZupM^D`*)t51YUEPMCk#GCZ@}r zav}?ZP&pN(@J)xM!*48j~_siD05gH`lnyRD4Z3fz> zO49Jy4&#DGxaBdBhp>p}32~<QoR(19esAP{a0R4 zVZ8DpzE7u@qbefl(k6A*jXI-=3Gsz1XH{n%o);^D8*fq!TeFS&Eas!Fo?~!<)I#oBqybcd?uJun^ef`9KSwR@w!8Gd zn$^1dwz~WNwD2Whda&RbuGoD7`Uf`RhFtKzSuU#_$X6e4dKw9`7?D@~BNKqSk`OW^ zzHidcf8ceKybrGJ;m2|VTG*aEDAri5;J&RFd@X{1ox`TTlR?bQLirsx_`;u@14A(L0 zQ|0;x_rQZ{+WVb_&p)h!_Jrv*z~|`@^l_n75C`;#Qk6C+SsR7rQwc5g3hbQEL*xlA zv^BM;z_HG+z-uoBO1N=AncUM|T^)(P+TzQwOYQ9WyntfAl|knu5)Ov)#cG@D_@64r z&MPy7fx<~r<-}Zm@1mwAR5$jU6^tm~6?ne|Wc;V8#5mL)J-!bEX3$s!&W96bjl41g z;0^BgIy0Ys5Fq=tDPu`JWDcPD(`w!mm)Xsp@=j5u@7CQ&y@v-l0ao27rqH93ckx>Q*v^4WMrEb1D>LK;?Pc=7Zb*1sIAo*8|tTP*?#bO z6CEZBFMsgSC{g!q7>~ixASp@_ZvMx9S7obfu&R+Xkd2LRSu{8El&sb1#GXvI#Ut0m z=Q`Yu4JS%^h1H5j3p{%Z21lL;+F@>harhUkB^Z)Bz;w_Dn=T=4Q)|n2h0Hf?&H=~W zZ*c*);^apc4_B0i7k;)VzQOvD*NMg7&vM31R5d?Pu3QIB$^Ub3?u6bf$+}P@Lu`k(96{?gYke;hpUbB8(QJMlH+^B#QQ>4FwJQP8 zk58vG(y(lsL?YkxUHxCw@G%1?o`VB>95$-PwBLUAa3PLsW`XC04Ic0ih|ii;U3f#$vOT%oZH^kEaTue=j&wqLgOYtYuxG#1xp1XwHTlO4QxlMb{ULtO% zR)YEk>Ikr!ckS`)zIgOr2wu1i{1|4#|JTnO5MZ#jZ$+2lnQ+s^A*_Hq?>QpRgA04i z0xaqwzPO6x@P=dCxL@xax@+3*t4kCzy@R41H`>m^H&2MXxKCJu_iIQY@55`H$g8Z(MkpZ!uY=#s58W7jmFwqc}0}>#z_O`+>%}dm~L`Z?|u*GM;c>pqE9&9%7h6hd{c8Q0C_w$5;m1QMU5Dl0AZ6TktcWkQWcotwfD^& z40wxGR8o-jJL|^C3$UFdlW>oT$LsKZoFp+Sq`kOLY&KG`WPNYyrVVYw2ASEQe8}g8%cO47&p~#s z)7Gm}lQ%yn0wlH<-`rkM-r6soxo+Yt^pwt;*r0Jb4}^I*1Fu2K@jO0dhW8X$b1@JRNW|Js5)(pdw!XQ~k?<9>vzK025{d*()$;IE-ZPs1klalNR~|+_cb=m6!#< z^l8#Z$6+>O^2bl8$e`c~v!|LzeoBcof6{8Z5ls?_c6G)Tk+H&Ibl75j28rvKxQcPV z5EDU&c9ug>%U zBI2lDh2J?au>3SQInqW$6cIoe0-(R%#q|WEaMZt2GzvPCFiAS!ASd^7=2u<`WM>!M z!R|{1DbqQk95b8gO0-L!52q05a-N}|yA&}odDs^Lev*4&DM{iig0l|WSOu~($0Fd5 zZ~Bk58ZTOI_DS9{GpoiytRLs+h1FK za%4naM+ZL=UcBNQ1@6U2Vz~YxCP@vG3YK$4nC?ld{kP(f*ZI0nVbIpVl~=3d#_W3P zKo1h1JGUwlGjxkk#Q0pLe(znd?PqGB+U~|9iXEG!Ozh3_(J-C3cREV*9TKyOO;op_ z_kPSM@tcP#H1qZ&jE2CA*{VoWfA{-K zL?*Amhf4ec&B#$+w-qZRMGB**UDJpp@Ot1LVo)#4l)Y77*av^-BL(3KI`p=60dU29RX47c+aNRhpM%i z`?tmi(qIRRgG>Md*sIPCgWS^umBV>Ux{TW099@C$kc(HSFmOmkwjOi?}j zK_3pK*Yrf8XP6Pl>tQRQHv|G@mJYCWu&p~kJ_671j-bq1)N?o>h|8#Di;6{&yWl&L}xbn}w3=b%$dy;@Up z$&_@~*h>op*=^e~KO4t=pApx6t&{RBzB;~FrPblY{Ceq>Pt>^(FZe;GcyQv*%ccAJW72HH?b%joYXZ^#ga-Rm z!E1hM2sBcY$T?oST;kb@l+FJ(=xw6_?ma54<45k2$*7UInkD>fl3NkdNP&*q;HIa~Y*Q)Q_B4f^qkS zKqX}x2iKl)Qr27@izT^Z+Ltz}&1|Mk z83tUeo>sDeD=q0rY(8|Dt|{V_zgO6vF8B9C3kp!h`-!x8NfPAkXuSst2ka`&$X1|i z*$_ne(Z3WAFj}@m!Hi9++Del=aCBYpl=$kTB#4KAmqX%7z%u z15fhITR4A`a1u`m0N_>|+cniM(Jr2#R7N+EATHx#NHyc^K{1FCp0!~HTniH^nsva? z5=Lh(2m}cX`!-5SkL=$4u_`;TvOe&K0CEP|*18YA!v6I&XIED(8d>=W zQR*jHWMPp!)b>q=qg2oY4i4V0y+7srCa-aXlakDpDMW`|X1b8TIHNpKRF}p4Enqy| zx9>(s{v^C7k`faMPGQf^GICC^8p``No9$Kgun#H&n^6_Q`|qnxMINN!J}lBrrM3oujV-G#|11j;`CU!ZhW?6C zK9v;wE=8PNII$&y+vRn?zJ%jKD@XR=Xok}2xG*lF@32AkX`C1nrrQ6?3f0M^f4i=? zE@Lhjt&|oENCQWmZp?NL`Tlw(HewVgoUW9-1qxTn)uDh-`YMz8vgFeJhvAbO9V*+& zI-ueo92Y5s1!{)+8g|Ue`)B}dryeM~VYJS)|0u-<>f?tBr6R3via*hUlJbCsOmx2dEwXGU zNq%J9hvFe3gBbN^uMIb`l58=$>07u_#q(BAT@F*XGj8U1P^KPRl2pWjXi z2XIK4D+_A1$(k0y8J&+4~D_iR`X>8lUG-E5v(5TZO ze(aK@m3#CYc`%j6AOeA_ec<~*-bN;_PTyS_En5dIPR~y6o(R&SQK(~4LPT;bXU0R{ z2^Dwk<#02N?Jy>deaJ)f?u@NSQsrtsE0O|8kSGMGkGq$6=zXz(!|d@}%We6}avLX| z|2XH&*~uT#WY!``ZI#?!_Ue86XY=G3JWBZ!z5g`Vc=M__k@O?nc1b8!?*AAQtcGwC z;0pcj#oBqDXqFwq1ko!*s!IYVICu1y4JF>(%{wDGAM=`LZ_r;&ZuaKP0e_!LBCd$8 zJEEITgY|03TgpJhuwDumh`+cExEBjk|FmKAxqlr}DI@j=aqt;Oa^KTc+c z@OnIG*cNARF!TOFXR@9fQsk$yJzt@9DZ*!a_gEIO{JEUnc3v+H_snLcg>4 zQ#_hVyUD0*Z+Mh-0b;}Sty)Or{3z2WaS2xF5h$0NIAj)WRHMnbwkGJHtc=NxFT70{ zEe@>>ioMk!8QfVPhv#A}7ztx#`)B3(vCXlX8{zMSuQ?2+*&@O|XGx>V2ZUU%=e)mm zRQqjJe6?CxyA1Y|(~)E93r2i_9F)=e8wGJcE@E>2e-;29Mx+$xb-u8RzppJeT}g5A zKZk5j5b1lYAL`55vEm|9kZSD;ZX#Sae$}!KQ8pqAj?C3rSD(GhuLo-buRHo^)_Ak) z+aY8z1OC12f>Ev}@zXW=p{?(h{U#12(=y#7->u20BLIGHK8M=mV*bPjdY@@kC|t@` zrK&KYMTjrmmF^)qJsgd^58_Y$$~zWIf$GTS?8GeTL>~H%)mF^*{ACcs1x<1cC&6_SCZl;AP zR3&gFep#Kkd>WzlHcp>5@MwGtAm7vL_}-OPDF^!#{eR&^3H1Nq1wWOo8sjv0{we!k z{h5RX$c)!rrBlfj@cqpm>RrjLS3GIetXKF49-O5@Rpj+uAd9OHdxBbjCf9A^{wbmU z0SCzxP0pzbcSjfhKDf`)=gJ@^=pd5wI}Zk zGvQa~nIm^))yV-$j>-jBlZzS=ke4I*q091FL46{L$e&B9#5}}n-BtOA4U}l~Y z^(-oX0vmtsIlPXOD&O-6AvufH{V5V?$}9!nHhyr2ET3G{%g^n-irQzY@5;eOIiHKi zajz^G*`~G?`YbFA-aSfmfAt8d9!9?DS1q|#H=st2ad*L6ZjkwfE?KaMbZP8Yo?ant zYlxes0}F?Fj7xd(6<#1QD*w4SNy&T!=7~l4*6Wum+EP$#wy^6i?gj{{oH#Vc*AE>?a8ZRXF|AZ>X_vEzt}x*yLFL!p7Sy%vtPcFk+{&TWy5LS%_y z+01YkR`z_*?#6E3MW0U#-d86z&?CIgG4rm;bbUKBIjuUEjvez%bpH$yED0IUb~YM= zK)O=s=|oxMH}+z8xH^@A_l3>`%;oBZ;r%VL3{iz0O0*ou^Ul8$B130w2Jn$6=J}Kw zw^yqLRmU2TdHp163)7;kALpNQ#?NAgcQB2{`M*%7Uiyh#o;uo{93Gy|9ybBPKjwT6 zlX%6WV61|bQk$svK0RH2T>cG5x9hIQ0-IV^#&(A-5JJ6A9xj#i)E)s}hO*t7eRhAg z^l(nFzPPp#<9t+7`~CZOyx76eeHki_CS>QZlSr?CD|aPj)tBc3j3@uDkdTnPbCuW) zbPnGmU2Y!0kSKxemjbrW|f>$V(Zpkt;o zQLk9^)6+NrJ{7ur2M_e0%65k|i@TeTx4pU}Qs ziFbJ{)n#b2&6MbtU7hnyLxFC&K_KkL>T+=G*X;VuX^V1=K5)Zzp#bCK!tX3G_c|%p<===X*}YrAcbrl_Aza-^qBm)u z!auWYE>JK~?B>6$u6VsH6ezV1%t&q)313z^&;@Sc#X->K>}?VLyXc6cf+g9&e}0|q z?ID)#B);{^bIun)i<@4y0K1*@3)BjwzNnSZGE9Z08iO)AM*%? zNtAuEOU1Mq$8^+3AWPemgM>!#JWhFI@0DQg3F5pPP9D{TlXhmNikNK1vFGcPFSaj- zJ84S^*A*V;SM@HjmS(sYq{c_)VyM$Dmcb;Ap=W!)M`Cb54Ky5HI zA2O4Y;9F6G6-%&9xKosDvCa&lUOBw43<3TC4AhDKBzf9Qp5xoF0Pw~J>5R3I{o)>_ zL-E%}wMVd;mLBw@y7PB5)6@FWG%x42p}m{4;MJJ13gj_@OalMDv)1y_ z)L2mAq8zSg=3npJ;5QVer%f1<<3gFiiV2CIBBTQn&OloIn-fJkF7Yz6)?8{|MjrOP zzcl?DQ)VXu-e~iKZn~dXit#Xkb~55-PFMk#UT#YpNl#Bf(dZ&&^!%qRQ;d3c_35WB zuAOfEvE_z3UoT#Hj;6+?v3*56MvYMBU7&ZIE*msu;xqaS9Vi)zA9+Kcv{3*}3hAt^ zRZ-DG{@S0}G_H{-qi0Lh#)n;4)$Fzd`^R)`WTo+qfA=J1?^;ARIdJQ;vKo*~ zT6`l={2~5LF$s}J;x13zG&70WFQi zuv~EHr)xq&Vi&IM0I{Y!g|t4~dUp>q>nJ_LLJ}pNp3%W)1ov|tMl(r&%Azk?2euT#V2Y*J-O7!(ut0!qn;_7?uzOl-{T#32jjxJ!yH58u-h2W^@6B9&WnGIQ7ib;BPbs+aSY{R_#ARX> zwOK4wuL#9dQ}m$0e56$^k=FYF*Fq0WhL9#tzfM2TY)|yR(F%CVXMHR|@eO5J&Hcki z>~v5tYjX97;OTbp9Q?b%j=|mQWg58fZ#4&>5a|DTL%``q9fMHS`2%NpYNq!8?l~w< z9E#T3yd2Tx#)f96+EK+TR&L8IYF-C!E;IEdOPCaR%NVkhZR(08vMJ@&?-aSrg!vi{#X?lbaH9v6k-CjRNIre!m9zG~fPvqogID-r`>?l&k zFl9xur=(LDf)nf?6~r|?=HXx5RCR{$yF{}`;XZ*RYUM_5Z2e%gL1lFXy3)2$qXPR( z@+A{O0qsScD{%_t^CwM8-9|5=3VoOla^}cs$XyR=&34UtGmy4EH45q96HCJBgAXJ% zg5NeXnFltB1OHT9Ad+Ri-rK2&YZp{C?d>FqTq@p@6A z7@-D}4ngTJj~HKQ-;<{e-p%#zn_)w55@IM>*Nh2TjP2T$5<$JLC@3H<;=FBaemnT> zazXT>p7NQ>Wg}5!IkQN2y>{TdpbM zH${=H3nrSme={9S;E4n@H%N$AodE3%WJ;FL(p$KKCV`9J(ZrqU(nr;gxalqHlH-ox zs2Gz*EF1PqOKa{EXtTA7%f$sW7szl>HrNC0@i5OAeu7`({#q$=lSS1E4p&W~;3^LM z)I)&iQ)=(WHt}VAT6W!COr3=%*uzb6p`#D5Z6Nz?07>?C;<}2|sF7IanT; z|2=_9WJn!1n`|JM_K~_5ldtubyS2Ge%eK^F%2GhBQx|#6@maF$~Q2O zY+X!x6G?YU-q`txT_ZF>1YR&BX%7Kh*xhP(&=S(?u%?$qf;^avZ)e=2IIF|%p~ZQQCYY9n6m`N`<53Gw5r)6gtUWYq zeU!rj+DQV!RFC+Z?LPt46@H{C%Zb-)dv?ju|B$Mbbc^A8y_hKFtF1r?-%s9Ud-Q`? z?UR?xeDrhV&G%XESN-AfUp2$34OjC#=~-gL|BHiky6b*PL%(voUFo&@&DrShT5hP- z#Ust%nQ6R+kL!=W{@Ht=g#;_KJd%a+UqtfL%tvQY0bWMVnPfn$={bQ+FOP}RQO2K2 z-BuyD+H`3-OL)HZO!BTvy8D1a^kLcf``m`#YXTuk&*qEB;d0E^`bgY1kHUO z(BEzh=5tw9oi0-wReiiRmwq@Ixz^Tj%OjrG<@xq(Y{hS;?q4}Q!W&0q&yiK!VoL-& z?Mvr8(74XA%{uN3&TR#*Y`s1&A5Ao3#9)Xpp*)HETR(*9o@K({_&X~~8mj^64 zw?dc**X3M5Y}?}@9V*ZOB8~v$OJci1nrZBLD-bnVp-0~y3(h%~I9|5QI=9{ex|ts% zpi=os$R4k*T`2~o-c>Yc>ILbu8-+2AZ9B=>QCB#9>U5;xIlOB#Vs2_9-?3oSf+ zPUHm3i%Y*2=Nb@*Z<;+CpXq68uxT69(=PM`;9n%>?|sUcGL=SVVM>5HSo^ww8t1i@#=g>q6<~!E=&G^Y|go{1Y|c8x$AFL6S{DHvt{OMLET_=v4~* zlG=|DqK@OzN4g!2S_Hw`&)6f2f(0B+OkuxbwD6?}|9kf@CnG^e4rpw@;g!8|zvcvb zD{>AXNxGkI9@PFdNH379qZ7C*$QD7H`R}*~0|sv#gHyzne=-4g^3LY+&YnO)EDwKv zJ>iq5t0cNUku+|Y!#uFI!?Wd!dlX*~>MI_v>bIX<;P81#TDgtFNRa*qG$>$2Lh^RF z=B-6JhEkoJKT-l*nuZZuzla$$X8P;(Wh%*HCR6mqYMfqO$AE)E?_0zJnNk(9SJr>M z>jSC4IF_iR{}zcbl3&7n+Dfov-X#34LMTt^$6Qek z@;aZ*z6E8-<+4ea1FxSBe(GE`ZE>K3!rl%Kwkq}hKK@i(J}GH7Qn+NaIGUF$T(7Kw ztpJ_2f~8(A#H{&5885;hVZRUh4*Mni&uQR-E_oi63(6i zUms}bKaf5zH;T%G(Hs;4yScU7+o6zd;sd%lK}?fG#e;MnVVfMW)K_fa!iR$2P(t^V zod=?Zqom0=B}EGlG_z}dX1TyaBUSFcjee|NvaDxE*x?SmW4xj}aIP}3@4=R*H`*+Ra8D_n($eyfv<^YgQFd-%2LRf`r- zG=>ytV6zsXL6Xcr)+Yd_Y&hlp-ZuNDMPtS!E$xgP#f>y)roxT|bk2CV%W*=PHeq%R zzb^=&#~R+rt?eKilSi6IfI($`4*i`>1Nrf6*wpnI>9n&obmZ@RSdD@2Rmqc8v%}%w$(s!qG36+8LU)rq?49Ux$ye^R<&kDF_*!=F<4sdeb8AjRr1kS!c zj=q6lr_=CUtBZ?Iu|R&KoWHR}oNJJ?xxfu5G#~cxG{7$X#@}yOyc)R-S1`)HBSkU}A%%xeSSVC~VS;<77g5Tv$=knA_(l-2xmx$Nx zm1;=brmLAqS-lo27M|55={wg<-biuFsEpabmcHG`aUF>J9{Ld>H-E|k3eU6isF$b4 zL7JGH@)gNjXThh6crT~6y)V0jUNg|b00MUdDy0Dmxmv< zDpW5XDih@z(WY^rXN%C*Wm~heGf%bZqQ3K@Ch+w8;Dz4PLy~NjrUyTku58a3-J6u2 z;*8`HFMhN^`j3{!qO2@<_I)WMl5$p{m5C^^m|ufJsxtjI zqk0P?Y={R_>y?}jKVixZCP%q*3??0Gleg`$(de6cy?FOYV|ZS(Wo`$%q>4E?2yn$4 z0JK?PZ_};o%Z6C$b5*`Tug9`4Zc8xCe`jz-eQg!5e$k~=@Ed$Mb&FEnd`dK$$ep5Q zgR)~#Uwc6gd)C{x)2%-$1-hv;YT;^LHHGN(cl72v<@j#jtE`iHwB*0}=p$1@@2p-=?w?5vrl_4P{#ZKBM*#Pngm6 z8S2Y??ad zi`sCzFcC_H5aPJodbZuoaVL>W164F^p8Ro~I_4a7L`Z_Fq^#nze*P43Uo(XswNUzr z37(3L+!C&cEI&(BMA+Brwu%oEz!e`;FvFxDhmfLOsV>Qi{>!Uby;6r>S3o8?J53FM zQau6t6I$N}DiVx-`|H@M( zH6n6haOwM!Q8hC=H@{Ptj^xC?@oK`3{mu=0$f3V|!;Dk9=-mJc+t&ve^tmN922x3+ zD#Q?7W^F+OS;`A+JhaA!n+;rPh;{yTX%VpssuMSYn_L)hiddGGg2);@g7>E_dwT8? z5y+8Sz|(d-?1)u|LB1^}{TW)5Y)H-SUC%Qbeo0kGi%pc>BA&ZK`4zZD_s5Z=)$mKt zEz;}ucr)YiM;4MqrEanu|IzM1^!~ZpbMVS~V4B2j}6H; zYUP7R21SFyt@c!8?2iLlw+A%Zi6~tG>o07-XC{Q;V>!l8@ev7`pOJvCm($-=l zqUNd@dZIE#m43co_A;%L0gwl-wtM`rJMGiCjQ7;q%_BWX-Sjnx&nW6u?e%Sz;-k`% zrZiw&yKr_lG(tU@Y&p+U?Rn^#hqUWU z<~OBtQ|Px>ItPLFAeW%Ja6=}|@*I}00Lb4MP-{#_tILBw1s_+Q(3R}@q1{uxMxDs8 zGiut$mV)DDY;b=7s=OninMbTNLp$fM+4PNo68lYwj}O7}EfrXSitZ^yAOFiWzDpIz zC*fp+!*7g2(pFq^e<1u@_@<={=0jlzV88(xFd@r;;f(a)&a}`YR_Rn$ABA0IuJ!oe z3YIAwFr2RM*9?q!mNlM#E*#^aHe||pBA;@EFSw4BVDV)q-L>HqtP>nz22+0@T zN(DxG5}oB!gvGEbeC1g5L?!<*r9q>d796%Zy~Ytdr^o5uaBpb(J_ zVP*YUAGginTLRBPXD^exfw^?uWvPhZI|I22gPu7wh{Lezd~TL^NYbVnqt53c+eYIX z{alJf#dayTnEXKZpG}{;%udxDyVn-~dXC%vJfGV}YCr*Ei+xf(If`2EPxM`s&As2S zUAYsDq6l>=|GuYfVOw*C3>%2~rvVzAq2^YiH28v&{<>F7b7)qrj^mH}G~d z!AZ@qL}971$S&CnzoyBS4OmAApVZ@_>33NxTn+IG+skU>lU=SENMn7J zn49k%4gIab0T1mk8H+{3AMN$|cTxE4hrlVn%RFSti*31<7ALuP9M1L7mr0SSV*VTPkk21fgo@Q%^V4EUgH-&QP*pku9;d*`45qd7tNNZ>Vp ziU@s!$t&l65g8^BK=t|(R6SPa3Y9v=07!6z{>tROBzvt-``}$u4bRb`TTge=7-eYV z{UFK|-t8tC2-lTzeh_}21FVBu?iv0gUjXf_=k>BZF*)%ynB4@ZqhgyW$^1>#AxJ zeD@I8D&W#8zEx@xVm=+YBY>rDB%%(k&2$S6%-VA_foq<1s~NqyV;1hR8Q)HzmblDB z#H7TqH>(hcZR_VdJ>{fS8G)M{6et=>sw}E(f1h%ezQ|Du-H}UQk5oHM1(C~b1VqCL zKd_R6(_sqCoSY;499fTUL0l2co!W<6$_2(Nmx#9?yuD0T-JL*C3=*<5rT z%9ImpnKtHlUv`dLi-!7xXocEnfbqeH10OQ&38feh*@6pgI{`T%FKV0|J?seZRCR@x zN8T)bl?HAH%?B_VY3xw;Nv(Wo^68t&cnioLsAuUwV`qPzd*QM*EJhggBJ^v^YEgUY zI1$)iZ(!wq))S@I3hviaX=L$|_YoZHK3&rHdUO3%*qtrQzkQ85Ub5U`2h}r-J02)tom#Wk~BQ+Wcx55?z8Qh$h(!(=d9mWJLZ5XS+I5mOZ-&) zCg^3g`&nsXDA>nRwDs}Sz%qr8T?l7dC!lDfUXdW(6isVK@ThGyI$xUoWk_ryK}2IP zLeIg2MD+&TSDzvK%O@A>eKN%=D|wL)zuFqLlQCnM?7k*7*XuKar)|XjygzV4KV-qJke%_dNwxn&H;TYdsDcIO1M4v63?P%KN4eu_i2yZam~&6 z*U4t?&_v-i0&}_<@w~xHOu`-dhU@6P*D|#E6EAus0n2N4XjJo(+NA>b2ov}C@OHxd z9i0x2l?ZM?J8Idt^7mG?0b{0d#%O&0C^{*wa^BSRr1K~}HC5Xlqxx2aj=|jtA1G5q z)zw@CjmW5GY&F|0cde~=!{7n^qhgtENsV#X&;L<{kV3R507dVdUSbJ99)OX1=ux02 z0XoJ+o$TL6THaP7lD6MA>4YCtcjvL5KW&F+a*dEIlbAV<^n{UgEBro$fr6epUefsa zXGddZ&Z_-bR-9wv^vO-g_r;UuBX>N1F*9poR9Y~MYo-gTgfHVqy&4S&%wbiq^B`e-{xs$FS0YBD4frT!Ovx1oKQ3f;C>GNRRG&+13 zYd#$gx+H1dG{>-5+-bx^U54*iDQCGRBWPi6ZDnD0(Uy~_XP8PVt*pMVF{=1e5IdaM zGc8D~L~|SNDm%6v=~p8cKb9UC-Dfo`3sZ&c<|K(F=_{SaJ0*4i;gneT;=7PP6wst~ zFbH2ef3^I38dflCyKw&uEXrPtJ_r0}zu42fzDyc%7Z!UnG8pipQQ0NFhGygme{MR7 zn<=Q(8q`Rx)X(Y8v`V_dpoV0zoi30Q5Nt$D1phx};_8H%JQe~JxCEk3drTp5 zQ>z2${-`!?(dW>}5`{ru0O+5~C)V=GM@8WS9IFf5rHa}*gvs_IZQVJYJ{uQac%{64 ze%?9IpZXvN$IoEJS)9QtVFyrg7@EKkJs6Z$_VjI!y1;Sv zkPFYRtDI|dW!%Fd#q0LBvZqU!fJRMAern=>x>!Y67*U?O@SFXMHtvD~qklS*ND6=% zKT+ZbdR6qVyL~_{R_v7*JC|N(4c%otNprh!HvTC~yG}7oH1iNEL)Ns=C#&sIndF2P zylQPOE+KqW8LSqAYBg%=t(Q!!j*Jxg62>I;9A)bsH!%>q7?04&)g$&OKcFs4`9)*{ zoO`C7@@{*o(dTl7GAZsotN?AKb$tg)9N*svLfCeDUhMc_Qw#)HBulhnZ{CNrjr?5< z;on$2Y>DC!tJw0&VlW82VZq(!^+IV5nl&u|YVj3$af$esAY!Bs6UPj3zU_Ql zf>jES>GO}!q>Lp5a9TA5eNqP6bWS5T|KtSvJ4wBQ>c-j`niG)3d%uw51QKpfa-s&F zEPsu!W@PtZ4QJ^Z!TFk1zk$?^tf1QiLh=o*ExVLt-0xKt+*hVjVU&ELq-0Bwi8f~6 zd#rX)55~YF(On-PfCOdZ4vjlKznm^NdMwzSzbxzrbgvrJYsn8hU{R+*W_8!I6Q1S@ zew$LDjyuZJO@bM_;u{O#GU7My&Ky*qU!9lRtA4d*yf=IqO$ZUH4mDTI7RPNyq}_E1 zLZ~o!j;!Ukk-Qvp4n!F4T*rY^qVhg4w)fjsrLzk9)O*#X8Cb22DNn%8Y2-;*>*o%q zec#4g6g->VhYM7AM@On7bA{X+9=3yw&D2uyrS%-D0U>*NeICtc=5BcL9vrF_z;XfA zzMQEejUm9 zHZCtR*SE@N3E|x1B@MFj>Pib|O8a~WCHj)`@8CiAAKkFFx)124{M@GD7gUf8a*)`k zgowsN+AO`YdzY`xW{H|atly}b744}u?P8w&Lt zRa0Ti{kV&9zOK$#m)KvY(z;0 zHG;uq;C_pFsTb70=dss|B#-!pJ4{`FBVk@{tGH6eSDE+kzte)X^(P_=P6#Kej@UV&$@QqdU|+AZqM+>+p$&q&4$A8_ZwF2*L-Uh6=McG zf8G_5_9^gFhw16IubIf|vn_=M!?aG0GASvV_5GUmx`UVnZWHg0UN&@2jWt&Vve6&d ziLQM+sPbXwV?3c#y|!B}yOU$PT`oyxOCvHtptZrT5pp ze{02S8(`y$r^p_gBtcFPxfs4M$a>ppmF(}$-Bkz!61<-6flPD353g1ebKW}`a>wRP z!B3QY{`H{M$Kk&3u`*le@G(e9GyI~E(3WZku49F5>$~ARpAomqM$+f!46T`fVxQX> zMrP1c)RHY}y8HB6ME}OX%`4BhD<;&9%fl>xfnbcm3AWJDEd?pB1CLS%FTHfa4qUGQ zyR~9t;rChP_RKJ0aMCbratOb$tRP4#3L|^-_ohgcD%WX z(Z5n{8!)HFM@rAyh+<9B>|pD%m1;OkNGl25SD-Iys};#x3S`DSzBRm0+2iZ&ElnQdr2$ ztWqZM!Hs01E)P{Hlx;VB{>T`S4tI%&_!Q5Osh^rTXyQBdiUeKm%8|fu3H=~R`+;`?Ypk`4{FkEYKAU|}|Wl;+ctBDj7=nF36g8xd~rI0L) zI?X{0@H)!C4t_|5QX>eE;iY=Lg};wlA@8_a^`#=>PKA0MP#8o?2%33%HMdf6b|{nw zFm;_beuWq5L%s-l{%`7S8fvjcB7LpnGfzU zr&Xz8u=MXdT8VP`NIj@8c0_RCTaCW;Q$KBXwN|X<-;I_^QHW7J^#FPl1+f8bxH~Ra zD&3AghA?ZO#g<78-yOuZMn1LWbZPUx`ww*8Vr0zS$>(XI)Zp#u+?Cv9eXYlmG;3+$ zQVA27_k7h?p5JaV)%ozEj3mKg1KZTn8rXc%tC|}sS8sw(S)BeJ620N~$MoTfoL}eT zlT>g*J`@U#;a^ws<{8^#iSM}V^jCdaDqkS&l5PA2Nl)vnRC0LZ{w~n%0^5)QIpop% z8D8w0dwxZz3*x@h%bIW?W_{ZmFUskyDK3Q#c3aU}_w3s;zO1&IDKh$sZ?@U2NB7dg z4etjD-BYBg$8to2jFhAp6t;>z->(=9fq_?vTmZZ|+nKdJf!^3nqvv&pOZSxAi~6uB z{DGhQt#oAaeo^LRi~BYfAK=e1$q}93G7Nh$o>8Ct+GYLk@$nO#5Xn;(YRz@KPWxFh zuKUC+)(jVw4?43SPR0i(sZ^^5mpiX#a!2z6?YA!<$}|FnjSNi`*ku#ni@Bn|xSI}x z69T&D3|tPoUhH7S{tjS9a*8JFid_~iy7pzGZD6!R{vaklv2RjWEpqD;$T|q%>_5@UMZhth9;lv>-5|#-NAtjyhxoLL@ zHyQSaY1S)=1inf-fm*nc<{xEcO=4P~=DbYf*H0A-9h5;4U&Y%JlM`$sG%y@bzi!%8 zW|&^nyj2E?fEyC3cR~gS+_{CGGZ4in0;mi2FIs6TgXc&uOZ7 zCyHGNJx{w8tZ3W#Ke0yl_5MGmt}-gFF4^K5+}+*XT>}IQ?iSqLU4lCVZCnEcx5k~| z?(Xgq>~+4Gc{6L>U){g%J?GTfwQJWd-*}PJ_WepfRxBK|Kr_6FE072_39#W)?=|W7 z|^Hd{-v_OU&Z|%Okv&XruN+lgN?R>tjSlt3nk{m;pjs!5f=QVtDw)G z;en#ap26yJzsjvl?^BQlF+d!-POgONY>_SB5lOtygxY#hl*Ho^ z$Hn5iKlzzi-PwG5^mYNnt#!p8*S&z)+bkqNQpY6@I;-iV_vY*2 zvUL})GGoe7&Fem8_=Rp~aK6vTBdK(2vtRjRElaNUYDCVaxy~jp6ck&`Q#=@fCSB^k zqw`;WD73p6B=B8H3nZq^@22UKk8Jo`q7M~qgu`6xBr^(U^N53fm|&~4?*~Yyd|S#2 z`T1=ZIoTuR-duWPYEwg3s&Id(I||zW03l2eEt*)w>ulsO*JuA;VmBGXk#19n_vzi| z@_FiI(_?kj{^;~##)b>mTjGiyMT!DmRP~pa1tvH417ZwgD5xu#mk>ri4x4=B!@rVs&Yg`Me)J5T z?ID=^t2@kqxo?CYpb!8b)JBdP&D7aVmE)nGZ`jISJ6!v9*z1L6hXG1jzZDqme;MbY zNe%3g7y5|3KI{}Wz~IJD>W39}LJ)4)_YD5r@s{-_*O%nfDY&|#%8!iy@V0`!0kJn^ z6Torb%R{r!t&6z|c6l+>#d{{y&I^&U0%A@Ptr_je`)^X^=WkKdLmK?Al@<*I5M*c# zIl=IkRiy^7ltTnI&QU3=12A6q#|ecseb-+8jPQ34#0pWx(X zmvGOKD4~yWdJfb9)-tv)H*pFb*iXw2$T{9dv7tO&-H|x2A}_J|)1~x3^Z_qxcs3uc zeb6CzpRihee@GL)Z=41A9YL9BYElB9V_B-wT{c=21u4{@5K^MrhBdaZdeVh3eRv!- z!=fwfi6WY1hQtc<_@6}KRGC|}osRtP1(KECM>5E_W6>-8Koa7&Bb*7fY*est0(*>N z4dd?CKgsejN{%Bz4gT+0yEgATqT5$lVvwT|_6m>7&&1nvWvZr@#b~HoL$}gCPZ~C}xMn2sd9%N#IF57d?vHBU>f)_uH zVNcmXo=q%J>cadPm1Nz7`|gT&Dzi{2GPGnntuW&O&xt)foj-nr;B zAj3cl>}eCaiX=ldS5IwnHcu#23V1$~-^>+7wGmUaEWtb1xB2s>BuVcr1NmK(ekHJF z(Sq0@`ZsgeIIAhFOmr*eYyZw41L6UH5P$MyZF|HHcv)GxDm<+s!g?OuiTCrz{Zx<# zE^yiCax>HM-RKaXXM5a!wR)Q*hIcgnbs{5K#OWGiu{{@u=p+AjdQ;%*g;}+YYT$!L zW+>qFexap&$nd>(;r#L!d?uK|dGUwP^%)?>7(LKvF_Qd$`*%!k1!u}cH z2bZDuTWSo>K{Az@1>*rm@DZX%=c(6 zI~9G=oMCqIrQYMbbGm;deJ<{qZHfmGzxC$8S%N1UMML;1*oQ3)G3o>q8s80V=!pEs zEd-u<&~e)UZzszf@jsj0Q!WJv0`^==e@9&CU%Jov9x=N`Xe`8ok*7HUYm+|Ue!cgW zL;a&l{6{VPH<=TL@a206tb20N%!}irm)5`|d$L8hYGg z*)feI=NI34l7nRjuxr4FF(M#?4~evDy$23Zhp=)?p)N%9Sa> z`s(_tDH*6*G!V;Yc$U?XP`R`@`{q7vQH& zVu|^a!uviuDAJ==4yF+&;ViDHJmx}lJ{JxL?ff$9N; zX#D#cgHvx$mw*g!E@gEbjp3O5m&UFfbhBrFuPOx$*Dy&xzWb9X7jc9-A%>hN@BN&13tuTENe6ukm$6*C8k!9MEGiJ;iUrS`Zj8aU^tX+ zp{o?-LHRJ2KDl$MqAYtW{MMbrwQJ+{<))_{hc48W{N+w_qIXq8`PiF#I`JzC0z3_7 z%Q>?Ki{Vx5_~M6q+kqqz;clrR4m+E`=5E=1AZ21y&GQ+0zVBF;_es3;tkZU@E=o+W zsmjyW0AFkjOsHejmxoQ}qFE@frv8#a>JV3hDK%fh+~?%lV@(@wDsg3D?otD!UURUq zHlxMdM;^TPl;HkGJN%VY*wHp@r()u_wG6H->80N$>Unn6Uv+(=&R4doJpb10lNLSb z`plQJPFFD@l;Ak6_O4GPH$ZuKqxa@MUL2B;a!*NtWk)xTZ{gebFqPX=yE8nJF*Uiv z%9grQKioE(vl+6oVD7~bumEp{4>Tj8Z!@+3yHQXf_TjF+5z7ywzsKG5{bS()Do&7t zJvwuJH&7w=H;_jjiG=9sj!Z5!Kg79$fG|aN4_RQ+Qgxt0)E2A@@7=E7#c=3!d#%dP z_rihLjeKeMap<@XH*7nd$Z`O>4~YWi&BR^pT$wTBCivFt5$ywLQ)G*^vu}HQ-$}Q; zn4=xn{kvFD@1zR1)##y{+G#0_W*p4WqdDmt$E{CKj>3UHx`qzPebpKak>>`^R#@DQ zVpwmGqaIYMboF8=rY^lzgoJYCG!R!^wCWMvC?HFKWj&|{_tre{Uvkx-hmFN*b^S2X z4)(RkHXcAqVIxB=0-zCgZ@poaXqWzbq6TX)S2^%Qk%30wv8O+FRDLt_&LNQVdAMsV zwZ4Ab$L$wRxRYx+1xUETBir=?DgwZp%O7mMP0Dz8l&cq8Ei_+tGoHv*3u8phP9$hKq>X9@|y5t zqZ7E(_xKUFuGvQa`Xm!vhoG892gZlt%WPx?s)aTGRqij(wbl8uUOQBoNjN!l$=;?{ zwU=dqtI`s49+i$72{)G|5|6i?)1?)= zXPOuKRxAY}r3La0y*lj$=gtRc;_{|{U51|H!D5$ntg-$ZK|s(47NY33lXrsRJ{Z-K z5vp6jx*_vsaZ^D&1?P*B!l(Ec#c|&2Em#Ou>SS^}_YK`0K2+yzQCd!pL&6-8t4h}6 zpAbSCkTGK0#YyFce;=3T+2-u>LcyYS&!19u?PeBMZY~b4!%v|Sk(5QNAXVN;qVX5h;H3vaLV&f4l%FqivhNUmJ(bOaGGq<5>7C5r2g3Aur8-|T`RZ2`gG6~`fAP+T)Q^8+N077Jm|x}++BTo%N+pA) znm~LQsNGSklOILLc%*U@rth&Apa}QL{G0W~mV;Y$XTmp^C@J5NeNe|Wz*~y8Lib_G z+MSgB`pUHTX-&0w4|G4JM}gD5pBUPuxC&oPie?&CRJP0jYl2sUNGG9ruypJv{i3TE zTW-BBPIn2|9P&)$A(G+8qEJ1Z7+hx*G>N(73S;1{_3CWkvrO() z+N!xNLo{~RG}BN~#6~mXZVLd~SZ|)P!W(%#9zg_7mC9om$45>y2osh=f92;ng82h! zZ%3ZOj~qBv%X%l&EnWU=5^(&|usQVq1trYLP)~Xz=s{>896YUl0u96Rzp1cO9#th$9lV5p%y z?Ms$qP~2GH?}#k#(Z9afVX8B$rj3a1zU!=L8$zLmBz8PB3qTPCl{|zw#2wD4*J1>- zS8QZ^^C=U@G~EYwUUKJa{aPs?(`PDQlDGu{Mpq5p-jmxx90m*jxAs}M_YUXW`?DNR z70=oIr7C@;paIjD%U{8!%&9Ja$UKNbhl@{s?f5eI?in6F(P_!#?UZzI9p&UL{jnWY zO9ByX)MYmBRgQe{Ov7JS$NN462{N$|Y98OMU7kbpD^Awk7n8c79HB+wLL`m!LwWGK zyWpbF#U!6A@ZF~^q*Ly0B3W`4@v#21ZP4>vE><$h`)X{_vi>o1BR>W$cQOm2jABpm z&7Vy;eNHI6g;s6*r_F|TnAy~YWqN*JJ}62-d75{MZs%vZoPUu)e+{_)))L;}5+;1! za8=p6DRg$BiDVo0XfPj}h3dl}QS zeY=Y30_f2e9LwTs&hU2#V@E>iN+n6PT9nvGL#DN^{27ogxszC>ggs+~ZAxLP_6r2I z8kHlKDwPebdK-*Y zFz5&xaRON$gp(EYEI9m8o}bK3c$`c8`#)?>UlK3J$s`-LmKcOr=+zlBCK!g5=MSa> za(=VGke8iIsecQ1aBj5Dv z#Xj_I>Yoa`z`8o6q@Ng8l-FG;Jk2b-OrP~4JVj0l4Jt(a-pnm?d8sddmH)6%HL3-x zcG`+-oaCD3V#s`CnQ^0ieRha>p|KWKOy{^Bx$^e9Ke&I5i3P2A9yQ$6{u)S}^B$KuCmHr{(gg;iSk8()L+h&RcDoV}^XlQC zA3IvTT7$&@91Aq)8(E6l!hEQ-q~l$b5WC@hGmyy1n0A^O~mI4x>-M+1+QX!=|?Rh%x{TCWF0<0 zYax7fqt1z;NxC-6v}zBEe**F=_I_4FNS!un_+blEs9n4uSIkaYt~@+|Zg1Sf76Xx&1pYf`Jspa2OIl|tQO{<^?E`oyAU}X{|9g-|~QMenU z5D&3`S0QN5jXOm4^N?2V)MGer)s_Xo-TZW(M!PKd06-kMq8=maF$3B7f2O_Xb}u^<;33nv_MSkC z18I`qz7^f%UnXQFCDZ`TB_B@ZPn&%u^A)10)1u@j7G< zs==gP+5!a!`4la+2V>{mmo_tcNd2st+y`- zxZWBU-Q$yY12#qjpvwL`P3zz3K_FOAW+WNZ{>(q^);n-zm~!p&nd2o}yB$zbK-uE? zySoQi$RG)p4piibZ9I?z=ivbkb%{kc14<5FxQ_P-ncG@-J#DXB{Fg5zd`>6hrbCl4 zietXPP~Ba!q39h;f4l6A4QCB0Ap>$8y?j}jU|W#} z+{@=hNs|=^OxS*8l+My+=#?b=<^=+bwELA4vA)}7sMI)ESy?xMtRcz<)d$vXX@-I{ z7A+eR9ruQ}c{aUImzMToR!@~mxVPOb%D?_Y3ff2ne)L9vklWf7Ppfc= zLf}lFw`~-0GG5z@Wt(H$d53r{4`8QMed#3p;U!TPy74}-@{4OKF#VZfRB2XBDdFbh8a534UqXHGe1qF;@kyhW5Y6EgcTx^>|LTQ!Als7riIA?XPr|AQa3}C!#N3 zwS2dhw}1Wnl70o;r2j+7K~N8o3^Hg+{L(%w3cdn$NmO_PKc?I__5|<8dsp2rB{O6M zZNbK@If@YlDgY5wQN)5@gi16?jss&hT=)@<%eLH^_ufZU`P%6tX4xrymUyv)YX&4S z%ODKLnHU(s*S{81#_W#C8Hl@l`-^$`vkABDvDcd9rF`t-x=*ou;JbT(RIl$RM2sdTYiDNVg(5CJQy6Vs)>8U50KDgZU* zYw4YW2sh6_^$#iKbADKF9M0?5fb7;&-PNbaoJ9h|kJaNpM!#!3giha@5xxH81LnWu z8hovH9Pb9?y-0I>SdMXNcVT@H1c>NX@^O*^+3Hg^#eZTPGJzGfz}H7S4b9NcCeeL? zy!kCc-Agu86)!W(_ws9`YqhvaNla^N2MBIyZE)eFkIp>bCQ}!3k|%p z7~=yi&%|8r|0jR{LnW2LL-eQ2K}pkxg0A&YI8ygIgTiA=dpvwR>`0DmNo0O4`t2F* zLGt0$n~n2TiTthMazxV4t>5U{C?Qwu~X}ga;Kwid} zt+gu#nfUHtKxzB+D04iI9iLkF`?qd)3Z-oTEiAS``j?Uf5-7gX`7+ez_SO+&ZhS8K zVl{dxZR^IFyv66fL?hDg2#F-dom9h2i7P+dIfwUMb9w!3&CR`6LA9_0>iUs9=I;|> zhk;Fhos_Oox4N!&V4rP(X$ImUa@Z4hG}^s5h4B~wqxLXGA9y0vyHnh1$s z+pBfiC6Mo4`S~uF*`Gb(qgJZ>AyW_4$CxO{f7+eXGNGZe^I-YCFDg6mCx*>*4&-;nZ*Qr2Ba%B%AiZ#Xt!IB!?H;!XEs&~Zew6F?)l$g0r(hv19|+!v-?q3w%x?`1 zC41Nb!P^l1Kd3GUN!%!M!YAY;&jj>&wq_*3&TK7YUY_pM1XFjM`39Fqi=Ar)@gsvT z=a24unA-`>?7C0APH`NTvUGL$`LV3sI=j&Y)|pXf>Jbr@MVdLetmf%|b)JTz)d-Sq z#YygNYeDIp7{T4x_RkMOkP9G@H5wG!*Xp|BKYb553P;x^OBG8R&$lK-v|c-xU_8e( z9o}UdZc2p9ZI^WCu;SV6z=Mu!StqSDwvI#H;7enPFx!K=N17qPY?3avZ(7YH`eGhJ z+`vz7ywB>?0*CG;+uY+z;D&F=iU}|CmEEeARZ?Q{sDfEo-c{%p_};l>0PJ{%7~Ysybm-DaRrP9!CBxJ9?z2MyZ(YHU%FVvL~~ zPI3*$dkHd3IyJKash?01c|_%9oQ9GQPv;W9zl7evwG)Io0>{Qgt1DSQOpzKX=v}x6 z>?626@O&m{Naz1J)Z3Cx_~a?<#UlF82Du?g`I)l0#J9ORJKe(jxL}WXenEtwdfg$h zSa7x653!W3iTTZ5z6AvJBU5f;14w^u1hnrj1@NZx6>yJqG=sd-K?>x=CGRtd6K>bi zrKy}`*>u4S>~MQy!LSulbqzUSuWRwjr}b~@D!txl3E#1I8Lvpd7j&74l>TzZ|IZ8l z0=+p+-QK~EF4JSOhJPHIMCaiGnP6~MXP4c4EopObep5R0`q{YZT($QY;bOK7fToH2 z?_W(_=bH{mhfg*%G!INIKa|Br`VqaKQ(QI{fS^OA3asonC+y2J{JEYbt#GC@n%OgudVQ! z*Y!}?&@pKG%1Lr}!u*yN8;Q~y}9>`0Exd?k1Ux9FCzL4;p>M zTMmv{#X~)%O;II}<^hNuUD!_GR1zY&B;McL2LrWxSh*tA!BY$5F7StfR8#Xwk!+&f zlbn*hR&+Mf)sgaE$>1$bklNoRd3b95=2qL zWYpH)zz>+g>5aS!wp234caBXeH{T}?b!hsTB;HDQJP>8(1FCENhp!h4(O7C43npFI zlb9wy(}|KEd{OG4=N!Xrne~2+n0O6Gk}`=b^Elp*O^Xq%eQ-!?Ls`!NNp^Co*+9xS zHN{cHFaxJtSpALIK(LSU><_ppIJ-jb|J^W-wdB7-ZGy0`P0nfV|3(vTXmHveFYWE! z*e|dC-^-KH;djhd$FLpSf{frgJ5^hM);kc4wJVVbaC^CPZrx6BbMZ7cYuklU}-Y(4~Y`js`axIFNy*CWnVF-}jIz#pGO59xED$$s0M- z{bZh>ucaF1XnRO7{mq*}#A25DJd^J-YMX_fO`moR_n=^~)aCeTpO^#cYdJkk;THr+ATe4eNLG z`Q3ULVu}jXs6{{hUHIfr=F>@sGrnlz&g73{nN?1f_?3o(&WiZyR|g~ZxUJL5pQm>r z_CdzsgY*&Z0dK}D={BOj!8?qO`f#q7Txp|BwiOxdaXAz!C80M`MP=l8%4EkXjhnuyN&lTVcRf zW1mAw_d*n=tjnL zXZ8$2K@K?kG^VVkALFR1IG^ob2PtS9R;G-H&?7Aw!Ec>W*Ygg=ayWW3y?*p%WDAuA zk72tg%*Wah!j2NC+AFVx@z+27t`iqw#x8sh?(&M;Euv2DY#cG>%0eR}q_=Z_s=&ER zd6O;1Z$vLS=~PDj0%>pbm}t+g&8cHIW#Te1NhIQJ=5O9q-(0#pZCj7u<7=3pVd%y{ zO94Xdpzi1QQuJgu>#ww_b>MKc_iHEcAxLFiDp62kw3ees$-=zOi0C{{E}#acca(-J zqF%cYd2v$BdG5n&S@q||3_NEcG5G4Q_jaNt@My!2JlLGJ_gRj(6O^HEI&a&JlC2+Osd9&@LFz6+r`<4pTkgIoWj<>* z+eSp)NfQkWV>~Y6qYO>h!0>4Ooc430bn@s!FV^LLA|p|7ra^#XQZjK;=yAu9 z)#Jitv^-0e@IqvTHUUfcNmkI$uA z>t|{>nF}cZmzM&yc=Y;@!+;itNsjBz$^1p~UdeCK`tFTqJDGD<8_^S0X{PzUTQwoF zk9lf?T^R@Q_FcMMTy}hPy$UHdGOEIDyQSl4*BEeE3Z3eEnt@L~M)K&S;Qx7oJmF+x z1$rk1azmEGp=1N0%q6?c8_6plyQj8%R-5}~2_`1rLi(`l-4yka#N$yu#fk$Pmwvir z9j0rlbGf>@6E5*gEv_!Ea_|ezEw1l7k}`Qlu1B`)x)vBW&oP zPA*Zvi77;=f$y>jtz{Gsb$F7EfHr+a?6P=;J?6#zgc)a(*tcCJM5bZG&*R&&Za~r- z(GE1|T8v;^+YZ&m(6^?mQwj7n0E@RzE~&%OX`B~VZl6Z(Lg3WaTSb|?=nYO#!f4MA zz#*mK?Twu*m#}<55QyQ)vgqj4y_Mj}NHADK-e29v$HjMQU&DpU6qGKn0)z~J`w4Y) ztmj;IUVA^Tg+C+eoSdF8FpLs$|NaS^GaYGeicSjpOvA7STH_d#WVXrH5Nv%vC{$^= z91`N)H*I~qSm!Owq~CmCAUgzxigK>vm>lZF(y~-Uwg>SZ3*GL?ALZP;_%}6j0y%gA zP3c$eIV?zJ+9lQ_&NWV>jVkW$omQm3ls{ulZY}do#ozydd1y`>snUDmw;2c zXqoQFFr}LKZf_onA383w56CR0LZV6GJ7p@=7uL>5Vc+@82~e$eO_eorapfA9dF)T; z{noJOu#=Phs<>?WfRXT9cV9E`41i}L3PJgwXOIeY`;ckCaW_-pH)!GOVnxemTb-Ys zX-C^18em=xzV`{e`8h`BYNBi&PIZQySF7+em{@4@ndC2WjS-y@99;@=&TU@adWOIG z$J>nYL(~%FZm%HTa2Y(s4oWE=mf;X#i=#6Ka`5y!TK2(ZR2PrTXLpWKtBD?mt0A@G zZ_MxdcRg_85wD@P2^sW@$xPjV`74#pVSxX>R)GUtpb#g7ir_i{zaSP@Q@u3h&5~op zNuXq!K8BW33pR)3L%0fW>ltVrFjiHTS5}qNvoM66pxg={IXuvy2w7sVFo(Ne{8|l{ z8H5R!i4yE|ym4&rD9WGKP|@a_TI3KEY_WNH*zU=1`@^S>RmM=i{1fB-u%0AGCJ79l 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 Date: Thu, 21 Oct 2021 13:14:27 +0100 Subject: [PATCH 134/254] [docs] Change HTML docs accent color to match logo. --- docs/source/_static/css/custom.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/_static/css/custom.css b/docs/source/_static/css/custom.css index 6734ff94a..df8368890 100644 --- a/docs/source/_static/css/custom.css +++ b/docs/source/_static/css/custom.css @@ -6,11 +6,11 @@ */ a { - color: #ee4c2c; + color: #dc373c; } a:visited { - color: #ee4c2c; + color: #dc373c; } /* Logo and header */ @@ -18,7 +18,7 @@ div.wy-side-nav-search, .wy-nav-top { background-color: #f3f4f7; } div.wy-side-nav-search a { - color: #ee4c2c; + color: #dc373c; } .wy-nav-top, .wy-nav-top a { color: #6c6c6d; @@ -39,7 +39,7 @@ div.wy-side-scroll a { color: #6c6c6d; } .wy-menu-vertical li.current>a, .wy-menu-vertical li.on a { - color: #ee4c2c; + color: #dc373c; } .wy-menu-vertical a:hover { background-color: #f3f4f7; From 4cceadd1afd5a2b95d6444a77cb978d0d8747073 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 13:14:41 +0100 Subject: [PATCH 135/254] [docs] Add log to HTML docs. --- docs/source/conf.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index d54f5c751..0ae6438da 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -69,6 +69,7 @@ "analytics_id": "G-T95G5EVYXM", "collapse_navigation": True, "display_version": True, + "logo_only": True, } html_css_files = [ @@ -77,6 +78,8 @@ html_static_path = ["_static"] +html_logo = "_static/img/logo.png" + # -- Breathe configuration - breathe_default_project = "CompilerGym" From 7dea3183579b10b0543aac069adb52170c682106 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 13:15:25 +0100 Subject: [PATCH 136/254] [docs] Reorder and extend the readme badges. --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b67ec63dc..1dce03bab 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,22 @@ ![CompilerGym](https://github.com/facebookresearch/CompilerGym/raw/development/docs/source/_static/img/logo.png)

    - + + + Colab + + - PyPI version + Python versions PyPi Downloads + + + PyPI version + License @@ -17,10 +25,6 @@ CI status - - - Colab -

    From 96d9432446b0d1165b08d58fff428d48b4052e44 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 13:45:36 +0100 Subject: [PATCH 137/254] [tests] Fix indent() test keyword argument name. --- tests/util/shell_format_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/util/shell_format_test.py b/tests/util/shell_format_test.py index 3d23325d2..6f8bfa4f5 100644 --- a/tests/util/shell_format_test.py +++ b/tests/util/shell_format_test.py @@ -9,7 +9,7 @@ def test_indent(): assert fmt.indent("abc") == " abc" - assert fmt.indent("abc", indent=2) == " abc" + assert fmt.indent("abc", n=2) == " abc" assert fmt.indent("abc\ndef") == " abc\n def" From 0a75274a763af80a5f2343869d6b52711aaba2bc Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 13:52:16 +0100 Subject: [PATCH 138/254] [docs] Strip padding from logo. --- README.md | 2 +- docs/source/_static/img/logo-padded.png | Bin 0 -> 52542 bytes docs/source/_static/img/logo.png | Bin 52542 -> 37668 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/source/_static/img/logo-padded.png diff --git a/README.md b/README.md index 1dce03bab..d3ec14760 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![CompilerGym](https://github.com/facebookresearch/CompilerGym/raw/development/docs/source/_static/img/logo.png) +![CompilerGym](docs/source/_static/img/logo-padded.png)

    diff --git a/docs/source/_static/img/logo-padded.png b/docs/source/_static/img/logo-padded.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bbb779451a73c1f0da3ecb41494c58ea682eb2 GIT binary patch literal 52542 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 Date: Thu, 21 Oct 2021 18:04:24 +0100 Subject: [PATCH 139/254] [docs] Adjust logo whitespace. --- docs/source/_static/img/logo-padded.png | Bin 52542 -> 37089 bytes docs/source/_static/img/logo.png | Bin 37668 -> 36715 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/_static/img/logo-padded.png b/docs/source/_static/img/logo-padded.png index e6bbb779451a73c1f0da3ecb41494c58ea682eb2..e69bf9cc821d5458be139b3b370264d0fdb6846a 100644 GIT binary patch literal 37089 zcmbTe2|SeT`!}rZCKVxx4B{?C*~5$_ArT>Kvcy=j8-}rKQTCBi*~w%ndr~4)mdU<` zBxIC*>>=B83~j&n{lCBWc^;q7-94^3uj@R|<2;t{@jZ@9h}H#_eY9+}R8&;^RL?10 zq@tq1QBiH%p!o-`bU6{4;D5Va&Rue&qB_Y#`EQ$Nn!E=U)vm*~x`tRo4Rs{i+3}>g zrL%?ANl!-?7)?bbBk$>Aj<&bLa#>i}*gDB_PnA}1bJ<$TavMl!2y3_~T3xk0=k02x z<9$IF?QM^iw&a$VvB}hdYTAJL&9dBP1d%EiEK0DkLg;0!Ey0^K!zP zd!BG|jq;*evfsz>Wp=EyXyS^@#x=Q|HlL%TMdoh zbNr8MadiAWg&S7c1Ge!~AphfNH(f6mE1`>4ZqDwmXe(t8SSAl;H!es;S1WU@v#YMN zv%{~G()zVzE>Y2w5?p*5=4e|d$|m^#y2VP#9BU=ZO*yv{BEly`MRY|ZkrJXv2{8d- z5u~v2)=&*+OIvHN|8b}|jQ)?Ipf#4}So8ni!Io&GwX>_EIc(Y1(cH#L$i>Nqo9nkA zk&4a^&aN;qtWNCj>#B;1TCUF4whr)x+eMW#T&l{7r$nSrojM_UQe<*m^APsueu+zv#u*FgIswEY953O2G!C^}nHcLa=-xiqUTE zMCkvy$<6QnGVou+!D~=H{`Ob!%WscorUkgV4y5rBd|9)*hM47Fh zKjZ%UH7@e6JN}IO@7GTEZu@!5pK<^F+O^^xKkxW6?!RCABh)|R{^Qz}oQ=hA{UbJP z_+49%hH=4SWU2S+Vkd~`akL~u&Ce+Z=~CWHJ$e<4`eq%ACq0`f7(a>s^nT{&w^fMK z+Skwc93>l$NuN55C>^a6VXFRf=bh7!0?zb`NMe0EIbMTL#O$(fp6=`r=P5t%-4N?>c84qFu8+q( zO{A?!VtBnu%umf?-^mqu?op9>Z$SsHq4UCI{$KOGx=ovSf`or%p2(|{AW~H6eell{ z*^bZSV2j7x_sX0~=rNbwv-K66kZTz8SyT<8-t&=OAxWZd_E1Ek&F?R}dG%w+3^>6Z zkxm+TJs%>v!!38~bU~h1x~_cT;$357&zj-brry3x!7lJKNO#QP@Xk><&oLx-U4IAwx=x^yKkPxaZR#Y--09^ z*iMA+2}M0PqWF@VXd6Squ%Z^Xz65FI+ddaQAq)q^>mMGsi~U~G9R1dJU=;Czd#JBB z@S2G;%AT#fksc?WcysGJ*tj9fiRU|N5N`K6wnyGb_b_b!DPmZE#JgLj1I1|Rg4Fvh zB5VhJWxSh|e=jEC;K{ve!Keqe}2`V zhDXsI+@{R)4&8pBWa}o7S4xBDBL;jR}n7nl-?2ylX^4$FON(+<5?4hoHSN!k0 z_T$2NC@Yy!B?OY%A_s~z69~WWszOljjtSf=!yWraPrzH46P?AGLg1zXWq}sVsLJ=A z%S{Hq7r79Q>e*e5sDDGaJS`GpYZtU2`1^r&9JqO=Fchts9^;J2DC(y^z{zz8kq;eX z!?6plPevp}s)XyHek%)xT8mVSzU$J9$zNKObd}*)LzbCtJrQoK;>5A*z7dQJIk;PW z(va;j7Qfcj?(As2lmGXm9>J_e%pnxP;F?LTnj;G@?uDR|yvL>5agDzezPqf+mUjHo`uLNV-$kioKMEy#zxYzJ<(W?Re&M3}RK0hN78HiySQ)h35xLWB zm}@qluw0*!l&FHB-s9Kx(}54tQE%%$dG(N&e^ly;_8yxPTX_e|}1e?sK3SI(q!lHyxyYCEm>V18#C_xp1D{GGwXD5Hc&# zJZ@?Hu+l+~=eZ%sq}LW>e?99`cWbV8FUF24YN-Ry*HySW_{4^nR|#RTx>{>fnyauS zATSLZBI0vgHSC5YpnhDqh*anOU;}?ew%&KLj$eWJPRuR+XRM%1%tapQ65ia6-frV{ zpAYR{b8VKZ?=`>Bq(kN^A+pq`exHrY*A==r92)&rL0yZrB>ey4;bcP?kKbG$`)13-I`hTxt_-he{OgNfjcN5!Y zI`5_8^$2gwReZuy&>y;sXg22tV;C69C!B~o=P_Alt3YJlaKFT>-aVs^F1N6%&m;}V z=h>AW+ma=?6yw9V`JD%Bb4-?}8gJnB3OBr;E-eVk2h7H{(kT!_U&i$P){=q1Vl-F! zxd1g{K;qC7p0m4x5Q(y>ctv@?_9N{-Lohs%Jq%To8mgu-D#hW>{^P4obCWwQEs9Ov zXE65TNd=->M}ejHPbdH`28|)AU(tTWkH}IWKE0G4wJ1Gb$eYAEDV0W2k{2o4QVs}d zZ|>(4jyyZZGtw2^bDpnaxo=eJ>e?|gBw;Nd;JUFOxUpO% zMq*FLCe-|ON*hy+6(al1b+Ky1A_d~x=15QL=QiD~^%ylGgS>_>NUN4Wv_qEaQ$7YX}n*Kgq z_Xt$anTWxz+|}bjDWr$eI}u<3S>A_lBXUd#cy|RNzc#ULLM2C1()ecx3PxQ+)*$>^ zYsmHnH!h5J`%TuBq)>Dw&MNM372@8F46N}Cq4Q~m#ve`Z5G5a?m6}a#W2o=Be?(kDP&c%6|YNnd$+v(dFSlXW%PM7>D)&+cnmp#V&Kj1h;;HVLs&Q+ZP) zkg*FvTsUa1f*RP=A%S($Oh!ho*_PHo{5BcHm-8cRvrYIt)rhv%v7M_M@y*fr3>+T0 zPBQxYfEjS%>Z3IK-DP5{qVY`krPE0A7v?+ej{bC!AZ{a&s<-;6r~SpvJ+7#a@*zjM zLC5~FH@Fai^mmE=Yj7PAQDj#7%(kQ8N?TLyY`D5K8Y z1CnW^;aeJ`p69DGunDYK_8%3ICaoT_TQ&uIe#(Z!j-N{7iA<@C#uwhi`=w)7ugqnl zZ7009FbsqkT?z6?d|Lqw;0=pyn@MKS9Oc7oIu^`d`#jEy3)k4x79rZprL*c6?G5~& zFZA5cn4?9~`E3;N4*z8vx}xNmbg*v&X(hyRwu#rNo+1I}WN>}%*`j|8Uh7qHWzYS# z4D9QpPxuk?;b=9Y_QR7aeQCTwx%R(L;{H3l#~4g@U$JGTp8W>?Sq3(H57OTljK6bT zftapMEJ;B#xM$myl>d=V2&yC<8(rv;Ho=eBok!6RL#sb3%C($HxW}3Xa`{{&(EM+a z$5)kIIVSv9!OA!MtC{}V_1!(lxL5`2gP%Z~W82Kth-3&>H}I92q-QG0!hg1Mrz0AV zklERE+uk$|$s=#pxK4w6IDQH{v-=_~}v_`j6yE&=ah z&ECGbNrts({6;WneZ`bq8d_qccr1$7n)R>cON1foj7y&pDJxd_sDnHvtvrlvK_-Rb)QArhh^#tD_!ncc$oN}B7_?Qy#KQg5R5%oZ z_z^bL2rJD|Ll&&B{7}z*6-fx&O9p=}Us?sEU!f0A%&U2Dm=vK zF)vzpTyu0uneLa_p2JPnwZFZAPXR%Gv;}RYH#7gERaf#d35l^)hp-N8?n8whUq4>$ z%I$DfBc@q`#)8CshrdY1{qgeM$g!)|XYZSp&gzON5SzJ8OE2EyNA%Z&l7;O8OXD6f zlj#!$MkB_8kr zO`%95$;DWl5Seh_%RhZRMYs!?g^`V<0q$^IsA zzc*2UMaq}oJSz8L+YQZB79YY}Q4@-k`?*23{u>FR=dc5A@Os$tT>8tvZ!PVgVfk z>zxn-!KI+v`4OM;OuUeNn=W@~B4f1Vr!jGnuZdUUov@(W$E_#pHZ89gHg*?KngzJAP;gO`?&5d2UM(`*Eke&50=!MFJEI4+6k|=;d^f{&y5NL$&|=B7w+n`5s@RKp|fj+$j=} zRz^_wdsd>)|8?TJtBdgg=tI?i#aar8M}L8P4gt0T&qBKgssESzWDEv5s)E<^kAesd zphxB�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 E0|rWDSO5S3 literal 52542 zcmeFYhg*})^F55Bf}o)IP!s|JDoPcQ7OJSAbSZ*#2vtCO=uJRSFcg(uMY=TUy%Uh$ zdy`&54=q66jiA5p`#*egU2073d+*t^GiT1sZayf;NnRzoMTCckclE{dr;2!ZgbsLk z`1pjEz$XleX1?H`%T~`{+v4G|GvfZ7b4(V6CjiZLiUFOd{7xpT_TYol5{19_lxoUL$b&a`h_IzvK zepAgOjW25dp})eGuck5iKl?99?ZEnXLrYt8+vmvYcm;}^I!p}Q89y@i2eF!I8O*?* zKQD!pct@ST|M_)y?A+haA5N2;z4d%|8O-JM^`A@${@L3E-8#tMk1yU>`}_8OgcZTr zd$C#{!M`69-TU9rc>e8ee3FbzUV=tsDA?t;w)$oCz@GKm!#$C4c_>5+_3U*gsCr9 z1i1wQw*;0SNQywNzE4-E*EUfXd}~+nD#iFrn1BJazo!^{IB7SS46yhKwu%Cl|#{hzxPr`e8yg!!wbQ}dPutKDi;X)FSjeWaER2{u0 zd07;dO&9=Z4{e3W=~XrVO_S(8kiGFtM}+q3dnEYIigNPnMGe7@zH<>XC!IK<2wwMN z!Hj=Yjox|7*ITfvUjrL9BJ0gR{jP?VYz;50@MF3-yWcf!u%1a;P7YBIR46P^RK|Zn zAL6cq)cib*2{Rmf+&g7$EIE;A2p$p8+;K6liudgv zf6?DX(G3EVZY?W$ueveQt?MXs>k4V{&bazB{(r#cG6Cp(KV7ONfEssnw%sfxa zVuIp_{WIeRFoO#*aI}mAm+I>K6I77nl(-A>7Ak+bIa(~T0Pn$ofH zu99#`@5J=8z|chk2m_d{iGrb1n@jibN!oWFMqi2ew+e9FDx^tYthTYQnJ&4k{$q6f zp25!-f1TPB!Z3D@by;FMXAET&6;^mrC@PPa=WZ+iKUW|DF+R_G>x%SS6qSR3&xZb| z-Y;LeMy&rIzKj6hXXer+jF0pJ%4%mimq-LkGXT-R zJPK>4R-MAbBb}XYlb4QW$jC$I;y2D=mXmJlJ;m!)Ou?sIRx?2iT%`hT@-YbK2_2!x z2bG00ZIU2DjBcieCK4eNnMEF*)fi^7Wu{7qjU-(WZkZbeDCeE>!m;~V6aYmuvyvf);#>FKQ_1CAHzAZSbfBtZY6RM|x zwHL%>9B{-AyjF@Lcp!@nnCV2Rd$kj(oJx)e3G+XDaKLGYI~$=E(yJw0yEyf4Ig5&MDZ*2?Xap4BDoV0 zwv_SJZdx^`2zge5imeS6o@($R9se3Bqf&&qtr@apW}P@9Zf?aH8pf;{M`9mC=@4_W zo?S72I@^bQz$RJ@#af!%wLkenKF5txU9jWHjcNTfUTWooL(~f26Z9KsSh{U=_D0G6 z5z1`jtdJX$21p6*nyQCchd&{d2h7;bTMTcLaoJktpmW2nxllXlRJ&uG$8XuteDgvu z7X|E|m65xlRs;`&+|1YbZLf*%yN;?0W~imjpbeP%hri9NPqFC-D9&#|@FC9F+*JQp7`1%iUw6gvwj7A8hr0@K{Z6s9{+FO(mP`H@piK~E zVGs@d8iQ*wvPiO#cT73>5N*4W6n&hF9a4GDGtK@t?9@Jdp0l9}EsX~{=dwhm`*`@BhC zdL373k9tcu-Lw-zX|fbCzGinAw!9l&O;aLz3gr+^w~(|$goh2JC505Y%H7|zlEziL zStOp`yQq>c;UJBS@j~8Yvq@FLutKBj89t2F$uOJf?UYa6*Xrt>w0%Fb zsIIH3l*G8X<)MB9aFHe4od;*D&kHECjL@NtK6Iuz3Vyd?pj`kZ<$n?SjSaHIZE8AF zvWZ)q`3f>7)$D=ZJl8QNx9+@Ad;#@$yPliKBN~jAzEr<&#pA-Q=L{U;dl4n$|CD~7Uzu|4R7WJ{R zwppD^)p}82R{)ur+D>vf(@{(HJkR9u>TzTm54rfuWGx?*_h4qXDIqUnXtgU3l-K27Am|<`BQ*nsajffq7 zlvGny>KX`?!YWDHUBDquZh1TlUWiRJCH95OnaUA-T7v(4c*#nV?*C#r(A(2JpOBH! z30yK_k7`@4oQ$|rS!L_+UuNP4q5dTn=s;d&PU=N9Gik}yF~#0c*1m%7@tzQXLwXn@ z8@BTZC51u9TEaIsy9NJ6!etN%zvi@@>=^_QKg1+WH25SF7~4pOdwN1dJ|9H$cASSe zu|XaH#|RzmxvnuZEKVl6JdS8R%~+mUx5v&s1?n&>KJ@NHX!lLRh;hEWhfH19TOY~L zW(anL(6v#OR{^YBi0pn8Co^&o^#-~f&~a4T=FgCwqL$zYOo-09>d>IU#dZFiE#N8B zrNxgDtP?$X&0pAhVS4~BYd7K|yIBG$?eaK^@9V0XTsn&}li3%@-S{h^Z zU06pLBCq}PU^wLd3(d()kAJuJ<8E!_b@+bD8ix_^yT!>#+lMJ(RYdx%d?=}A^QGsp zdx~KB*zUac3Pr3$yJFuS?X_B(t)CjLYX*qbf<0{K*He6miqUOd@Tk>I#ubdk62OTz zRqM5iwB+DQMM@Z=WpBfLm3i#N`qk50=gPWvqep8_Kw)LyT1zM8crGJSG=>9ph1-su zFiQ`yv)>y4MTDr0)81{l%x$-Fcq?9ABbmKwg-Yd3XWJe}ej=m2xRTkV<3cO;C3hoFO*|oU@Y6C7WvNNdi0I8|r z{d3L9(2hez-FHQ^Y#ZH;T7R18P$( zm0A_IP;AgP+|xY~%9&?}&jw+ORyh0*fBpu}?}EMO;5;*) z`Y$?YqXcz>fYhr`DNG=-*VNqm$^k`5*&Ty)vb&i|X-@;I4MQ}hm`BpObUaYHx7$u_ z+8u_lNzuC8a^o#Ue?0zPdFNSL{FP9OzbnR#mO6fj87NED2I_(4dKhacmWVdzH z<|GWk1yGKAv4C-1MqaB+uI=@3jdXZ_=IyV6DSjZ*l2VdqcFS^Xz;hJAb6DOiEi!g> z+sF87KmmK+wbR5NgdCbIJzo#zZ+eVg-WLDME*g(*304z8m6z{i$aIn1vW5xbl%WsLEyKVA!HKk3~JR!Ls6p-I~vkS6wQm|11$8gSoNA{Fqh{gRp7GyGoGL2`Y8 zn9C*x*IYUl!%?N9MTZ-FcDfSka2l1`fQH{Nkg&fL4WCPGTq zjP6(CiWWe{GEX{^FpYm=qR0WvdG7>$ZE=x?(bn$=tj)~^MII#2#(m1l?P z#TS2p)({6zB7*dl^}9xZ({OQ+n51hba5$iO1T~;rPef5nF>ZnAg66Ty^gsdsc`4j! zhbSbd$kqP*X3Ew?fyNPW;8h?8-P+rTRamV81H%wUVlUpTiUUssn9;Fu(YpmzVJGrE zoclPhoDT9McAn&ZGsw;Fy6D^JA0+v{q z!CJ6=;7@gf2|D-W%CiFLCvd*2)VMxW5hB1XrX?e_aM5_=>&~#rlF1}&R0CR+@J!-w zcr2sRyJ#gCNy%lVN!eG*Xapw!gl7aNCwpFGyw- zRS3N$sFj%qJVHd>pl%C@MCv}JJL60I&rX3;qi%=f8YR`{zFpaO?0#9Ss~*t7J-lG5 z`g?_YvRbylt_`I2ZWjYVb%PYSy-(Dgq8{DuMW^@XiU7Kh{p0RgGffPPZ-)ygHfMe$ zfLIfg9JHo*yR>NDaz87XvGU0P=b=f+2Ubm$0GZztRXKmbQv~4gfTG3iOK|D#CsN+LSXWwd=UC%W*Y)3gt@oZtYV8@zX{QoRe~SJWGd1!RmvhxY34&`m zZeI}0$T#jV_DIvlPP=O9S4a9yC=qAod4wYUufVJBLq{@s`VS7FrW|HDea)vqNr zc`ADv+Gpjo8VdlBq5Tmn=@Y_mTM2)@%gXryikKqy=X|#dfUU1;q+pwd}QOfL$XZH#%omJ2&(RMUJajtR<&La2g{>Zvv5}`= z@^9IkxeC!jMhLC%vXzhA3mpu1#sbn_bo^vAQT;qia+i~VPkIZDavTpGq#PA;wv?ZY z?_aHgP)0ZpW-`+#tCWmx^_)JsW&|u$9AHLgX1^dM$xnYKIkLN=mX^#|XgTpbeGuy8 z){-<|X!mron)wjfV6+7JiQrr~9xf9h-HT&KR75AUfB_f{DMachnz2S9$OTnEbRg3OU8tk_gBP@>^;2-#yuqP&y z^cbq>3QzeQz;=C=~_S>yX*JwK?A zDvxntb#T1kW#tKw<_j~$mcwW$Qw|5G```-Pz2MERaLldp71|fER;Md^2qpmAGg&?{ zudG^f6J&pg&Sw1XXZrUnKYA5tfy@rX!=_B@oD@dIer%7DL0X#yGnSY{Eo&o zC?ZdnSR7X;=y-?b=q>*)N4!klU3JHbH=+HC_HsU+aOS;s_FKi6FQb<$sseqF$KoL# z8XG59h{s1mP#vUO)73}w|BBilpclm_kjmd3KP90Lr5~OO9Nm3kbOC}P9 zckZdnOCz~R+jMeXr|C&T)2!fU}CM?uYwSZ6{zJ48q+;2{RS)-fPHCgO2fS*nqX z!g5Is7SQI0mHJE4X5b`2q?|WI#qmFJ$m)F$^?(mN)ULX;1$K9Ugu;29`I6eyNn6Vb zSlty;$ni$bKk;r<2MM0WIQU7@D+4~DtnVnYGvDz#=&KsnfLC^a8=Faw3*x~-&6_U` z?Hrdb172S1%$`wJam4C)U>cL!5>F?nYbuH+6Cc@IuX0e9Z&dWP3Ldfg+^a5Qu6j~H z!G@XtRA2&RQNkS_cv+l2C^8PbLU-y^3hZ{SFA`FdKx7M>$4KeN+Gxm5hYL$7#V1?V zl_Zx-)&FowkXJaXafPRRv&OXwW^e(DlVn;z+<>x3e22EBqN>f81;BEjzaS3e-mcEJ zuyyQ;Wp&@*PLVob1BywWPmtbPgskX8AWK|Q3!87T^}qiK0qq44`qxWe&%a%Y*gi3* z^KgF2(AE7DP}<({u=UWkg>$K>aWM@h`fuxPK*E;bX~R2+IvphiKrUViQN|`RH{b)(pH)ZQVE+!_!7(pQn|0U8C!v=91`?I<@ z&9y3q+`r@ym2{`q^PKmhOwk=Ohu!$rfkqbg92RP2Q8BR{%|)1q@RjH zyM|W?i|r;IkG;8oKK4@-b6MLVUHiOT5q!mxB?GTZ<;bA$=JqYn{2@x?U~}-P|+YPUUk)k1PEZZ@A%h zCsuSNd3eZMiT;=tqygokjW9->O2$P@u}K1BgXJFz9FGquw)r2gf$ zuRUY6+L+zgJ(4Gc98IbEukCRf=+d0LS%_xuaA^0qeqIQukl^aiq$TN2i<7UTJ$V@v zk)Xo}ok+qisZNTz4fC97GS=Tr+B~}|H&*#$KPD3`U>lT;JFPM|t1E1(?*FurIi4y- zmD;;@&Znt-EwucV2~*A@?NCDUQv;0`=xt8t%hHtMDGR!`65?Hkh*)z6T%`X;o4zjE8$S?ji zj*vcUIr^He>2kzg6wFZ2dRu;?{JD1Z$y6AuZQQ`B%79M;n$b`;G-O&?WLH3!fuRbC zzU$-`Nvzt>@Og9K-YdRA)s5rGF+L}c_dA&Is$%ym^qPm%|JJ}0tbrnV27yH_0*q^p zFWx#c4eF(>UD>776K^(K@?ReWdBomwZY-XD_r!2QqrFe=Z|+pP+zwfd#cc`Dh?fYvkEh@B z9`>uT-sZa*C>${XXq#vIjtc^IC;Cc8b9`Boym`2zZ78yH4A2*tmdDYq?_A-j6U0MX zcf6GL7LWGe=G(n&@}q($yO@6!+0JsRw%l$D-@0bCEyb$Zyw|}BkFDrKQJu1@Al?Sq zw`*LDRtrE)V;k6Z8uw70$v`i~v)c6nEyWcG8{AUfqSrdO!o{FN3^{Zu;1cv_lYg}b zK_U@)FoNJ_`Kgo^;{{XtgqsqJ&jto0>z&OSp;eePa?A?>O13PM|Hr!2S0MJ|@d9iR zV&Ke$xCWb_PLLeCA??|==TAb1T*@l#^$>;%bnu_$OoQudx(jZ{ z9q4)mUnY8=fSJLl!N%O-FocTm!*wAE31V>^G4E=UwvF;?y!b=Yl~&{+jp_yOWC#OV z!FwTVM*;si~{qxS7O3 zn`WJuvN?*1UR#xUEFY3B#5<4Q3wqUl0R2bDM^)>G*agdjHHN5H4} zTjh6UgK0dRwVZKfrVzT*X=qYdAtN!#?P%%QX0!O4v7L-HO#V#n!l=3a$k)89^HrkU z>sc*Y3@@SsVaj>cD%0+SwS8wm@6;8ruKrlC)XDL%J?T{)EC!u3w3t(#8*GMyVtFxY zfT8r>jMstd3=<&kn-q?^6M0(tT6c7VMcpxVKTK5_FcLW&MFx`VowNHb3eS+3aBEB1 zw^c*OH-$eBZ@Xi$`*fYOhH+<3Qvm2s&iP~)opcRE@gT3q=f^iehB&Rvj2!|RGw>ma zsBSkdst|r$mdOOwaM4QZ7++;ZIVgEB`78XRU4Q7X+1=g+*&e8L*1rS=?rIE}h2RzX zzG^lPr^6Az@b{fSr3GU>tPz5`zgZQbjqsbjYzc^U!3hL@)@nsn>E0)cDz(M5m6KH} zoxj>dx_7LW9ZE|IU)?TX*+l=}#M2@sxl)B<;ogQ)Ti|2{E5)M8WcH~N>e@YN7q0r7 zaKlndy<@k)rkleP!s@HI=FW_l)1P_`#J7{(QQweTf!%k9W~js+tq^QYm75-OSGUN? z&NoC&J<(bxqCU>DxAj<{+z{j@t} zaHpt#NoTohIJOPfq+vx(_|~hO@D5_)l{sWZL1B~&6xXUx&O{k}NCs*1&`lU8&cG~e zWJ%c|)RFLH!&IP(WU?^yJ{#X&@0-|^Gaulm&+`M(=m!f35+_8<|02z4U_^gWg;MAvaWAWxLddfjyUeD$2ALEQeQ`I#hO;mZ2UAklQ~BHln?Q;iV2o$&Yf zJ#Jv<>ClhOpsE0%p;%*6AsPwAO#=!hVnJkI3j=C)E$hgL!lA2s-2l_iag?2xdy_{O7dsaqL z3)4KPb~jkNtWmR@146f}H;=ZNWC`aAC9$h%Bu-;LGJ2&ZP0A&QtU#m;1%S5kaOm|{ zLk#(KVThvkLWf**)TFksP;^|zfdjtEPb$?e*~X!H#^7>izG|4`?pp{m{Iz z>iFeQ+d>ZQ!RY1=!1Dt}2330FMgKYHG+7?!ChD@g*Tp&aDw_`JeraESd8VcFWCtlS z;(N|h7{pK3?rN49X{X0$Bf*ry=h?4~)B_elZ}`=ttY@y}4Q0Co^H?j2#i5jk$cmGV zfTY9dmT2Q`KGn#{=WDhgqp@)je-d@^k5N!Trg|L9o+N86Qc zOGRzfp%i7JgMB~_d9Y9Pgd7|Ux^pRw%Ki|tSl=(F>~zcTXyWk#kCUX^ZV8_XnD^61 zste{u9OePd^%l^Cz) z$}~w)4{kehl=i9V62D;2o0LM612YWgZ#IbWWLjS$327mvR%l$C09gA)gg5-fo$57 zUlmLs0fft^Dy3!g`V~_0b>n(1k|r3L*Gkfo^Qj(h6JUo_bSI;9aXCAD=-U;Ci6`y% z`toFLNpcjAqviL61M%>hfTjET_@q}RHRm4Tj?WbRX|jqTEiC8F&^rU9?z^d?hqtca zx!^zpb}f4|`vlo^IQ9P@U8)bZ9q1yk3Zi1=@U0>IRdS5H#{tLMBT`Ea_=HG6QFGgP zXgBisrjeZEnwX^jUE?)wg+LOM&9%XyPNQ0QeRJiOF3Eq);)deIZN71BM*!b+Gb6J>$DLC$+w<#vse0XFw z>EIl_^O6fdrq8pdq%){X3!X{KtE8Kr87qJMq+WCqtjM11XTPO-JYB4L#>@5Q%1c(a zmP`6vMKNCCu(xQl-CC1}N3z^n0qdscbdkpm)NQ-~j^*(s-gnS0>)q>0cjE>J$}0}j zLjP2FGcK>%lct!>j=sEEjgP#M0nN7jJvJiGkD*fXh$yR~TY(NA5-7cc8183URtueE zu2)qk`)=r=myb=AVe8Wsd%Hij1@)?6cH{9*u;R)1tU!|1=;+No4!EV{+plTLK-W>_d-=UN z)EQ1hsFg7YDuiBNTqLq@xD=qRv$yXc$bM73f4d$Bd0P7QJu6)&`_XPX;DxSTk8mxb z-1D-8(=TpFB_P*L!C6CZDE|!4MbGg&W3{{`Ix79OKS8+>6l8lIlBXbPtfp^q+Li%o z?kK<+F>b~bv`%RM1(j2c*_s0_jvaUMI%;%GM=DdaljSFklanjlf}kIwU+ZtMXks*( zE#LPe4DmDp#?{9;xX*WTtaDUnsq(NGY&Y53Ue9TG9pIN?2XqK6j|Bw%AFBs{v|Pl5 z+xJF%Jb1Vj!86QOxVN;5irasJ$XUy!y{hdZaTb zM?0vLDAg^<@T%OAJg#08sF5@nTa)`-N^OY-&p){b|rS_2FCX|RRdO=5L zp3?{)0y@{RUZI1TYsg~H*Y-&bY8nKYO4#7d?R!r_d07+MGy?r5x{|DF%tq@ze*sTW zqQtug5)`kqfIkN|m_Px0Tx;8eKL>X9+~m!!PqJGF9suTeLM{$jb_}i(m)gx-j~8*} zQIX!q>>uYvQAB2UjyEfWU~CUS3lHpY9nr|dIv~-p9F?2v*xw88(eLDNA-mT?YymMt zj{-#&B-@KqKqdDK60%^&xMRCPGT@W)CnetcZU?Qk?fC?10$zx*FvL(@7(uoZ=@;(v z5WU~em6!?|3Mf#daW|0uLX~S&)o-2lHx657GzR5qs~4*jrS|wh+vNcKmE}Qwe0;5r zv>U_iR&F>MPfP&KSjBL2D~E8Rq-Lo$#gOJ{Ni3B;yXd){Hf^`7rM)LawJWA-%XB^v zM}dJgIN@}6C9z-l?rPaNT^*s}F8h;35`4H8_f_d}k%K%w7ua%qPBmz#r_f&Xgxnr` zoR@Kpwm?JyxOX=(g9fF}+XH3R6%JV|3o! z$vh@CC_@3Fl6dGh6fHV{lgF%+$Wmzp+ zN}jQymnNs7ZX+(*EuZFe9`d=?e^^ko)Dp?`2Am#a=;FM&9HA9Y^5y&Pk5HW_8Q0pp zfB85wI@k9N?3}bxK6;Lrwj^?4jp{g>(^*>F2unD2^*$Xi=7@S@|aRLsPbftMi+DYq- z-XYADkLzctHC2U7}t~~8B-1UumxBfBw5!D;hOP*|Z#~xb) z924Y7bu`-xSQe=7(B0qTMExS`Rc|Pkrh#=3%y-XJsc*batLsJ^2ldylC4x@O@?Is0 zOSRcXrzdrL3_^FVuEr8P@6mStMSz(0^LOY)! z{J9RXmNui78*-QA$w=D-b2!M~U!Gpi5p{9hKFmjQl_vc75aeyXH=?!u8^v*G8 z_4rSQ5s$@#;~6Somxe&93?Bk&S&Ox!N$j=`Z3>@WIM5%Cyi9qzk_Q)r@N^x72jfTcV4DcCcCkXj^>epw*2 zlcB-IfZ!D}9W^Z8O8rVFt=W~SLJw|dxTbuklJ5pgE{zeKCo24IQU zm?r_A`ORsPkDIgY4x}(ro+MI<&xs$~2!2Ulg8udj9Wn}mF!)K+G49p~*{TOL)G;fI zzDmp(g&s)?ai6qf9bXj_^s$}SX&6Xd>kM}Ccoow5p#=rN$%DzTzriqfliz=ViUfy{ z-loBRX`vvP)XVTbr992Cy+M8A{&PXmm=gxP8f@o8Ie}#8?4H}@remJ#`6f~n4kRvp zx;a7LWIo*b@igSvFUtEX-A~A?E3Y`DzyGKm+m!2}8_>VIXy~V(TjYSI8e>q=2?}GI#QWytPyt)Vn-z9=q3zw*8kS~vXMRx3UiHp5$y%X!wl{OtRW+GdG-67jn3UxWA2UZ4djl;=0&k(vU1(Y^ey zS?68~qvokUSYppDyHobe_~^0pzW| zxKHmUTY2xTgYA0Rgr+(K@lthMi*ZkU>^DIg8rc)!W%S_p>RZW-HD)6WFhyX){DSVa6u zojD%K?U3rd&B>jLdJ)@vBTAOLSqt>b&$CoXULs@Ok&uh^>Aki&@vGV;*TAE>)x4{S z^iN&upKX(SwrY5(646jsajoGhO!iXqfLU;M(-o3z3MW~Ba)Kif*+kTyPgd}fT2VOk z8OeTSSte4FcIBLy_f7QSz1aTxsF>;W0@OV0=@nlh)Kfw-ROdir^7dl~{u-bl@Dl27 zuX##s?0lu;%7cMV=6bW|DcG4)15f=v^uc=2w_WZ3P+ zh~Zbl`*}GYz9jbb0Nse!oH?pTtnvN{Gr2O;b-RkjvYHmW%t8<058|FqfrAwamQSbh zKKHsrIf)KkL2dYgUm<@q=v$EwntSy*v&!6o|9)W*?=o67nWOwQzHyLhS^c@}FJOA) z7p)1D-=*dpHAnUgdPQ+*L65Y!Lbagtwp`5-19h9pjJoa{g6@aJvwOb2j$2!#cRJcO zY+IhoN{6aRM4GB9eyr4H5=MQ5ji!6VVuuE+Ke|YI1A~>F9+e;tIhduZm3w!0$a^=C)y9R}?hVyxai6Q~2+<)Mmjq%6;X-pUK3~&})gv6xR%X z>*=1aKQjhN0g5PqVvkeV?pPsA`?25FfA+JV;di%kXtbbQ;E?KAb?@D&grHn}o8K+1 zqE_TzI(SeYlVjeeXuTM6FmERi-9_j8p6C{9@co_kE?oj4iWEEIYe- z`#TB>O#3gO!q&XmxP6nvf#!vdgW7!OI~OytptN-QsttmNcQ6=WmsxU+e>=YNynHAlb9 znGAVBq$0&)qkH&ne0u7~c_bHKlD5b7)Um_YNnb^REgW>ao+&b!=ov)gXF-jWis72MyC@xz|rjO#G#eE&Tce32Ivr_H9<<_e-8B97a-(g*FXdkaW z?%AVXGoi(hlfh#GS{s~W2^JmD`!b4&6%68EnR7YBaa;x9xtFU-ujjY4S2+S9;ay>0 zeMp52S+mk@@}PY#T1iyF{_O_1D(#xTV1mI;$B)I@COff5H_gPHB;xh1mW-VLmF{IM zc{7Z#U`GCG$KSI6@d*uEbA76`=eCzDNDp)9mcA+PLCg0pT0`elSB$2A$XZXx`ygpQ`^fraMim9FahmaC4VFpCxZX>* z*-2EcDaHhR-5toL4PvnpD$UPC8c9T6cZvyfy`N*rVIQ${x?xyo*te4N>N^MK>4QS% z^Zrde5R#@)lDU4O5=U0m*<##wF3#rnauMyzjEf4qlmP~AO>JJG3xK{I-{8G zTYHr1suMG=s$si1+!I3{3#QTL#JZU(ZN)%+Zw?%${%-BO-JspGIif7c)6dJf^q4Xj6?B{IDGQ)1eA2g8fuZtAS$&nd{GVhqKf3U?J zFj2;9fG7}Q_eMygZzKDq_1M`Vaqj|Gt}f5@gv=XU6R0LmepE+7h`8=Zr5B>X`jyr3 zd0BDRO1o?Hzb zJn^NX(a>6B`uk~zp9e5ybXD6pS7UN~>&HLr@We{y)O)Ad z8bAbH5hLZ`9Ks%4xv};cG#ltXjo;^X}%-) znlCLmz@=%bx;oiFIie)lXjUXdw>bC+HL9{}vx-+YgeI*1 zC-MD@-Ul(vWvMY8=VYyyrbx(W?|hK^rs;~HkOFP>!jUvA>x=b9N$&VQJWrVh^Ud_J zU)I$Y=EeKWsE_ue&Eg9OcZ=zxJ!X>Pb;F(t50mY^=PLQ{_(Mrz|8wRjG#Np?I+hwd z9-xwSAGG;EmQ%A-x)t{5>8uS;I`hK?sr32`ZE%GruU85FyKU0-quds9M`V$X@d&v* za1X)^)teOdzSRkL4qAmYp)}{__}q5_7;7e_<#L2v@-OxYkHw4 zr0F*R&kVX3|AW&upy{`4P-)j!N>Oa=u zMN**;sqd!11cH_CJbd!ve2~LeMKi#i{*$=zU<92-mx$J9&!#rB2Z!3s`t;mvY%$wu4-^jXM?P zC^IBqTX5GQE=W;00(t%C`SuAvs#xm~|24GV@u{gVv9AEES7fCCzDy(W7rcERyU{@! z{dyss`!JRrVtQ^cB7u?iF`B*p+u8<&H-D8~sol`UyNK=li(hgmBPpGr!U_WJlLz5@ zfg8$$@@#lLE4=p?P{2<7D>$wAIPvjq0m-Lfu{!G zBC*EDW9Je}-Cyhxy-~kFnqEgJd6Qz4*pkzKMmnc}<(GS~^@#7hR1-#_^o_3OlaTxlF|4~xZ(B*pX7H~`pw@X zFD2Z6^Esd+`sm_-xQ_JQNvP3^cwEE>M?1>yo)UtBVcQ+wxf-M&%Vx|h>qbo$&Sx%x zh|@jNad5|E^ekuVDD*NoS`jhQ7^?M=n?9aleTQfS^6mUDgm<5ma49A^^}m7Mkq91-wm=|EYc7`}Nh!TILvCi%ey(C-WOy%dKf#3i zVG+=nhI1LGzhK`m0wm6ytWE0L7l)>9rzQ?;lb+hY(mPj zzUe;{@KSZ35c=aAB0UGhm}1cAbp?2gu0glJM|j$eYV1N)MQS0Gy$9r#0+nyle!_;* zc06X~HdfeZ#`9<%1DEvtSMSV_&uac-`~*`C;LEh zNxo;RrG#eJ?7I6s;tuuBF|7+MNvJ1NkP~=}VGt0_>L_GyWVn8t@}#B{+ZOko zHTSnv`L~{t_fBBH;FXnshT`Zo2h3;Y#fUG~Z+#%qgo4X5i(g(Z+k3-SxR=p{v* ze;SNn;lDqKr7`{YN5x=o@)t)IXt}(>9ahUhJ zGM91tK(@UmkD$e9%g-+Z547J$zRvT?P1^OLy*4VY94wf}`>QTp)5QqdetV5)9=7V) zetR?OM_!Tcujm)FZ*AL=Thy^uSU%!Xj{%1Gj+niUr{C@G>>)~3<Cr10aV=;@O81MArnah#@uN3`;9KRH&npFH1PG=iM#lRi;SO=oG*%P`I@joV zbcM(^`|37LQDLp0*Q6~Ug`;Xb!DmGB=DLxgp5izl$C=0-)}|~N!Ak-$HHk`hJ-0F5 zf~3$l8Nnji{?mAGT0&V8E(H@{r;3k)P3_`4*cKJw_P%>X2o9}URn<0rkxWs&16;*P zX-^ebaX9z+(=6G!<@(9viS@~Dbolj{PBI;LQ5(dX+A-PLe-$qFuka#>a0!=hVIF?^I< zC3+*BjOTBo8Ei-`nmraSzdztARYly z%s_#aOd;+9H{Xle^Vcp}i!&z&jb6yBOB>`!4l;XceQ}-mwkpW3(?{NPM~UfpABuY= zB*GEjE<$>BE?O`7+a!Kf$HeN0JeDQ=G`;S+$`{i{;@`f~6LNSbdJquO6|UFws!KNp z#D}`C0n1VttvIHJD|+5XE*j=l_C-RbDq@!U;HiX{&CQ!ruW(A<`ds^|p3F$-9TUTQ z?s&{yZSEWQM{}apq?e~&oqPP9Rr5Jyl&M)w==x)%#MIsuYRZt^ujjfxdY8bg8N4v) z8hsMVzWUG*xRX*G@|kdecRyz&`LVXY+htNvBI_UEHCwv83%-=#2pqxiu*BXB_AKyK zqzJn{e;Ph0Rjf{GNl&^A@ro(fA?a%jwVF_)LFa7;_X7haCpOQ+O$U)(YIcHazpR(k zKn)l*naud{`r9l~v7whP2A=DJ=Q?L}RfAeyYTgF<+18CtdciTj{lR61cZhbPi@dH* zJ(m(Cwaz;#=D?+Ba`W^qS?{)`{@U{=)GuPbp8@@9rpgy0Gq)00P$_sGvypH~S?ojjab|S|ktFhDfObg>c0y?aE_Z zBja-woUo(3zV^-Nda4-u2()MHwwS@XQy#K5vv_js*&1R>R45!i+)nxFrs?CaU|1EP zL-5gH-&?dG15!sKeA!j*q)XL9(_?Ok{T@+w{<-lLtUzn->f&LhV{KTyeSG|!Mm}ox zvyJ-#p={)QynlQOZB%p67qDx&bG~- zD)I41r*$Vad_BKV=l!z2`X?jPzpr^MM~+deScG#kF5!!(cuo+NaHQQQdsqq1V;A3T ze_|HmOeJ!1FbG)*2JN@^PnS^$BGJ4a@{=zHTmahsv3v+y)Lau;j2L6k@C&J8Bm$^{= zPpRw#@OVqHt#Kjj>3F+ulu6q?=Uu=xOg6{4*be_T!bz6lUryR>oRg_;zEFnFjMz&R zdlByFN>sAkiq^u`Qy(+TRTmBfSr25HD$~W^ifSX)IDc+tCGmo0)-{Lcxz(@SG_5Iz zS~Lv zpFs_WK`O~0$^8qFdCqsZ<)fgUSq9faBIhsazw2vy@NBDiuzk~zL2-x$wh&^rSCE3< zh$~6(iMgoh0*FL|i?ISxhqyn#FQ2ja4*y}m_3jpzPM51L>!mE~0xk@=G-ny@cp+jKk?(PyPVJJb6MjE80yAkPDK)R%)kq(CvkW^Ayy1PRJMBc-F-oKx& z_k(j{pB-zhy?;NI7GwJzsF8H(EAkjsCe4Jfomb|42MYY zBAcM7k+d1u{BZmNW3IC%R;oVJ%kFk~t9XASazPaSio}?Fv*6yPA^RSl-YDha9DN+& z`TA#k-<3RLVI?%hvT=8voC4{Vs| z(O(#*bQ8rWgjA0juAKZM6lfst6-prXfaRE#vP?^9-QYGDyM9kR@mx_`2d{ zLuk+G1&wH*xI|Ql=6)(bp%DoETiWG$`qltdZDw58ZEp;*J2G9zCwZn3yOr>&`}GgWmX9|Nc!; zabp1n9?>}A9&R>HP~yiqa!SBwe;W13ND;Ah(~~~D40HLVPcpN#C!xy|+xv^$hT@7=rE>x0!VY4k%L-TLyB2^y!{bmk| zfc3%)rZFoAW4qKKc6|!=B?9k=zAM*r5+6Cu*|C09Hhf@B827i%{~RlXTZ=ve-(d6& zr!|j}XHT(y!UZk)T)EYp(DOwTFw(h59e=I>FCCat+@eeh8Ny?Fq$b+>Rzu2n- z&gPE^6P$%X{1uk7X8hV+y|vL)NHAM|!mkq&wJ%2rwQk0eVE7i-6!rNip7bLeOJb0Q@g!=Z>9;SauF$iiX#_6OCgT&n1vM2}W4eCbUR=%7 zSc?Pyoc#^L7xUqto4#;;{u62iaE%yqyH1waJPTMFZd#rNe_9-9FlFyGsb0tT7)o~i z>%2CH#J$nqaXM9-vv(nGB*ta_t_CCs<_Yc-xNpJgEuPN3kwIls1wiTNVNwbb3s7-! zd^`{yerA;Hjq!|?k)33YkC8Qo{I7wCr<&aC&!$Pp6*Kj7PTS@hi;(8+WyTsDdK;IP z8VR2v@sY=F)eV&axWpU6!OKbT+YkzX^8K!~&5X@=Jf@}J^IZ?4c063?$uwtTIIuCM z^`6`p)SwIreb~mLX!qMaPP{bS$UF;!NwZ%mjCT739vg?_AM$Z%(8jEP2LSWh%T3E; ze3cf*R-#nasP^_Y0F7@>x)hf-w3_b;Ox$g}#_>`5EbeUAyUE~58vzxK%vnE*3_mOQe=tQKwJ7G|0rp?&>Ay6vB-8r;=*-1 zulHLVCLV~Q`yiC?fGfuLXh=!`fa$PpH^63?&+J|$17!5&*s5Y{qIREX74?|)zmq3l z{fbk>6ag%=>alym!}zO+Q3Z#A>J2z+N;C9pOGCJ+p(|RiDGyWB+?J{r&B6z5D24~aE(O_u;+XV;1>V>wBs&R zRxp^HRv6PrR93KDPO~>=E6T`tRJkqnw{J9utx^@(0Rf3M@Q2PT#`n2_BaJ%MZ}#So z&!IDtGLK?bcTh4uNZ<4uH5=KscZR|}ajIW;EC@P2qGNWg-rd#T@Gc2V8!;ovCxR1T zh?A_j&TCpnBkLM!kt8OfmMgO5!`HRy2d=|ymMJv)71|{O7Hr#Y5Nn#!wBDKig|CCv z!73T_)Us5L0UpTpf6y2EZ$IkDJjTj*`*;0uZuiSKKcpB^kUP%}VEdDstK(*#NM}T$ zdV^zovlw%dmtD6*&um%qp)i~nX_h%Ve(I=cED7NLDjF2{kD`*EQ$%v((lyW8`xuK^ z)=b1&!F(E)$T7Fj%@lYJzR24!Z(r9yBQ;6D#k|lA;tI>=o4Q!Bk2)6zSVLpHMHGI7 zKs){RD{Qie|+r8CU=wQ$Hy)T zO=&^btD^v7+eY?*JxA(Xkvm=Zp#QBB5*(7WS=dGCtJC0XU4v)%2!|eqXUed zTgcMR43ivDs|x`jMfcy#@`WL9s4-8;`*MUwp+=2zKNrFa(vwj|3Kj{VLqH}ZNyRm4 zR^;BSkPE8QO**g|iPK?6B2inx%Wgq(Ts(TCNltw4cfOmD1bmVTARQo@DM4Ypt-G!oCN1A%X%I2T>)YjKl1{YV9764lOnF(Dz_K!@*@ zQVCdPDcQr~8Z_;(n>`BUOa?*1|A_6j)ngWGD<6Ze`_4H|HCbo-myy`oG!~>oB-uJBa>rFfc39{bUsJLe}D_88j zGAp+l*Ya7s-k_EBBZq$|PSkuVrPBOI;)+FUWwbn&E;DcXQvLk^-oZ)$PbYr<`I)3W zanqQj5H#NSsng!A(a+E)N&YEWG{&Gh>YKO z{BeE`c@)?rQ@zxDS$$03+8i$HZ;sE7RuV8XbSPIk^JE^GZ%kJ-N_&N{`&P6^XFZCT z!?$=c2FqUwNbww~4Bj=1LvqEYdUJR5=2+*=uja_v8@X)#aItARo6}MLY~BnLZgjMy zCQh5m9xV$@h&l3~SZx~3k@89_=xi+U9=Kn0``Ka5@El#i({aR$5d}W{L z>*^?fk7ARm=O4M&udT=H4-9+Q)SYESM}EeKH}ic9)~F7oVnek5thrLttVe?qUAJ?F#y#7#Gy9jT%r6QRkGHtiQE)s`Ep9i!`L zAyGR_VavwSiL_IHJyKMaED*#aQ`DX~KfP}J6n8UOSib8@LF?#TAlH|bxk)QrvOh6l zd)}mzyq-|0Eb_5mb;joGs!p1m$JXh_v2v|3>^~4J9K*vi68WZj*d4rG_&5TmdKMhzYII7U7e&t6ChzB*2IIJUksOdhJF?3;w(fvL0;+6BUJy)H!*v4XH>GO%5d*`6{-H&hxji!-$~RrGiDPDhD@=>-cK=C_th z-c3Kel3*p}W7kKtVI-MTiVLnZ&(mJUcB-UsX{QzX@TH*zVVjHlKaEUh8?R{z}8)t-Tz5iW7;h$O8 z*PZJx*7M){zecF-5d~a+H|V?kx^6G_*QfS|u5~%<|Fi%n4%BAoh=d?9I5FGA(y0vE?aUy}kT4G#fd^kGwR5Tu+m|nC zVnyhdoDsFf0lg>(vLkM(EAuTlh$(V+sp@dt^25DaTSF6o=p;79F2!$NRmq7nIPS+S zV3#mcqY3x9gk!}0D5Z7&ajUv(8zOhmK!H#_b0XZ1#>m$3zVxYh_AO3RZUCbHf&6cN z-%!@sKXL}27fPwyM!#KEIwcGF6vq>UisLCYXY+Gj0h|OVxxC>{Hbv9L$Yrhv-=d=P zWLdGqG-E!RsLi8N+giQARuaGvW8g%LsQrTen42$#=webEy1mn!bRS^_cpv z7^%jPYN?Py{lIY(34(`v@biVR049yDs;N<(-d>Z$F(f$(M@CG?NDd|Nz*c*O3!K|=)iGQtU? zMy<0qw%cUKuH$=~jrVGSCk}TL2+trX6sLS`rR-)g*Zo;8&Xt2u%s8d7^+f`&jv<_x z!P|{StY*AP$CG{S1KCWZuqR`R%5b*|=%uEI~PJT*# z#g)T}x=2d4*D+j@XOgCeI)PQIi|327g4-N%3QKwVXHWnZrnt7>zXQ#ioFb#6N8|jh z+;+Nr`w^w@GXD{#i>(ekIJ- zugm6Fao+C7>H6pUW0fZ83A zHh^;Lbf_D&|K7#Rtqi=8T@cF~*PbRv`XOs1-UOwEJBCozN0Dtd5}cJcxkl_WsT)t- zT7C+%Nwx=QklC2-QN zy2;Q`-R)QFQIu@cPc!jHx<#{F&$tsM@}NC8nP{$5HB@8eo!H&HZ3`ozrQVh|w4A@eR=A5bE&JD35V$=-D``=K1ljvxz4GRK`!SB&3o~nj9}W{&(4%RD z_kp58tg!kuyz!cQ$hjcduLK$?sB9HZP590t6u}zi^2osX&q3!LmN*Mpa6gdiahqno zYqbt6l(pf`mqYa=@-iw`NxaHV3R#A!JT-Fs*{ZUcJB%NpQSIF4eC*atD0+m89zLY> zMDR|b{hu@>I2W@`hrvot2U=ulyN@zejxElk^$u`VKYqJba2%wYjvxG&$*U^^@U;!! zRY4e(lO$@b=C9m;HgM{s#rez;llCw8LdbvKFlo&ZKYkfK{GwP_>Tb238|c!I^A9du zQjsX>U#nzxy?f6xq(ihFJSI3iFVNj69J~kQDTG~`DL$H?Ry0c29qJq%55Z2EE?-7@ z;1ka6P>lKY)N*Oh*Xz%;u!qFrdlqtE)|7pVYlPqC(_;I|*pWPur@fN*7O}B_x153U z9zZLJ0SjOc3}gM_20(h?CQ~gBv{_G|O*e1?g_Z%it90b=dEuAotBSWPM4_`@p4U=F z;t+v?6tOdy=aBZZbAf+-B~ovi9xPDfI8Ud+Mu*CWpK3 zh^ETx3hS%qDVkf^)3$W_a+>sVd-)-1R$~}u3Sq-Rq2DRFZMDoY)#I#=DN3rvUitfu zvKzQep|QrYhWMZ$t>vWEH0l-jrRiZLr28jCmCZEeWVdaD+`&yUA$LAf)|ZM58zOR=EY^^?02XoE6WI?JSJ7?bIMy?&h{Iy z_Cwc7q&)htZ0_p_6gSH7=iIO{X~$-y>#PYMt&r!9(s5s~1he+`-Vv^~@2Lg_BzJ`t z7ZHEBeKNV?NI9n+MYy)O-DWQRL4KA)^#zt6sDfr?X%LE>X)}9Y|P4( z{o2c)vkarDoB@NyQlyC*$BYe1e=kr}x20?5Sb6T&@VF;`P?#fb#LFHrTbOyco>AK5^I=q|Nydf(oGs{_aY{H*;QFSZ%{WiHa^+ zAS4QR;WEz<(+uxw85R>0`abmg8#*osyejpTPfN4#e~`kUG$?b_YjGri&clQ?XpYl7 zDOhG3O(|Gj%{0KHOp3$L3l4LOFEzZ?Y3TgjW_?8L>#_jK!1a+)YwE?UmTu{Uhj7CB z7<&T^xU5)J0HA1hHgJ0Vhr(eaJcd$T{~f>oM=KT!anF0d|9-Kk`|q(f=iT0GNeRRI zp~%;>K~VSv#^W)MpB{sbE(qPyb z=3i)SOH99{kRvo!=1{$IGpp^Yz%8E!afFBT%9ni9j1o6*7;X%eJTh zX{d)E1j}DMK!l7z%KZ+&|01QQk?Rr?vEm#d=4FcD~Bqm$1@9u0G%EL>^ zDT&pHxq$SrXb;igm1nuo$C_e7JIYkkD7TopcyC}83G!BjzwzY%_E^$n=$STYAD zin^OZ28(33SH@S_fE9QC&6e9+l$)%*$-o<>uyua~#LIJuxicceeG*|J?q@$GLK@ZApL4ig9VP{-f zV!91n7$0x8(Q2g_YY&zF>4m?hKQVj5epx%KzfgW1cNNy*Civ78I1UJ1rDhzf4oZ1SZrL5Q+JT(o*|O8GyBa} zcRk_5LS$rcgtC>(6PsWhH519?RnEdzsr6C*G6)s*?w38@juzo|$$YDHE2?gp@rIU(T_Yb_(C zo`4X^qrbpe&IKWmNvt)};)a0HXO=Pm<#qLg*I5N3(*P!evcSNL2@uwRqKj0(#c}v=Lqdn^uZ&A?VwK$7A7i8!IZGpo;Wi8~|@= zEV$C3bHpW!@X4V&vJsZQ|4Pd6#s*nF=k>>Vnhf~6%uPrp>Hh(<6<{RX5w zFlAfqT-GpkplzMGyTjxFBI$w9#>obzb3iq=SQY|krI)VBSaiI~2Z(%deYR#5zdxv! z^f6$aVh-+Arw~EIltNgkJL}hI!A$K=eH9h=!*unAeHCNw`*|8Z9GK8+^@d+WcehQ? z#|$=_r;RPc?a|?nfaUkNWem`O(r;GV8_@Gc3g-l=De>xE`{_X;iDNV8yV=-BlJMkZ0nIL>=<%BMahN z`G7Ac0ls|U)OELJjp$hqDm4iB;N1X*#g>POUs?f3yxvcb#Gpcg9Ds79h6=rVF{D~1 z>+^SGzKI1D!q-9>bRHOkbL$Z;UZoJ=03YG<(~RJvJU<|!08=B#`2-GMcG{!o@|u;*&p5lZ1l|ZaIT2a;=im|k<{Z) ziw6RQ`X8V`Y;~z_JO1*Gp+nRI@%N>*x3lW~AyA_0M!wpp0MTuKlRb<-n( z7LQU}M#5L3VB&2jGYU6dkAq?l^$Zcu0@g-f;u9PvFzbS7v3PolAF@DqG?2@%Z%!Th z2W0LvH?`^_0ClSAY|tW1?dAUD@vQx;t@AOl4;87K$~-i{2vYhuO5D`!OtID6b2ojE z`I7`-AL1Cj-nNMVf51EB6HJ5Z)l+=G> z8fL34@H>Wi-W8ID7yo3r!Ub6u^uOK6a05KMHz874q3=HjEmRUOVJzmb7xzox=;_@=R*w+pq64cEC) z`6xRcCtif}^bS2*7m`s#BM45ILsnyT;=~ z=pZYG=F{|EEOi`u7U9pQT=rD*UvIg9P@b&rJ1Lb1Bu}X2KLn4Kt>}pK4GyJM3@x(-~SEQH-+`#ODc_}$V$QVgFKL$jdTc&YP9(xk0AWV@}^Y;b- zqCvX{Ru6RzpF!EC?|9Xp7!H67jsF-BJdDYi>vVnFboc295`=ZOv-M-^Qx+$H0j{jk zOw*Befr3c(Q4H}e4TSi$e;J|7g6s-6?hFcq4jo$50mqo9gSOwoN5I3!ubM_#cf;RP z-RYpg#aZ)M^7HQMt$8-< z61xv=l50cWgNMb}`~wuZ*Fo;+8}Jq&q<=6yT>rVWS-WPyIXEXAjhpE&qIGFP*xoBV z(bb_{H2Rg)wDWNXe*0ptJXY$Qb2+bFiFNYeEn0IvAGBp`G8$Y0l`kYuPv=XPNq9Oj0h1mDx$WI zOXC~Pqjm))9NS_qtu25jk# zhkGx^<0UPn#rQ8~Bx#?v0~wA^7$-f=)jzkN%mWE5JZojKB@+2E!a^r6CWI&=QntZ!$QB2FMa#%w7Q%{~Mrq`jMxF3<;+z)5T@J{L%e< zFD0yj)7Fu94Oc3p$Z6JO4<8Z4fbrNKw0zAev)u+lASZd^RACNj0C2L&+*;DGq)4AQ za)B#pLV_|u<%rb{*t7`{YT)B0Kxc?sk!OLMhO10IxZns$AbqgXhXeEjFY<+EwUNPN z9*&sX`ujgwQQ{J_Q|k#c(bD|jrof+pP<7n57Z&tF*5ecMUAGHZuBvPJZY7<@D|6uZ zEWj<%yl5BV2K@rV#0l?G_)C-(GW~i6i@G(@q75K)c;ILB{XN{RUa?qHWK^{CXtAY1D$)1Rtz#u%iRSW#{^*c_T82js1Ki|e5c4*= zqQQ=sOUXz*k`KnsjClcpT={PI92qhYhwyNaY-u(}Gt1#9I_jUx)tBynQy^j_UI*Lr zTU<2RO9-X<-%pV+YfE_nX+z`-Go(DIs3uVc4|9(suKfS~2-lD~4>hoZ+GdX(DkHHi z5H+NPtLu>`1KU6pY|mFR3J)w*7m6NuT&59FS^IrljJC}px02S4K!J3$A1b^ z2m@^cKy5GrMSOMwXvDXh2_(%rqC+Q;ZlOMaeO`L%B=1u4wn&`6U6925f5H%4|p|0aAWDXyZ(R;r;>C1&Z9t&?wbh-HCJbnA1!2e zs{v7y4h16#2_gV~Rn=O{ffVCTk1e!dQ9Kp<>z7!r+ct43zTY6ZaDTA(hx9L*N*_5< z*i+tsd=>OvhQwt!!n`3tDZpC@gDc|~<;`U;TH^PWz$Wa~H{cOOoNwQM|1$E&^Y5=I z3-|UBNv_J!ATWS4h?1)}3$=?S$R(`YxzIXz1!#1-Ar_AfQB#dAl}H{uI0Xdc z9O-#H)W3r)&zjhO;PIy6mgLFmd#^CEAwhhAeGC^G`-10;^CHlM-BV3}K8>zG1Wjw3 zaW;>vJ_iyKgirc#f0?QS{{lY*+kvu*gnt3#zxKYQN=l$F=;T3Q&^7hq7<6hLnB&j; zeFsUNmENecm*G|P*1vId$fY^U;Sa6nt#t z8KRDgKZFF)PU;R)@Kl3NL+IJX9>;Rnyel4X&0PnwehXd*92qz$>`y6ToC0)ZPeJiB z$q4L4qc;3sNMZ$E>J5Z@(PzoZADqjn~H`M^}ceh_oq^K zBx`Y^pwm>4&5Ob%O&sY8m6_p6=jX}-EYcndNk9fg2R>A$hx(DZZoDf23Wl=cRa~V; zb$kt#j8;Rs8F(<;EPV+=yz-b9ywDjiIfpGF-o@3-jLC0@aVyln{f2YnvjwEF|2&PllA~fv3TN?rgirS_XH@Kc_mo?aqxf|RF1xA?g97Td z-1|DS5aw3Dp`m93$PX71pn^Y+1UH0pp}$-Qi^AkVHnM;&SEIMk3<{`*xI<7rfllf7 zes>cg{r1A{ZPl?JhayBzK(nL`LZH6H8Y=6st-P=E9N4Tm-oK+0e+xjHDrp{(ww|9J#m+1$%`6aq^ zrjRj+7bCl_H3~J$i4*Dj-bQNGGyL9W6l%dkmbExkeC*wXP;*0^7hfU@UQg2rMiUU6fMYVeUu}xGXT@W-V>F zn_s)fe^5*UXy%yjxNTn^HHE?-MPrFIXfA6gJ=IZK%)$^$emSO5r`$hzw&9gzYQYmm zMbzES2zjVfftKmlO!E#BnP6zjRigbg@#yA$47{%rc7*$w%*{c}S^qh+@eh zz98*$2dNi3CqBNp*CXjTd#nzUwF_j(7+MSoUXCm2!1@v9F-7&GnB1SV< zC?s@zPVPMs))8!T#u`N`!St06j>Du1b9n_y_Z5 z>kxNzxR1;g=c_a#B8W6#7K>j6sGoe@BJn25PTY*nmV!WpFaQKWcq5?&7novZG#)d< zvzr4#iouCw*6)Tlm|~hCEjTO?Z4B4#*@gCIHv~A^&nbRtoR=+?7R1i4z7-iiU-GKs zG9LS&js{9ujHhf~)p82aeGE|Cd1v3{C~lczJIsx<&ZifDy?Nb=CsCju9v*^(p^a7+ zCi^br8{u3yXy8<{c_P2;?hT;&wxe?SV#}^ZWJq2xsL74Sls+<}GTj*qka&ZZ!J+;l zM(|}2rP`VOo#^?%mj+?xSAUvKK-`)&48)Ljy~+mcl~Ty1~JK=P_2e}J8N_RfpnOd z{{Kje^#J}3>I?cJJbciY79SoG!F+*7THNOlTt{}frjm20I$bO8=g)^X!|}!2|f)s{YtxJaY$2!Gr`{N>R(+Ci`!K zShV`;_kUAC{e$G$Zr%>gec{?`-v#*-T?8t`h7EXb+6J-bKvBu-j{5ix$UqN-5>coD z^f+nZz5>*BoQ&EzZ-buI-F^ek0Gm@B95vP9SGp0ZXG8h9v7#*72b+no$}+(aTxXDw zTcqlMW_AUNw*`oe-{-u4>+#6Qcq0VRdQ)o`vU7nxfqbR8-jqMQ(C&kW6g`S;C5~GZ z-L_MZv4#}VoIK~E_{O!ahZ0FR;?u7vy_SKDsq)PN9SA1?L`n;zu>g`QIsWen_}nHP z#Sk0+ zkq{7x!2l5o8U1=PKKJ^SkFEPvcuM;ssgA1GD?R?H{ilLjCK)Y-Q*L#94iptOTvdlI z=FX98npl)x`~w>ZQt-fI*VYC%<5?#Y%t3Kcht_)(rHCX@(>}>x5OFJNQqQ2-7>1A5 z@c2EvG}sb&l0%E?aQ12$2?d@FW9&?opB<-egA=SsOd6>JYpYbdTo8c?YTTiX=+Kbr z?BkwjhQ$#wN+`sJ58MqY7#rZjestot>oUTpD~a^neq)k(M_shl!;;&=K>h4Z<^5{W zad$hiX~e^R_8#`LUeDXsaQ=(bMC|4OoA-U=xLV_Qe2QlEtKrYyP4upx3u+Nf-O=sT zN@snFBEo}8?w|}M?d4}P;j(%ZvpA}+J!WI6e*Y0V!hfvIoo__zHAfVMvoq()QJ;X6 zXUz45{b{U(lnerXiaU=h({_6@g2N{peMBA6k0C*aFaPD960~HNyfRKktVc)bfg&;g z0kj-b${k5fp_#nEP%M@+IgBm-j|bF|et?c&T<~8~dEtwg1g25%r z*99wrjurOga0)A|Tznt+DoFb4K`NFy5k?7$>->96$e0W8pgBgvirG)-GFZ@R(_r^r zfOS>622I>w>Z8Rz&#x^YRj#-X@>T{Og{KKic^~$yzwfT|%$n>%)a zFdxl^hKE6}4ExM5Oesl$jv#OG;K?E}`vW?x;z&&Yc3-$y4eG*hL@i%Z=@Q(DETi5K z#a{WhfF-~Lh!>YqK-q!|oav*=$?pY7-y2FRD9v6^(`95)Ck|295v%IGPs}v5kPQAcZq96rV${ zT>U5aTUoqFn2$jF10)X>v>}tb$yOx&Drnf`-G367UJ~$OKu)uu(M0e<3(J+eeMxBZ zZz8tIb`f^@koX|2VJr&crn6&+`PKyJ=!vHOnsXCRTrt*lToE?4E`C{lKOKlL;2CV1 zUjO~8wUxRdC->@~)>RCGkxG2r7LS`L-4umpA0+mjdI)W<=h?@5rwd)kjQ9Z4kbsdU z6f}eJ1i$n*d^ktUI>o;G(?H0M0R9-~b%}6w3_+MJ;x&i^n+tnB3?hzb?nf$h2ur|t ze&I_L$a6#fz03D5$7azp-53(nt$+ggB?@XnYpVGDv?0~5b>ywN{v2*_T96?5u4d%3 z4L6;&i?%b%>PIu$KDPx30RMv!r$0E5;MJ>N^S6X8g(ryA|6_dRk*B1W$F=^~zu5=e zfiF53X^SScGFJZq-5GV!g>2?5BKv{m%FkM4 z70&)qZ*SM$U$}SJN%7MBJI5nO;Dim$^7=PbVX{#-ExP%E)&|{z8re;uQWCekzQWhG z3;r<+=&okw{6<3j3D^*K3zRf_m6kVWPO$Qit?-4PN-~SD92IjLSdOJ34+cv3N0R&6 zZjtu#M&Xl5?!|L*uyt{PV%-LKRTFrOcOlevLwEM>hdkxE0YH~;p5%-K$@6{iEq|VZ zff5<4bmYBXZ4AaVw1Kmi&0;-Na>%!8_Ybt+B=k_v6Kd*vC9Y*~$Qi&sjUaNE-B1!^ z@JrVh@^qfBDQ0$!p;*(Cx5x=0*yrKi!{U{WzC_d)8UKuP&vlXwxXR_(QJ(4P1=rT^^&g8CMG4Xf#>e0!OGM<>A=Hwf=s`OPn>4j^-cf#2!0;n%s@P{QB))d@Z}6 zf%}q-NYDvY4UqSS#3HG5Q7`{y;9#VNXJ968KgJWK>sUyJTRvy^B{M<}($Ac%Izm+< z7Dnna!iJHyg~DIIt&SccftmF)p?1pp@(J5vO%j{R9);_%RTy_4-JomnQm zT2xmJSD`CKe1gy5%HI=0@}53~Y0*=dM`@4zNYKWlm#wsM+C#&cs6ra<{ z!@j&enkiU=pu2%juZ%%Ke5eA2`WqDLxwA?IxEsAR(75n`R4S-W@Z79E_BDCgJtoA50dL z@;$u_D4Ifk{1K@)=H*GkPseW@J}3CedV@8koZ~-SVmZc9sdudkLCiBx2&*<%Hs(>l zv>N-xnalAgrtJF=tKc6)?+=lf3FHa{uKNh%U|BJ4yM$7dD_rK#Qnh^|6yRPD(wGi> zNM~>%C#DQ1r7ExZ2)J;+H%naQEryY(NLJa$q=Fv!@-{-L3%$Eqj890}ihil(MOWZl z3=Ejh_;~QQvQ?IGG!!Hsr2O9gnkzg<6#S~eRn(vdEa+4c5<~(F&TaGRZXvC@hx&Kt z#sbp!KVqVw#Q@ES8nso9bJ|LkUvX1Ram@VR2CpHNM3_>mM`3ii^%qYJ;4;NDN1y87 zq+GVBd|b{h5UG6pu|4raM&wKT^E9iIFR2W8f^^){e@g^9by0cFRQt{Ixn5%sqKJGx z3t*7RO-e))=XE)R1mUE=KG~KR($HsG{Pp#9jfk_2R#%%WEwMwE^ZI3Z$N3Nl8@~w9 zTe*&VB2`ppFs?zd_glF%Qc_Ny=Do+K41@>3XKSOlD#ni;3FNVFny`qx`KHk!V*v-0FFuCGd+8>PQqXY)?xl4&i5*s}P@$0!dz6-0 zxiUw3-+ciSPzpHaYxQ*uz^8N9u7{n(`#rN9r5uM}?KK82IZ0lt-FLjAV^&5@_*L?f ziYO~e;;RKzzkW{MBvFoNg8t+xikx%9`5U*$iIe_`bpJJ`sVc zhHN(C;<^7!{I9bTd1AkEv?45}&jm36gWC-uQMgS!ZBa397B!CJI%HA$hgA#Q4-Ju) zfXl@am_LYea#hZkM-B5xryI=}(&OL^I$m203N95`rcUkc{p9gML2lAjXZ-USW(i0u zaNHs3X{`iuK$WZs>!J#GAswvOIMER7&pz@Mv4lC{ubJVZH|g@AB`|M~Df6 zW|P&3t!qzd&>^vPTs$i~xBFYOgeTNoDeiR165rQ<*KMu9m6m)^l#QGzt9@p~vUrop)G`ZZ^L2kM^U!2J~sNV=(T}5fgdXcDNXBj7mC=s_1KqX#B$OWM&HNp)0TtV-r}$ z%N5dE*N5?pp@sF(s8c33^XK>VVvK*v_DpxmaG+4g#;_wMA6b4sp>N5c$__oQ;y%M( zX{ITUVkgyJBuq=Ev)Ms^oNQ^?WG`D`&$>!R&G$(rhN0}#PjPSt=rEu3?fz~1w_Pj& z`Xz*M7}9yGQT__Qj;y{?k+FU(z6Y}(@gKZL$XiL5K&i?D2GH{FC=R|^JNYobp?I0~ zv*+u39q)j1Lq_YjGMj%UV8Q*3p$a}}aUN;!E*J-ZD8;JwI0st^^s|njuEp6gLgQI* zVj5Fo>%yoBH)#B{tP^!U?BF!d@(aWN);~W%hCumTM+Ic!wP3>^^{vTrqfSPJD}0Qt zadm$||50^O`P699lUCbM$TAmDwlvd(6 zPYm6EQiX^rGAHH~#T?1s?9ZKDMOv1+}nO&WFUQS5} z0S+efcnwQdx+k0Ug^K_?yo@?nrT+Vdh2ccwp=G|8Q`!2U#~VZc)0z9hulKW6EP;yw zf7kkVC1kCx1%V`luxP4feD9n7J%drDw`aHbUanPZ*xqqf;F8sgsg88#{-M>mLC*u< zmPhVXS(PXXt-G(#l>W7VRFQ>y1{sC}zs$f8FDIH^PLLMH=nkGV1Y~jKlXF#jq+$7` zu1pb&Hl+nH@${q$xr{70Qge^^rmk{z5l9=RCzI*iO#F#Oh)5fT!O5b5ll>NWaxP`z zz^cX?{M^uGoRLnHai<1M)SxWJ6f8#m0mRRHwaw5UNdlVT^r=B-mw{w?K}zSZ|D8Tj zyKs-p=!t7JCR;5HOm%eRERHE}`=KaF5Xi51W|I5G|GO%+WC-pnjmY+Q6{FXI|9Iab zxhlL*fY;VLNi*|7W2VYQg$G`2s~qLhQGw#r8heBgQg_ZW4*E@KhG`Fm>*qgwyBkBI3xvGqP)x(tmmn10vSC8l?V zfLQS+2a_X>aop}Z0#DcLuRkDh^yc36FTe9#IQ$lcNdBfT<%aJu8wRFEzWy~0&f|DW zVa&`h`{me&>4<03aUH%#i>Vth4%hu$GDz0%;%u!v>gi*Kobn1tWn1UPE39 z{)-(g<8z(QT*|I{6m5-#xHY%*W(I~tgI`WTZ*i5&OsyqQts$n$c$V88XIaV#erX!l8tv|~zeMD=-9Fsr3Mgu8DTZ6j}jjo2n7@fwd zzJ)lPE*W98UBRuHcG`FXSWBh0MDLzGj7rSU%PY4y$2bC|8^B!H-bwvwtfsQgHhbGX zL_GA4tD$-wgRR6#T%Q|I5+)IwiW0qa-|lkXoUZR5y##o(=1M*==Hl)&hVslZS}*U<@9@3EDE@91 zEzJZHl=?6>z*?#3W2|zd`=Fb#*k>dwHU6kZ9FXl#hDu$jy$g-}>UN@7Nt>ENq5=S{ z%TX2zW#Uk#<6l5?tn*CTR@Z2LZSE&z$P^3(q(qN+GWV8SsRt)V0)Oz>fZliK6|=lD z58VMI=!K$xtu*C9kHo9WT_dErkWNNj+&w0{h&{mkd+o$e5-_R;3}bjG-fJ}1Hp(*Q zly|y5GejM;~jYBZ_?L}Y}b{0%epM~ zp{t?n|F!qt|5QhR;P?$0iMo|2E=3yG3Q0C8WM=QxjY!DeyCQT^2_^f6YlmyE#I;u_ zuD#c__qaai;{E=9ACJ$U@Ohsf@Nn|iL4vw5n^l&4mUf~z_9S@=YS zIK3Hg#e+g^QywuqhV!ftWd>f7~;lp+ul?%xsq zgxK#CPTrLd1>RGN%7xsMunj6^x<(JwjffN`b|r<4lJiA$M1u;)I?ndC9*Pq@GD26a^wa^<`| zlN%Lr4gFO&4pg=bS%FT>pI0x|31LJ$=Z*JSr5fH{Kb0i#i8%%Tm-YOTykym;)=Gp& zU`%EoFTeKR^Ujd!aydrDubGyh@2_dl8Z4bAAK_n`6P(6$O`FwHZ%ES7NS78Qf(P(F z3PnG#iVx8NI`R?5erDO*)o%OTrR_(?A{A(;0lg@yQ{+T$;2>AV=S2%_g0KVx`mDlw z|Ib6*;ow%efe44I1&>~OUf0}>C*7cjZCNDkcs!A`u(vt=M9+hD4C`2PUsTgzu>oQuclsv zl8|0f{#_S9MLo#}b;=wkAAL+WAaWigbyu?k6_jiR@?>D0wKDg46s?tHpZeKnT(uYc zHZOiQAPoQPYWW@ba&_~A{x{p zyVm>Bl0(m*Y_1hj+dM&M9PJSEq`dFlI^%^I*SGh$wBj0CG#}YR!bQ3;nMJt=Vn3|k z{yZ-QRX$~heB7cJ=}6ka7n%UFvof3BoF>y5eIVH#@%>D(3)6TeNdLJA%*xUI?Y~v- z_E+vbp_BPt&TCH39we2N;YKM;%p8?Rt|zQ0UimUpSd?(1a_pdrFt7Dj-I?b6nkeETov5F#!vsz9Z_h_|6a-08svHSluQ|Pt-LCb8X<*DLZPlq1rsl#i%B{#4=r1Y zqYA}>UbP+ibt{l*KNTJvHIXIL2@(yiHTdh&`uqHoD*rTucvGw*$N&d81RMds5^~h@ z|4GMOrVr8JZFnvqE7@0eRzb4QLEnnFnW%){R~O=htB&^bq#fipgX6Fw9*6Lyn;T8i zS?l(oOR^(TW-~5y@p4?n9flmPMln3Fy(1Ir+fe(B`iiK5wZ|OIfHAk5y7^}|B&qK; zxdgXAK}}bg8iecUAn14HTUi)613LCyf3K3S6!!;e=2uC`Zj)JmOYQFNpN-_~z*P}Hj1QjJ4){V`DkE{J zpAS?%goK7ANV`$hJ_UwiHu8`3q3(!r6*x$v2thYmz9?sk&TM?OMfR zY*V3!u3FBuGYwIE^^-Ag06$dseA9gD`gZN`_FUtz-p=oxwQicr<|LI*9t1QFncc7r zXGUW(Q&SI@p#e9tW-fAS%U2NodJoQxvK%a*r53yWnTR#qyyhKNRv(?~D7M7n_IV;L zaT6$Rv3L2_a!~v2$Wfy|KDY^RUB=9c@qUl-v&-ZL*DYm`#AYCBVM<;`HnViXQBu*; z-RXk9Eeoh^CpBHRBh&DWgm1JKVXwQU9tv_ zO5M-IIFNQv!aORKl9`hhChifZ-H~Wd?=*2|rg*4d{Ze4YIh}|a1NGFR8y2>6n-!N0 zvZ$|&^hecrEI%^;$ReMce1|lh{$r|Z7=!|%5%HDcE7VESIwsvipT<>1JW}#nlDP#L z2(j9Cf%cAq8xCFZ)@VvGYAjTWqJ20wdaD5Ix9N&B0fb==>SeCGaW5`AHm1cY1hSLB zs!?p|p|~#H;dMA!bpSY%(yJ}-epIdT*|7nuZ-&C=QQr?y#s}>Ff5YW(SPVz_6P(9{e1a&pv zWQ~=5)Jk?LF(T+2cG3Z4I;iaCe-gK5WP;z?*#DXJasCwh`F|Cpz&!{F%9~&uA!!Jx z+UZn@wUB+90Oy7sr8T!3cbM+TS8ZawM`K6mIDg{=ZIsk<2B@aGj(Da_CvfMO-N?}` zPzX#8qVSp3_IWRgzAH$~3u>s=88nxIsgM`Hp1I9T<*G=omf@OX&~V_JKnl44?1D=| z=T~3GwI>H%bI2ee5qb2v13m$B%TEI4o7=Qh$Ehq?wW7?w1rp!h%udH$n@YP0P=i0* z1Ka!{AFzB*!18YsyK(1MZf}E3hqC9NN4g@I7q~f1Y{>ui68`bTu6?A4aRuzM?S@i- zR=?G|fcU#?`XCbnI8*;HYnqihZih&H+?tDVW=|yZT8Z-65c&SO7SizM?DKDaylcZf zXK2D>q!#$Ej0j7$sB&L;9XoK#j3ycjf4D9V7@Qw& z8uA0ni2^X9&s8g(D$zA*OKAh3c`ZR8CqcR{`7iqq!#vN(?HqMf&o0Yhox`Pp@Fs8& zS??2Sn}_5=4eR?rZWy7>_)7Jw_`ibNR&0mmF^%KYoe~0DHMek=rBa%Qz6IhM~S6TfE zW=9o1*dDKPt&Ax}Sa1QBTX;Q*HmB_+^r&*^3CAsCRoVMef%0OT2B6rws`RN|7Gct7 z14e$-)?d^z7+gyMMiZiYK8)J_Z3#$@Dqbf6d97iubrZ;b)WKp5g@2_IlbcpGL1JLv zAHC@Lo#Fj{+%2Dd`u44IS~5Mq6r;Wl`K9d^rmue=-^5`W73_dNrp8Tm3knk9PsSTC zK@NTNA_W$ZkK9CA@xAk3_lB8ZhW%Fa)2HNj!UT$iDmW{px}4ve{U&s@@n!e^WJ*Eq z^X!4RAh7YAB3MI)b~36qH{CsHEQqqDa2Iec54~CbtaU_GZmp9KeEuMP9H%!gt9S5u zH?^k+>-GwBp+K3=IVFm>uV{Rq3CF(VUF!ATQuZcJ1jhoScmAEj?+?N%$HO=G6CJBaP-AW# zxnRy|?^Ajjs=oCColuK;0J3cjqa!%=?5tl5S16phNDqPz!UnexJ1=h~f|8$;ar+%B zcH;FcD5JOqx~W~dUnOvr14RoG9gm6)m|c~riqB-56#YDHFbzlCH(@?^8`q`xuQ|xa zic0j`B_?2ce{BV1=rjai)CSgcuZ;%iG2c@zZbHo;EU8468`|UL$|dkvbA8auSdIs= z`b066+7Qh&ejj7Ms;7Wx&?t0Z&PYhG(9v%Ki${} z36I-VfxDZR%}8`L<=TquG%ZmMnBCwhV9GA@Y%a1~u{jX!ur(t4J81QA&=tTYBZ=0< znRS0rW$z3Dcaz6yFgcsg^EcD1S@GZX;rnh1^DmjLqYJ$nUB8=MA?6gH4AVRIii^3x z&fO6^1*tyW277w-T%~}psvhhGsG$>~`VFqZDf-UY{Kc7lu<@Gr4el+ndG{|L`F|7^ z?-?I_HD*!pA>EkBV&uuLavHB=Lv`ohFb$k1X!P#=8GB}060r&b2riA3pPcJ3)?dql zK;o0$+-~{>11Oa7N-I1E)|)k$htTWtLbImkS*$ zIUg|!I(gT*VU5iNm50XOTU+SE84-!9S?<&52I6_7JKdkCBRJ2Ah0j4ox3y)qf?^j{ zw(5<5z>0xicE}z{>+9c5MUhp7%niN+SM|=$ocizF<~h}aFqc5mo5WOE_yZTo^rMz} zcGwa;!vZ%Ml%6{N%Ayv%e<(<=QzmaTV&pD^>?Jkqm^sWA8{MR(jHoVwx{i#fvMJ6* z7TJ_rkZe!ACFCjnGtFUHndGLY_BeQ5BFpLR1E*_4)fNsu1j*`q(bmR%#?x?~e63VM9k|%7oIvmUw)PV1Rims7i~0C3 zJ^S2f7e;41Xvz_aJie9&%q@8h)B&fO{6&J^Vy}NMfyy0m;6#AGPK&Q%;xcA#R)h!& zSTOFfm2x5^g#;Kt17CAfnPuOdgTt}1D(wR*GUmu}fC@IjX|-rV+!mn)W4+qt_E`3D zs$nDe^9#4CY>Yo`GiGTKw1xc7UeABz(r#K{GT{U1{;v5GjGm;oKgRFJg?*!s4op9# zjpGw5dxiA1&peC$_0~Z6^0{b^_Jk6|2hz2NySFOW*2cRZCfo%S`Ak-r{M!@YQ<0b| z=jN+)QSRJ&p(jMFgIy|p$qifie)E+};%B|V9>g3Mn7Y~@1POwfDBYa2!(!ZsHA)>2 znF_*JwK+?_7tahtv`VzWm!g)&^6PvIu`y`b#T3ouk<-poPz zXFNgieAbOuQ8(v6;14uskGNm&{;+cT#omGF7LP$k=aJwgE{U=U8JbLA_ZYGQs#5NO z!m+39n-g#A+5UZ(>WI*hajzaY&IQAepIQ^qOaD~Sb~rp#!G(4D?m}{y)*!6!%Q^SF z>3YUCm5^Q#%7S$gLQ z(UikY>a3;<#YGrY>Z*VHr*yAluls{|<|5%hBe!A5Bd20>k%r;d?)aY3&`VLM`r06m zc-dvBkN3KeEv;rA9`hmp%|y&MdeKdcXWV?v73_>EuDbI+-VcmU$6=G zI-8UOG&!$SLNa$WZ>fp+)j13OLi~jp9Sr936}vyO$>a?D^ZXa?8N$1!BV^ zf3%GTL&23jT!k;5%l6PhZeAad(ju(o5GuCcnHMP}u<7|`sHlv{;Ze`(vipoa5|?)o(ltm2hvL70u|gEV zRn-golR1m)VVmDX3M};U-1SOE`d9vS^2!(+_G2#7`61Cyu@Tmf`F4B`w`bKW8)H8y z7<&&@txrzVv)1Wz^#!E$mmY>rK7DNN*uH2QzMKC84TpU&MU4*DXLPAbgs>SSgyRkw zve(rP+tvetK!iZZrvI!6r3>5l?0CyRQsiCAvA4+*v-aFwmO> z&Y>TtSH4I1le#(Nv)dh0A7b)yXs34iaoTKq*K+>wayRGCU`5BXFaelg28P4#_60Q` zUOa+{#<8V99-CVxOKL-$u-egUw<+Vr6vG0grU>K#_bBbp$Y5JXxR#16DU42&L{G~o zLl9RsoL71LF|WYV{^*)MRJEXPCuQ}(%F@_=U^?F` zv<4g9{=zYcopsFSW$_NX}Q(G`zkeR_n6EfAq?DU!tl5{!BSrbaTL2x5hMimREmbO=u`@L-xK{GN6chDuJ+0 z&n}_Es)-Gwx%l{{JEtJM&2<;QCe2xf9Fkwlv<_)qovxC>d!_;3 zZ4U_a-fY&i+!DJ30r%Y6G@swh?&3X|&adT6TD|zP<}l0^6}7ty>J?j}n*hSkCuer& zsT0(CW=|VzZ{!Qwrgc+SYf!p`SNMpy?JD*!c@^3`M_*zx zJAg+KVnlzCKyv%vfZ{Spmh@o7W=`ZjSB@n1ZU}&?11qRP4zK$8wn^*JB?$+cJp%flZT?xuSly>@ zk#O7Z0QCevm4N%Y--zg(Iow^C9b?Sb53p_el8kSfiTh(wrdA>bSbf>!`Ec9A;ltwo z*ALWJ+t_Zo%)3jsp@Um~TWcrjr#++T&+gvIjoKA)Q>KBKY)}Gs_QVokt62wc+u0Lg z)DZQpaQ!B}?Tq08uC5YXy8VjtVX}^Ew!WvbGz%L}&3(Bu#WM6ZedSgl!(jew@#tX2 zmcqF&6|xu>p=@WHNeLyv6tB=x_p^a2284OX;O!Y%l?umc@S|YxHAjs97GZmy_3U!% z&w^o%xc0gBFpK?xxz%GLRCAh-+>C-d=Xi-b&^QmAdu(=l>tBAa}%s(}&`bIGbo*xpw#H$M1%fk2tBaqY;&Ta=xFFy^`RI^4rjJ9@gv`j*gihBNQT$bNU({UbdH5BwSbPaE}GT zF4^Hl&~62#V5ZievItew_<+gbxM+N9JhPidM0#u^ndWmo6hJyKGLbkllo=!%Tsr(k zt^e@mY;ULYrB2@N&e8-?Q~i+5x6?hAR;pehSF@Lv7avQGCIhWPLVRTmtNKP1Tr6FP zOf_PRVis~sJnLk@;N45#=ZxB5Qm26_5j@S6ML@+a1fm1m3XUHI!n>Bo;nZFAUocKo z6#=iZv>%ppV5vH^5D@JiiR2}Pbz+udasFLQ6Dqg~4t^T_c zNce1tdrhG*pX0OlXVAxOig62-A$B@=Lk>#ufUmi=O&(Evk%^_4U3 z3v^lfM71eWNi>Q}yG>hjCg`;Gtj-rWpTb03SLo3ceB?Dq{UJ5TlvHtmnf7oTYV_A- zuzx3;n1aIS0=)b|UO<#^s|j1AR9KQz^A?Lw;*55&;I`{t^CYcD`C3Ec+U&IsyTzH! zAAmPjEGm`@OFVEcJKO@SZ|~di!9rV==-P*XO->qm{ts{%P3I3+H5EXN=yf}8eBiYqPQq#hHonU6oqKRDHVY^qad^RwrG+Bhl0#K;VVPe{ zr1|MxcKbjH9jZO88KL_ueqGJSWrGJq2>}<519MUXcH2dq^VL?B#M*~vo%Brey}sE7{8o7TlA-g~(|mxp`B6 zyq&a1YWNsu$1kl8jX8cH7BBAPs&^u*}b3K~?*sQ_a)rN*SShS2?Ke^&n@o-d>BsTxJV7 zkTt@45+WoY7om2ic(2~qQYkWBn#)ph3$3?WdYYK*#jK!(LM-eVtle-DJ^Wg1hzU7j zS6|vIg8m5siql+zK}yaqnoOnyC5bhE5Blf&+B&Ny=n7}FHq$+#U8E>gyHUt2;%eE_ zAw7<_pb}MNn6sdkX%X%|(k`Zl2%eZWYjh&8hc4IoY+G-s880ajA*;h(*S;D2vb^kt z?a=a?8007GKuuHM>|uFT*^WJQdAsqqrtsyTCd`o>lMWeOylaxO8??M*kO5*hX&fJ6pUQ5@GyXa2_-JiUunx{=J)YLZo5xYnU4=<;pn&L5 zS9D8^ekX?{WOmtQWp<556+#*S7viv*9%^@y_~+`z!8)Xa!dzC;6c(nCzx))H?7@(- zk~y!9LNuZqGE2fd(tX@c*7ISw~A^=z-IZeR3N_U%#Hli!=7XyuIKWeYd-F z6J_bGDO^wO_-KB>A%m5FUC|teO=9%N0~SW2!}l^4k%n6PgVII78K7Z4J4Gw z?`Tb7bLN?}A=3y=;V&4xyoNZOu8iq$C-X=gJxHN+j$J}kc7wPDaqzPZ)bzU^&Z^^} zE1jM5Fx`9c_5N;-`nfqwh!#MXntb)I6!_}kFvE7yc?^g3IOk8i{JaofI;(V+1TY^3 zj_&paI)v_pMU$-Z!}avRAXk2X-T>OGmStV5f||lF!wdjNv($)4>@f!R78-XHT!2(( zQn} z)s$z$WdMG>{;5$@ml%P9i+3=rV*|^m_R_4n6l?9dFj)D$Ryb_D&@kQ2^0}4%-DdzA zrGZj&?O#=Jk%?7QjxAkSpxGadmQR3GQA65Ql~o z@3VrZkJPP0zpl{hq7W@j&{_}0erI;ztszn)aM$2dZF0IgnKvz~@(f9&**wr)d6ZiL zu!`=boMF_lw&VBt0_H?&XorjK#-doK@0?mIKo72VXoRDlE z`tAc3-NozZbx{i_BnjioJE^*;uc`9Sh+7UroLwmf{pVtOXNqet%D-bb! z+3FMV5nSZ%8jF`D*wo1hWjKb?&jj_B6ai)TJ5D3R(W30*_5Z%%`oJmKOQ*u_F)c@f z8CpnTJtCYQk;oqyj&Yd2&qRu*aDkyNx4uE6m9)Rt`*Ky!-puDlCCRve86MsiSXwr9yU@s9!MflQRJ61N84 z_E@m$CcDdB&g}3{OqILlvbo1F_vNH=kqlrF-5Jw*v_L~4`t>0l0%&ygK~omL9^$fp zg9D6CxEc(HDLnbl6R*G%AyUg)nqIYLpqAF{WkwOBqd=V#wuanvqu z-up;f0TI=x*A$M+VJaG$%hA@j$Q5MPurSb2fO&9b>EA9JFccHv#szV%6_lu z5aS`Z-u+8ijA|*pCbCy|U6-SR@v@tu`%N=Hf-5rG4VXl>En@Y1DDODgRH#YRj||ZK z{rlSBVD?XdPJIJ|G|&CEthoa#&#*ajRj;nit)Nf?=!v7&r z_+{78d0v>;L9u-TybAjfRW*YmXxbiG7!XLaWHD*I2DxbP2+!7*(Dp1$Df{nL?$6$1oBE3y3*7}Y<|FZxn>9loaz_Qf(@q!306 zx}du{H!Ve~{%;UQE8uM&8Gt2Z5mn=(!AU<#`{3P@1mTzRBhT|(*4nfcNqBjD#1UEo z)V|rDo%s<5wW|a^n*Z-17VyxIB{9OUw+HvREXQZ$l-z<0`m+l@vb!dLU?vfH!N)guJaBTf( z=bA;C{r0|Fq2YVr&ijYAh6BpY;}%~;5jIPQkEH}eE95mrOG6|!Za6q718T>80%t@T zTRa>Fpp}?J)2z(1k(0gm;dmON)n9$q&~2flHOXIAenneD zuTaVUjKd4H--X~LlFbcKh^yAxaICHzF8n^JIs|eyjo269X#X!UT8oiA!kfJZGRF(c z-30(^8}eE&X|Agxe_>b#hat#?leqPgW8$TaRL^b-t_%(IIQwzR+fiZ+IWBIFo+EhM{l$AkZp7o(Gido`CIFe zr|bHJY_K z8o~vR=ZWX^Xn+S+u5N?Q^B1L z2|eQLdB9Y&^X~1B91~hZdHW37p5U(|kRA#%ODu%`n1gWHa&MnaYRj?J)J(M!crTOxU{~=6GWwQJy0I zR`)ToLHL1?GmE#wgI0G1d@SIP40q#-8^UdU4@2DZmj`Blh*qp>cTLQrn(rv&0 z8&C%8aELplcPUFd`|)qHED#bT4if@+MXRA`o{&YK{iwIVxd*SyURBsD&4bQp#G%79 zN;^^+a_hcevv1%_=6SpgP*=1gPo#ZAz-x-TV`J}I`K5bAmCK|#Y=PdE)?sHoXnT@3 zF(Fe-YT>x@duk`>UoXat-Aj#JIQzfM!#9@71@axt4je6Rlb2DxgP9=}D3;kAxmZ&C<+mi+7sycdg_uVJ(JTI^n&&N&et zx53&RG~bC~-u+^(ix(`XE?lH}$P^$M*mTm2FW2aei0|7n*Jo>rS5_Ga4=Ua*wG8q# ztc*x&p1=o)z=mGnZhveR#y=?w-M)?XF2|58{o4qdi8_U3Ew=-~0go#!CluKb{+c59 zbJK|I=Pbi#xA&pcw7v#BhhmhrkNT9^$xd=Ve4l_7bKn8YM>}NCYLdise_ur;3@aSy z$FZL5NsH)qJ|29V;esdF2)Snb>jb+XkSiA#|MQiG=-2=GhGhN!@5!6MgM2)~c}Gw7 z1Mv+7Ksg!D0cD>2c@6QuS3@BG0|-Ee|6vG`CjLh*f%U$lcbUwYm|P7vF}S$wqzT|l0pa>*<$QW(LzEcWhd***i!aoq+;4o znW2a&%4Eb4V;S3f4K2U>e(w8zpW`{6_rJH}=xCa`zSnYI=khr}=lM;rvM}b|2HD2K z!oqvP#K4+`g%iQT!iwhN0N?Z!eaQv?a0i&23SwcAmt_9k5>~7q!otE%^+q@ZJD8hk zx%>OdyPorR^NR=wTCKfpCxTao0R2p|2;d6Q%_w@bw6G6%X^h;1{G7rYo^AuNL^s{2D4DzA+@& zM^^&ITu|J>+)Dho|3wdRb$LZOcLfCnadl1kbFOZ#?rv^J#FZ436rl<#P(>9v1qCf- zO)V7_@n3%=z;YMQd1_f382wrd{7+Znd~k4p78Dv98Y&;EEbo8O3#zE8sR>n3f+{J= zfe~^+;eNrcVRC*!lD}s#@Cb6h=p7L3?e8bfoYB?I9~G=C0k*n%2H$``)A|Mdk`s^^ zG|V*sswl6(Jk!R&bMAk}1)wfo*jW6WJJjQXhp&fUa1a=)_-AaudH-Plp!5F!&D4K> z{tpWP*_xaGS>wOli?8pWC4zztL%=b93FN;V9fSxE@PJx-1o@*bx_cOgfNe@LPZOYZ z{Gx|zu>VDbzyF2bH)ZvE%i>B(@~Yzhn7g`r`!Nq8{jWzn3|xafbS0SgCa0(%r=*Bb zRMt{d(^A!xRZ!GYP}m%5?tjkPGyH!Ys;;G~uBD*yABF<0Ip-Se`u{rkoV%8%|3zO{ zaAa>^S1%7}fS;Fy_#Z)P9rwTBe-SJUcBlOB?@t^*ZgtV$)B6JWA;{YJnD`09<7$eU zYHD&y@`@YVH8gVop!a!F7h)3Sr`<#}Nx{8vDlE*nYPX$*MITbZU4LJ=} zcQrXhS9JvsB_(xtO$CqN&l~u=qnJwY`}uR=c{Me6Wi=&NcR3ArWkvA3+BrE_O?P!U z4^4LZThQesM zx-$(ySHhjC0UqZhetqrzUr6A8?*yCEhMxBTll~8Su{kWr-!nMW^`ZyN3rOpKL-U~j z-S&fAL;mN@|LH=snT8NBbrD92wl34Z5vfzrJC!{WS->7Zqz20`d~S(QrE9{cXI!S>P_9=iNK=wovC&384N71)bt!uC6rP2ZT`fCBOcx% z>UXxfyN(v-r0JQeoScSr-kcGZ2D#GSeGP{4{+wQsV^PZx-1z>eRk2av!+H-Zr+up7 ztg|=A5oPGj$=Ga>dpJ3@*+|b;@MRSoqE%CS2`{KFzh`^C^-CBbziIn5kzTBidA8T@ zeUEcI{U{1U?YCVnvFX8IsU&#ccnMzbYUtNw#$8XFwX|C zlKCfA#@p~|Ogjwa>PWye5rT1~w%3AHwWvS!p=KX@P zCjb24*pB1rB^Dr0^kVJSSvMx(!X4bn!^g@=`gYE<^vi$x{<;7g$pbN|9;HS4E1nl| zUy2Iyn^ev(22;~)UvwL9?h=-^82hDVBtIhE__f{fQk&F-*T1)Ko`|jBa-*hkcYP>8 zJ{c$4icq9Begk?U-2PAqZsjz5vS#0;RnPugTsLB=Dqnz9)>kT6QwaGd+BR1PsxYy2#Fh6=V)`euvsx(c z^!J+cEV_Ge>dO_Go)Mik> zZEi)PNOa8X-{S(!!8n!P%JE?2t}-+_W_)Sf)J*ryC{B7a@*K4~l##Dh5x5~Uo8ECE z#(rJC1a9w6?Wt5MW+qrHEI_MvBlv_0T)@x&*srgxyr0dPI7U^rf1|UoF@Ob@w#N-w z4};N(-_sX^k$1sLAz&r$1N0l~QDaMZiulGjam=nrt4Z}E7}2qXo4%wATJ%>`@_O=F zI?b(^Ce5$9@G181wix+Z=g(T{zM%;XR-Qzx(QJF{ni&gTJvwAv%>rj`Y}wy)!Z}GN zj)QaR^qvUULLDlo44XJsUywfF_(_cJH6clrvB7Pu4>XhrL-l>mcf9URB*jN8CYE_- z*nOWJ*Ut-&X*glBno?TjYPuPTcOnwhFgNbLv?#>Wi*7X`g*8e->ff_mMljkGXx8S$mns0p-S4lbe`_!kcba%@2I*u=svkZy0v+GTW zHE{5#vBsGl{HTu8e^2s`o%G;R#+nKho%8j*YUd#Waai;K{e>kt`1xI#-?Q0T<#1)x zW*X^=TBodl%iw9f8?6=~q4+Ea5w@A}&4 zIHgnDqA>US;lIO7+>j?fm`N7+L98v~G5w1lizx(l0x^c4UzHDgQnJT#V`-o(*YXDh zG<|9}j!aTEj$rQ~&R- zYCEt!BK?DkB_T?)cO?FOyTvfu?Q-4_x*+=%qOKi7G|x!4YhaCs&98z9)4Udj)fmZdNTW48L$$VkdAjh?HOwY zm*N?-tP)i211M7aHO1P;J|<3ra7!TeSuxb`r=P!^2%GIOPSRzore#xdelMoE3akxh zYDIWSE6ghAo=#FkM~YTiuIit?u<_v}-_?BZCOX(L{P?ZyTRbirnTf0wtuR%!37M<- zcO)-v_e}6(Z=ws)2ZB;9aK3GsE1Df#x$@QAf1D%RNH^)P6`i*duy#K+-b_%THpNHS zndp9r!OWU1JDB-;cp4fLReQm0f3XefIsN;F5oVL|n8B*KRl_a(bPB0rPFJqLdGxS< zQwW`AY2iRW{l=7>bew8ysW-T=vgt3uQQ1hjY4{nlLXI=zk&XtsQ{pMup-US|VZSn% z+S9G`D_FzQcEV6+A*xAf_(PV3xt_V>N7mLm%nJ3IgG^TICo-&m&uGerbMM7$0bb^W zS>fIYf1*SQe0|d3{=L5nQOrs5RxW{)Gl|TzHT9?|5WE~!v6_~|d! zqepI3Qj~ugpS2NiV7`#r_;@6Q{)4$Hl}`=W$nKs^WC3u>&3r9|q^4&oRON4Gg=>+| zdoco)OeurwXjQ{W+SDh;_5=CovRouTZl>BmE?XKfh(++Qd{Zri`DCBjo0K{n1w3 zEyoUUveZoGPRnwQa`q}DF`fZ&$pYiFG>N`I%G&#{!H|Aa^2U`gX5)d+QTc94zE}cB zTiKbkI(%e$bKRdquRWdhe{H#T_(1J$rJ}V^plm3Y@zcX9)Z(yGc>PU`msz2_BsDO) z>d-GeaBRCZ(0$V_&qz+90E7_j0z2KLCi#LG{ja8Ef_gH>e&z9>TdA-$@%7+H$~1~D z2?w`PH3yVN^|L9tSArV&=R#^Z6zSs1RkOe`Z%b#M4%~)$DA4703FKREA|WKxsI{-q zKK-|8ldc>`sw*ccGJ{Rxsqy8g8rf(e&7=s$kHFF0is%Rxjehkf)=BNP7F;+X(jQYy zE50Z}MH{rduiw#&ANzr>)LlkPYWK|WRrho*sxJ5$q(0S2GK6OUO2 zmY9F(76d3WfyZII`ILzhiO$%xd@fwzb)v=oiRi)%ql&Y|{-j>a%gVWEiBG0v!Dr=j zx}^H5zewozHKLv8&ey=#0FAdBFeOv&fUsT&E{P+@D7yTTH&ITKs(OI_RQ1noBF_QK z%eb0u1YGKY+VnJh2|P!qPJlmUy;-_mH z8W774pkDsDLynu+);BFLHtats20|xGv7>)N?at@q-WEZ-FOg-g)`0 zh-zTxf~HwUy6vg6X0IpqZyZJ(vscVU-En4_3{2K>ym{h}#n@UF#x%!!6OBW*VU6)K z)3-18Z|1>At>n~zuz+uZ_F~vA3iX60nSqC~3NHVbE+hCiVqV$U{y+ZP@hGsN&UcoD zdhU?g@9~aw6=a1SL(j3>l>9O?KEl+bbtLbPs!)d&Yl8+>t;@2FR!@Oz2imK*;Relt zF}sW}Uucny2F@e8rreuof!UCQ_nPG&Q$$hH2XtfFh)$B!k^{9} zn9}jc_RV~gjWp?w)Ne||-+u*+Pz(r7&L2Xz2JvG<*XB*h{`c$N*FW|Lz;QNq(}{B7 z20MtZB-!W*5a584HC);ZfFLx1oh}>)R?~7R4WE(*03z1fj{`>t|MHOX;Gh1&KU zJn{{kw4;%UXq*1}9cMwCyw$XBwElA6sn-9>7@3{~_@8ww0BpOX=?@M!Ij{V}zI0Qw z=n09E?)qG#Rs^t;pm!F9m5CUAd7ol`uk~NM@Ye)hEGZ0vx&!tBzEX>+-AoBHsH9Bh9}F47vT53HYG=wz{L_mA#@+1>%>IDZ@`o(fYVL zVvGtfd^fNN`Jz7wpb8XI*-3OLf%h8{0Tw7_2bT2^n4zg1!}$nE-Fn+4!1EQ7R9il0 z;qcv?-U1?kxUYyJ1F-y`BiM&0-b5a-r)^k1=lK--+E)I}Cz7~u>+~O|wbxNPC3`hM zgr-$)M(Ajr3U8vnpkflk1c(iwf>s~|9mOK~-^ZtlA*vFv0_AfR0Ovm5ls6fAwwTs- zZx0;6K4we=H(_4~fYZ#PfJ@AD;4cF`8XZSXOKZ@dJ`Q1dZ@`x!>59M z-&0SDF#ijCFkV)xRVV#@J;n}{GKB#y<8?A7%c9V)?ft^XFc1W?nQ^txbpu;PoZ?44 z^Cm*`zFwAf9NxKc$V-mwB%KnAo*Nkb`uFNx-o!-SY@=4IZWXFJ@bymh?-$BC0OnRL zT6<=@)t_tQnWMgdxhRU9nATQse)Ks8X0;~7!X z8-igP>boatco@J#DoIVJ00=4O6g{2(2jz@&kn&t2@NF+m$$4pY?-v@2>=G5R}2yat*NfA0lqD#xmVp-wtn`(522dCdW7j;;f4}`LNMF2MK zn^B=I0B{mr4U{(6o)HpjNUSn$dB5-)07#vpN^0aUM(+;y#-kH}WzZiy^a~oTHI%2} zb5=KeDu~`7ti-4Tx0T>c90HR6C+crHdkIiX$~~6HDmH-9$27d<>K3W<1>l6QMWaF@moWFy#2~V%qU9 zAi3FRO(P#EikTU>74dP&_%|&S$VuAZTD*y#0EC_dNRTXZ7Q&1IZI8eOQ%m6Y`RO;H zXZq+;n?imLvC&>%dJ{A|0+Of=v~e=iNKU)J4=9=&K;Q4m=UR8tOvzeiO!wt7pjI%9 zb^_60=GXHE`vBeHQDV61-Q>hUJYWinXvgRS*Bt9jbOQcS5l9N^rlbc>sXhX{z}SBR9ZZ!d zIlxS0ES`gd@&^~wb_4gWt5`HFb`FBt53fRsjfXwnR1BEvwe*3dl+wH`b<`#dsQ{qI z`1PrAZQvXI0mMxqXeUL)lrl5!%;tv*KRtn@uFRD|8Usq4ke=Lu&7&;kT5+Q`m{8Jb(72i0&_EbQfBp`j_TCILY{F;@J)j<)yx>r6pbI zMy>lcK|`?uKnh$~V}5!-R7IWob`};BHH$iB&WsbDcqtY6wOQAa!x(__6gfz){QUG% z81O{^z{Nc}M(y}s3il#A8T1l{RbI>~51GjlH5V&*a{Nlv8{h6fXOwEJ)$1gI1Tc2O zjuBIPX#;bdkd3Y~Anra!y~9NJCeWggS(B!d!Py=hv4B_FX=nwwue^y){QLSAZ{o=r z;L-NO>$8oVp7+AX#COxhE`nKe%=DF4#w2sb<$E#Xm2<88HUhA39sut-Jx-oXoqo>@ z*A4lL4P0d+%=!cyNyZ&HLC%Zu6J7u7nfXAtovGzV@mpQbaF$y7hu&qJ`@@ri9Jct< zyBuhNG|+;}tjDOU05(+`5uf!8g%u$)ap5C5|sIyZ~5d zS82Kv_FRxJGQ2$7XqTnBVo&KQKC^087WOEqOt!@z@44rixo}5&S*hX$VNKXmdR+tR z9oxh)_x9M3-@khE+l#`@3zM@%;r-7^ex7r5bv;EWU>)pVg9IP|a2jcNmw()f{g>Y` z`KFmI8R-(pwkOMR9cMF*U3<$|p48UOGiKvpLa~06-Te)x@ zi{n|tN@__=XbbSF%O`&bDpT_X*GVA;Ln!aNmsEAt9Iti~1mtpI_3;te(zZCfgF}6M zlYFJTlzl58Dzc*9T@alPG6k2o6W*hs*a!|VC1exXe2tk{5P-7=0T*p`)FcVOxY5Hv zGop&Cun%;jCX*~{0Ljqu)0@co9su+xkiaZVidySOl0G$>u?un!X23u5TvgoPIL*mo z0E#;*yAfN|k};D}Ika-XbJavvC7V^S0({#E(mT&$f5l#mAs}03ex%_OBMWx`3QE-O zbjF&!ScID$iAgjufkF>}q>PWY3(kc!9jUh+?S7XcFBhL1VHIZyce#RE@ylMtkVPF zMfK{?OqPZ|JP|$iC?iPlfUN^NOTpqNBKG_23s8d8P%W}}-mBcdB~p%KC&F?*RlT(s zPf_QeIxv$Y$#TamHkPin zm0&9pWhYGFsEOQJHxjvqC6r4{L^`~qq%`Jl3-~6Abq@@NCPuztWbHj_ zrF#R*IcPu>yI%{k479`PTd_k#txtz@?J-DHe9W;g{|k(M*gxW= zta6HLF^x~sd3?DQ@V1Fr6?0CiyQ~XSa24pN=^5Bv+32kng)xEb#H^=FGVAUS@fxsT%&k7#no_Uy%vX|n z{}_mxZB7OvoPf@Ip|+96$__Vtj%CX_vuC2o9(l;fj%Dkmd>PC(+!JR-Qmb{Day9F| z{4p4vVA8LQd!f$9EZdN~OhcK+Rox~W? z=__v*g*A+~Pz4ZP4>m#wq}`M}>bbu1J zISdoPNR%W$H-!saVu8_(bJXjVX1|uep;FpOP1~_N$9C99&8!(OHotgCvlGU6o?I98$}W(_lYK~@8B; z(p7?M46S;2gmqAHGL2jt{S-aiwO${$l9x78?Qlkz&VGnxy75TnPH7CQ8`W|4&B660 z&Wt#-g$DOFAIg<=3+OtT?l96=z5Um7^4<0!A1(C1IsL ze|Sad(bv-QhM+D$P_$bN!Tu~w3Iz4VFWX8ZyYfn}-Ah7oR@Jc3;fpRG!#@((0H(xs zA16zJV8QyF2s>6Cz^`>ZoW++@LoIP}peJtf$b(U0sNYrtQ3U!!cpdpU2p!z&NlnNj zC69s-zApO?0cUg#5XtK!+tD!#$Mv48jm8csT()Z9%3Q^{e{o|~(RY6QBJS~m0}I9& zA+mRIDc`1@CXQkC;CL3p8W@nho?XF}Y_FXcYwj9Lnm=^uMI80WJ>cS*k&~HYL>d4x zGWA|`(x4y*a1|iWKnu>8lH24%ifP`UG#Xcem_R?M6kC!Z$2p9i)oazdG4~<7iv1EJ z%6Vcc(1p}N!NRWUH|KA=s~Nq2_8@W(KmBHdR(#k+l<4ft*7Lzut6x%k<`)wFO@jUe z%2MBfxRHcg1tisQKS=6I4Vl*0w=i<%@O#y|)VuPxzAc{Vm;cb*IYXb%`)#^ z++N>O9|eugJ7vZG>c-_+lTvsyw`h-Z42|^tY0a#N_|trbzonjbVqh_C0pzJryT|WC zRSV=3uzRM0CV8R(rT`HblmYdlNzWVY1_drEAE=#oC1oCD0XIb5V{@9nvRve9!(rql z_rWBE@*Oz~Ed1;wbmY&Eejqurq=5>91IRf}8xehuQLjq6$$T>;Ez8e^0-~v3g_?P* z=~c%KhSMjAaos?@OQHMVM|ZirWzY@43^duIt491C_!BpFV}*oAW6qUbY8~GCd^ZAW z?v}nm$A0!EdYA~ot?^T|k5x<6&StE9LzV(Zt$@Bxe*a4kQ9~_~F(-Tdox)xTiNaQf zqEl{C8#Y{&rT<<~E&qW_o-N-iSnGJ(0Do$?eC)SgTrXF0Jx?;rrTlG0!i#Q={?vvO zfl!yN!p~}`A7)wdNAekQhoMQ^c(H;)8c7k+2D&SK9&R#eh9p!kCQllaYm!hI%o2GJ zU%FZq!LVYV-D+}H-8Hq?$g=Ko&|kx5EB@u7x?-B+cnxxU*}ceI9u@(1l9*07HZ8** zq`+a0AcG!0Qsk*Mdy}UgG4dE-aB~3EK&W{ANP;>97*Du~?$6TuwK?u5T;ASrCDCAU zDd@Hlcl~J{konk(x95ji1-{7g)Dpd37+D6Iciz6uA0Vp~0WJSGITZ=&(n*+;iRlA@ zZq}!)S{H8Hc{&33NjA_)Y683{v%+P6jQakq=Di;s<#u|-4z_Pjm+zm76!x34Yq|LG zz61;C1v8Nzv2CS>N{l$oh6T&S=$yIFijlyqkq^t819EgD(FKGR(3?AS9>kRLg5LX= zZxVrr4Cn$bG|bVU^+&hltbXI{7PLuGxT23$pc&mTt1QK^^eIMb24ubf##%io1GWAa z?g2yWA6i(}wj6a(4lD-(7kT>V}fd zwh*uxy@^YFGNmg7K-J}R_o1U^zEKF(v~5->tJSsLJ#);GN7G&4%l7WvsACbw`RN0< zniP5(&Re{J)uv_S2rvtM73Yd+PF_Yt$wF;fp4Y&}{N^$@u+aqlrti9_FZ|5u4J3wI zV$-!kRtm#f%!*kJ_8<-qnicke8YM_X2#x10=GMk|`9ebgi(dw+ku({ghx@JXM|4X* z@Z;G^Ku-{GEq&y`$l&g%a9Lh@lXC5Kl)HYla1x6JB|Gra3mfiR-d2 z0Zk)RddUdnTfpce%A83Vo1~mt3g+Zv|0aK#gr$l8wm@s!jl{*Wjt|QtNilyUSfwTK zoY)vvzc8vMCv&0sx*XGOa2qwk*93K))xVWHghXt zkB$DJk`mEx#|Q`-Pls*{r?v$rpBdLyp#E@)b*EwCHCwGNI$~*5XL$6}DP0$ad1F=JT8oB5_>_5Qc2nM00{WJ|C|=`Er_a^i{vjbf}qQ_Zv~;pGt00KI zZGEDM8foCnQ*l1?^ z?yIe5`MvyP1Y|N6UD%r8m-_p{MY;KK+pn;TwONSj9^NvX0w&!v=l|((9Cg%^Zys>e z!H%-giCIQYs_TH~nd=HbeuL7&&ojMyDe%g2F~wEsjx_xe!ewZ=hX1Q*ofMZn`!nNP zE-KFCKfToCtuhhWQn1eY3NsSqac4yE;7`hDg|lYbli_L?UG>8ZM2vqzWXpMQN!&Qu z>I;yMULrlus4n;UOkxd&PA@lPzA~I$sZKZC_l2`MPcr;U@=W6PUV~@Bb3GX= zwV{aiNw&J^shZZ3&iyCYNUgb%aa`moi%8KO6Z1MZ>7TmR$As7-oObL-9Ot-%ZBylL zaf=vB=Zwtl;aSUgy>hCVJ+J5SjpNi4fdM<01!aD6=_dU6ATs82_2jZp=p=e^WYn^r zNpskMn4Q9`1Kz}(bY8?(v^7v31U}%WPpty_6trA@O}*cxA5I8Ytkpx$iLv3s+Ajd6VL|c1r52;F+e&@}Bh}E%#l%@yC7L>hfZ?vUl2j$aH4-MRnU=Fq7r>GSD{g zA!W$*lx%O$HXNs6#T=kJm@ps#G)kNR#cYTmRTwdt1#s6asA>$`9yMqUDvQt5*6-qS zqc^cAtLB(?l>{AD<;K>wO^YoZG*)kaIrh)fvv|*ocfPZ)-lM$fPPLS*s_N!zGd^^n z)*>(R4!LqyZ(|nvW$}$!NrV-zrnJUP{ayicBR-*+@@4636Ap1mylG_S(d|ccw@(H9 z(7J6=l-?(-lo{@B}#zq*pt zJg@%=#caIF{0@{756a45Ut3`Gb~{gJ(7U29>r+hg1C_C%7z48knu^QAmtutMJNP|s zi*7}H`fR_ujetCtDx70LtB)L5g`M6aM(~rEh*ppB3-4B8&_icd#>3175Ry?*6Vn}O z15xdV`hwJBgNlT{v(_&=SbKcuY5e(k=&idjH9W?OlAnp*ayBz;=b2Xh^Rk~cKbW6u zrIpOD357bDP1{aP2Z2) z0c*U-kWcsK8A1zl`HT;}&-Q`xKywW!*(iY~%3iEWXDKb_VOj=FDTz@E@WF8Pf(liF znZD3>ShvTfjGDLmOqCo%W-g#rUc&P*nUga?EW3ydp3y<)Wv%9K#4#ZM*uAUHO)AvCax-1Nq zxm!84gphQ&?(MSmsS|Cy3q@w{wHdSpd{tSEH}UXmkW`KM+|RHm4u{bzIZtPVLwYfk ze)B^4F6F+*j`tml>f9~1^zL^T+^rrWj`34@sp$RT>UWFFf{R&oAs4@D_AYWahHpDy zVO3#iRWUBZkeJiuEJR07-4k|f+5*)GU6C_7SXRm>JQzHca>mxm_eHRWG+Z?WJIf)` zoP$>hcC?zT;>D(b4zz)U5N6r|I(vCaY`n|$n3Yt3A>;=mz_D;+*I>GQ5EOQBj1;(8H-$vLw4D}>t`rid=FB8A5{D! zAA(FO9_-uMTQgVVN>F`1M|)@i1Doi*#@=4oPmQ*Jtgccb&wGOlSIF$Dx(iBBUCbUL z7>f8-yg`BA=21UT5gl0*LIEw%sAj0gj1-Arz*UKjLQBgR>p32DG`Z9zDE6)GjWpx4&RgUa zK?sT3gl5+4v8g(p^JzdDvj(_Qr>7}y44ltdI!UZdB}l+z;0dwGIlkxejL09oz}vEq#^ zvla*TO|M~t(5clO;hK-<)f=VfVw_@;`7Aj%lGB?W&-lUU@6_od%pNPinWWu{2z1S@ zmfEuyPVeR{`BDP!p=l*G#bbCLTV@Bf5wCUPsv|WdN^anIo2UQTF&TiK;2`^}4UpOn zfKD*g7V2b!>J(7;2oZ%sa??I@wz_If^K z`lJ*#-EVPGg&y-bvT99N8nXkWj~fW|?&J3hLI93d`3u7B8>?8pu6^z1WOx9>dBg-| zC1|#X<#f^oe*^$i4OK~vH0E@w5x=HRoCca?$;u@l3U0pt(CPW zUUT%Xis5I!+oVbWj<3uaP}bY9*IgRltj>H!T7eb~re?}~+HhgKI(A7Zc2jvb(veEl zCt$Y117BkDxy_y&422FD$oHL2YHdx(r!IV$S(u9|`*^>TwZ+I%NEAUSVM$P7ORiWo z_Z;%Cmx9^u`2?QZqAo)G>0EP|o#X~k1t7I80S613EZ-A_4xjM}rmPl%Zo9o|Ntr%9 z%1$Zp(L!5H?ft2|S85aw+0S29_$x+t1bl(-`E+2LK^20%`X@3@6cfXzJ~pAF=oDe)!c1}cH}M18fhiK9-0_ycaSDlltLg@g1imn z^s4&;qOB(PC?!Qi9_Ym+f;4ogFvwRnhI`3;v3j&?FQu6K=`@44VUZToqHO?M=((v~ z!0zBO5ooSK+TtwJ3%U-&8ATHN<)+v1dB;`*AxPv~bv zjJ_>Q6}+30FkO4$j(*RMWc~GIb5f<&i*@zX_~9UmtsY-1^d1DksaURkMV0dX?Ev|E z|7xAjPK05*i1X{MmES7qcd4~7`cs=iP;85l1Uk={cfK$-d3wu{z_jylV)99Kj zJK+7V6F-WbnmLIQ49Jcw!cX~y2L`6Q9MOs4uYRo56}qB7L0Qj&e_d$8EqAQn63kx~ z$`xBpOYC{KA}X6=TvhO}Z%CnB#9*;SYdZVmd2^4p7yVf)pETm9RY7QA=3JEx z);xcM%V+7;n>a3KW6xaW(iqo5v5}KPON|Qg=Z{rNf@Act5nj=hAtSa2B}?s!|c66z-q@MB=fU9oKO zLs$299J3Lk0kqC@iwgRjjYj0KgHD4?uZU!Q+x6QthsW)W8aKZetixWM=vo;BrbS=HK#L|;!PeP|I@$Pofz+=x*b=j z)Mjvp&@S_gTJ#(>^Vs8|+{_|MHrH`77lLR*J?O;_f{YXt$%mi?Oj&y^eid2Z+X^6o zxf0&|#CG&oOJSc~4s`8=vy(2eZHr_Kck^?39gbF(9LqT~AEgJobjrU8hWfNREBzGs z5N9&%?#N$mJ4u>m?s=B(z3ZiJZ=^uf#|N~au7QQ`uBP?g+^Cr$GV(`wZXN6J=p(08 z_dag^9X^W@0=_1?-xPEEzOEHKzSY~k<#2;~#BezWX}DyAwPmwsI15_0MWvzI0z9pB z$saWfhVg+0P8P+Y8e;}~s#gw}zS#|#l_@Qiz%S}!zI3cd+b@U6=!h955Qs3_1xi<8 z@b|>|*=zb3vJ#=`VCEnz=dd*X5fYqfERQ zAXg;!KlEELN{*`aFD)Q63cQ4Tj^2LELMv})F~xT1`g~Kq7HCmHv~DoJReM0IGP9oh zInXBH;bndN>Pl3-H*sF-0DXFtGLV{*WqJsouNBau=`P}))_biYKE=HGY2y0q4ZAHy z`?pGJg56pahd>x-sH$_C%JD0@rLUm>5Ph{QfCi{>&ZZZh`b;@Treuamr7fI^-1pV3 zv8~_a+{hy}AN1Dp*<9OcZNvRrh32ou6_i?Q^9whJu&3f%Q{$+TIWuDi=r5%}W79R_ zRjj(n2MtW}wlmCn5JgNq&9vpfYq5gz=7+kJo>=N{FUt#&*(;y<`+H$-!ur`VJx z_e{KS`@9miXSZ#AF4fm?K0Cv{c0N=UV{v?=!)mixE)?*neD`@kFQOwoUmdR_*VK?V>PJGS96`G_t)%(r7nLX6lPtr0c zaN}msic&ae-GzV)ov7u(=Ylz=&6jjAZo4?=HN1`w%?6||215E~oFCurAX*fqL~mO_ zh!{rvXgW|DWXXf`k^IwN1bV*sKvBaUwYjHSVAccxTxW0cEf(#3++rCp5KL`}w3zNXynO+LDYJb&i$D4e*zS{;jVpY?V=jim1w*lGWGD|Ug zuUPxEmYS2<0@Qpa*XO04`qmh4%+ReK)!IaCEY+Fdd*^fOw&R(1qgIUj*6i?8^)Byd zQYD?LFP+NLA=5nE{kkdlV6}sbpa(^b2iusC`1GNNm2SW2Bxqb#>58}6L+4y8N|rr- zVr(U=@q6AI1JXk&!7d+EE+TmS3#yY_q}k6&-YpV;upX&${?ksx=#nn0|Je7X?A-(} zA;sF7#Lm&THX49~%Y5tD?OH(b`Zy6o5m@tcLq@?BsMxU=F78HzSZXR~30!@a*_gSn z;h*h;00&I2-2+u|I-WCGOq#=%kZEJrf2}2*Sn)+sm>B4LwnI>4Szbe(g1>Nicx$O@ zOm{GHK67B(;-RZeOj!i_?cLY+RrA#Rec>_Q#WTvd3G%K7PxD8mFjA1ju>?@HZ?f2L z7v;RLTbqx;-zs%vYGUB07J4 zodImPZrZ3=*RH-@^Ms+ zTHw7ug4*H~sA)B=$G_OxY)D!n^z6W<-n7Mn*U~3jd^lUuRj^Cd+Z*))9ODwlYPBs{ zEoJ)sYR~0Ac~|i<$P+Q!PlD&zo#Vj;u81Zk_z7tiM5UBXIL;qz`+g8~NAPmvd>5k1 z&kfPaN61z8C_xDXpPlU!FzA<2K?##k`#9>?Jmz~758rQAMHUwH)q-62h0M+bO}>=o zN4aK>YgvG;%(Z9-C`x~-QwDSWmTzgusadF8e&tUsXSPxZa2GK5P>zL5S zyr$N^o4R77r5U~;E5ZdRE zb>@-NiBXThI(Y+a+?zHi_SoC7YU|^>?!iw42I5Hhj^~-hg4!#f=j`)Sg&)F*$Z!JzYkq|H zdrd*)x1l$I=0THHwrz0B=zgV2b}o_BOdYRlybNCsD%leyC|dDE*2QTap0t;FYBrM9Li~k80nXhMdRU=F9l!psbev7Q&yxnD zs)a%;SnX-LDY@!7^Hthgnc=|?Mn@Ew-8H*DBHy1np5oiQLvVr>m;v#}OkUzUZL#K< zSF|{M(VZ0^PK;e{^%{A#jH7q9MC;gE}X9qI<9;<$M|RDHLdHM zs*zopn~%pYytp5=nq(QgzyrE;06G+ex79d-vfoOf{4LPE7b~M!alz-u)%7PmW64^ERxj~-+zlTs?*`VZ@RS+o`(i4N3}c3tOa`m zwt(K*uat8iZGxYf#PsZ>&~)gLXuFk6RousFpX=Ljt+#qH>&$L!L6ECasu)j~jJ@P{ zY;9nHVs^a?hDr8Y+XdbP2%b|l>IY|uO`#r5i+lZt`Pv;*{Ubx68Ce9gKeeb#0Go!ex#P_=kWehY^3&n@WM_s^PM8_E`{@M z>$ZT3gv4jeiukL&l)<-O&-mK4l?Y!)?jPFPF*l$`U~Lf#*&W^e2C^10@bi!WO!a4v zULl9BSfq4Jb$c+=uD0R4bfg}aT&rV&g+t!az)Dk4k(({{Q$@>ns&aNA07Vp240>-k z!CNs4f}jEH&I7QZyf_ceAOuerrdS`=Fl|f0i8ss!PGnjnF~U=kR+EwDypQJVbG|Pf zz~rt5Sw>Ht7~$D5dquzh4PXg`6}CI(Nn`q4S^f8pFFDLNk>lcH>|p`*qkXD55PHxL zM!q9py+%RTZmtO2p7)F}$Ib?~=Fdij_Q-A#%GuN#g;#n~lPM0_WhZ>_N{#owj}Fr_ zBW7W*TsU?id{(bsf5xFF=7o)}KJaA1Sn|3E>$Ubu;NS19q}Oa+^~>SvA%xrDcfNa0 zP=DaAj-9ENUFH#LHMA0;3B$z(07HBqykX}e14>m`J@hHE;Yk)7LHQStzBKkJhC7ti zw)Gl7^(=kX8cs_$EQ4qDuE!aOg~C+dEZ?6kyw+xXscXw_bo0SL(GSA6$B0Ql#Mh$E zbeduekeB;EfxpW{bi#chKkV@(ImsY7~vZ zM?dcfWZA7L|6=RUK(3oMQ}PmfVv*+dQam_4C@GNYVpXB`ygmw_fWG>u z|NDFSU1GqbkzKLKcqsQxNlm`j&d0TGPB$I~>Wk7@umF1i@9;#|Zgk6C)i2)?^}3nr zA0;`bvZUuG;PT`oO4WG?yqOOqqU&|X=`{Ib3>OY>VmIEXfSSr|N|1iYjZ5OeRUB<| z*N&YHII}>8TglCR;AJNvVyU_O^w*$Yo!P&tiw-dWtCw>@U9Yl8%8ty-Elx{oVrhqz65;pAOg{(a2rld9xcHEta}BrRSd~v@oj~nnQ?2 zt`XzYZiHmc@Lt3MFOJVSn+9s5?KL31cYO?eIpa*XSl`j21GUSyv!*i7?Ff>1&Cs9L zzASI`M%W)l(k(J$2izEtL9TK_u8h?k=Am@u-n3gyUyq$VC>SX`VU*`SiGUiM zUT69U;9#h9mA8~){A{6Kn{j@R-kz#a&F>O{+a`{)lNc5Uz4V_Qc|!Y$onDZQ9P%%_ zTxAa)fgHDT0u<}U-9yhZ-(Rp#S7CLF$5en`_K;&Hx+~Kjz69zU{ht(YriOofY~8E{ zpFFQcO7*nv;0B9Q%#QbC__D=nx8a-ul}(CV+6n@3wH6m#GYEJ9@gXz1FLvLZuk80C}k!GE(c!d!s zL7%}!J1hdcU6It*OuNm_Y(6ZK|9{Fm^KdBp_Tjgo5>m9%cR9E3d4A5ZNL35)0Yi!Alv%@k(HNN8PH>z{uRocA4Cp2#c>pvhIgvz+%_0F|Bj!BPDdWu;L7|SZH#`kebg7$SaKSj3fritoO-fcK@=V3ngzdw)L|< zY5ns2^;cRGzE9doyv@OmBRS_COai?(shwg0e0)~UZPL9{K5`56%5AuhnK=8 z+{&fA?PJ0nc@3i5+U_Tpz+$kdPqBb{7g2tw9KNB9BoR!@(Cb!ISq-ao!C}(Q#UI~B zBIgaO*t?GP9az{$^byzqi@AOa^CEotZc5vyx0_{%62I@gpqkjai?7%5y=@K{%ixV# zKsf9sh#1*RC>H)Cg)QUKcl4GpIp)ZxnrVp6MA(bfO3tF?_k7=>1h+$$bdq9MHGEeD zO~&53%FqPyVsIPp^uoEgkM3y}O(4G^jpX$W~+9Fcl&9R{!Ma z1zjEp6n?**Pc=Dr$0ka)3Bc#@zq5 zs8isl@57=oPvJyMSmTrw3u{c`COBr}WI{WyhZw>c49|3&?x;g1Qj8~z%`YCWd-|P1 zlbn5jQ&h$xqA2VOyv3h+@bZVfA`?hz{SkV+)=h&M5{U1n7l?P4O6<}+rK#7~flRay zFHJ$?=hq8t$L1AKbVZj>jW`W-3qNhjR^!;x`ztMjo5$c3CcjH6y{pip@)+HX&JbGg zf6FhjxSk+feA%S(>_4xzfj+PuMsPLBCas_h)3N3++=(uTz^(NkJoT-q^`fB{Z)ka^ zHh1{kFa}TrmIBG>i_y;Rvc{!ZYq971+5fS|e;a=4)lClAHlLW!M=Uz2%?F$W5!&A)E+ z+3G1O0XLz!>tf`VwhH59`9a_qV^}Ehk@MqU+icO~Jhbu>#bMV{SJQ@oY1pQM8&o;l zGzkqLk=3LI{j@G~2wMU=CZ9jsr7%Ls`7K_1v`^M=P((jXLS_2#$W-Oxp6-upW#fW0 zo@Vjplv*o+KY^%ML}7w@3-5joP0)*26pfbE{ zWT%G~Gu}Qq0%iYDdSVT*i&t6L{K-Wz=3ibndhaP*q)Xo$;HBwTz7V83yAGrlafb1b zH%IP(01D6hb>2LZf|a(StgO zTUazT?1H=QFV;h3Ul8;#SF45{WoZh$Ye-~`X=I`1Q_iWc`wKT1b_ZQ)4I;P1b7eyN z!is>dh`|&@V1lI@;ISU6f1wI|)>B8j*|#8q7^fnEWPmjk>k)dz+d5r2;RSf#s3Nxn#(^l1UBMkpi9=w^*@r0#nm6Km90yS0(s;M6)(hxk&GkdvjJ*I-1B zGrl_Dt$ZlkF1{-01hPaE#yi%|&2PX#irEt{|K6>{(KcJQu?Q|lm3Q(%z(k3xu92iNcpX*XXV=$2CHRPH>SItGV)w050lp%GCiZ;=?@*}5qIT6}Js zXkeD9wb$oG3T4?~!>vlSuO9=NaNNO+wlNvpB{}$FGVKwXwT(8(TaR`McyBPdo#^bn zuI&X~s<3a+POX8nJBP(^ke<&i14x(kYyG=<7d`avLMb4F%!6T7TNgnT$)BRQ4FaT# znlpdEq(gGC=`EVZ^K?R@I(lsG&{_)q2!`k>5me;m5U+<}l?vnh8fw6OGAr{B7*mW) zVfKn(JS!| zZVJsc7lbiTvksNl)UumVv(#6|8G$ZAnOiPKyn0hqy!WHqH}*?8wdsc%N8-NNYZ-a( zsQB|RNy_uA*DK&8{4aTh3DUBpl?cR;E^S@Dm|W*}ZU-1sR=n za=&yhj|a>b$gU>sUKi#&a{Uf|@`1uEdqv{$TwbkdKhY(Q;!w_rZw3d=37>l#uhqZC zL7i_S^`?6EHlqCQ$tzYHaK|Mg&wj2hSr+qtsJ7zof=%+gw9)d6F zRR#+2K#G5K5>r&2emdbp31utuv!QP0s+i3x(_|-^qMIGLm-PrEzxYW88WLgIEib9h zw&6iyA>JXCzcV!pt7X!r#1K0U0IdtX2IA9eiJdju6hGG}hEz&1PC%WT*mV>OGADl} zCAeq5=3mx%Hxrku5N1!d>T$ZclBX)t%uDP}`qj%u{@Q$bArsfh?_N;J zNJ+obgYMHx3tO^F&bf-16`~X|QQV+`WtPMbDjgQ66Iyvbw)4i=c-IbMg;qu}i-cQ6 z(}?&??6W_3w|nq1t(&uEW_fAqq(`9e5iM{Rbi8(RwS?8gcEP;JtWm(eebPTT>9m5e zcRNc83hcNG8DJMkZv8FyyhkRajQn>w-@fCfHHz1sUAfh@*P$gnY-xFNmdWpj+JX}! zntq)0<_Pr`HR2-F zJLnexX60KWlyz>^(WV?q*Yrv>qA#TQUjH)X)n=`qbSckK?pg~m=!*E_&olp(@p-u%A9Sso$ga_IWmV?!Aq;KDiu;nMD-~~q@XI9!h62V z)$Ai~XnjZ`f(hLpwsK)DPTLw; zemAX;5jWx(gvyK*i@Bktn@!mv+aoekPzD%rp4l5M6EkNpyMF26u;3reiSk_%(Wo3y z=Guc@Xckghu^Nh7DsZ4#?T_7?)oyC->a1ROFs-J~KEKE}>B#)oHRG?LG97A8A<^0y zqNc!Pyl_mjhsO|#Erw-@MV*2zN&G~W7`yeCAM~HROugVilj`By&ql`Nh~o+(*?B|3`Ipr zy>EB|v|AKAlqPmKA3H!Wdt0w{U7_n(-EGHCYI8S7W$Q}foaT0Ay=8~9;c&R_Yn5CX z5lE6*7^`K!R*aU)*Em?ab+PWwnC45!mR3sl-wEmN>=WwYs$ch|ODqm3&<}ZzwGN+O z*v$TUMS0%sFSGf-JotZ!``ii`NSZuXrW`1*?h}5!0f?2ECa)^XMD}~}Sk}rAbzyb; zML3t^#|&kf3N>4`30Q9w8fV=x+=w6Zy8UbCIP9C9*VVd<>Dk0xU>2|8p#_m3JzZwN zu^AAY2ZVlMj*_t~GJ6V&u@J`69^giq^Ki;VchP@7Thi`u%p{aVm3;izb;>&P@0B)% zHa4YW%|EPGYdlqlgc-!@r^T1$MGP0Z9mj-2l(4k_U13E&Eioqd$nD^=0;t|LIxL}k z&W63rxZA!(U~9Q_dDE=dwGn!&%s8FEm7&+rte#W%g~@`zLed6(JC(=xY++Y0jk@q% znEcbR`3ZsvAwcYnDGMSi#uq9W(+3msM|M=$?G!|Lbd(4`vy%5n%?#XgCM;}8B-huO z8&HDWR$KEBLgJVRE^SUjcX|CQJA);`xUAQK9fPQxfYwgQ#@CGONRyHepDR`QXi%x= zu-UcN^)zQrrve$S(VQX`TO8z!-XrF~Gd&>scxpjh_iU&*mpVeFDB z1PVeRZ^n}eB)*c#wYP5XxiLcaWEUhNWn;_`pgvJv+zj(984N z7g8s(o6qj6EYQ8R|1%7hcuq=FHdpODK+}ftA8wt-gfl5m1KU-m#3mM7T)KV3Qi|so zbZ>1e!P|xA{9ZB|yDsv$L8`}4C9%)(YZ7N=?d7GZsCPI5d(9}B(#UR(nw2)6xg;{K zO#>N52j7|2L{zDOZ0|gP5`8ai`A~FCHkiNocJq6@{}pLr@m9yU%Gc$WJB)rL{6*WF z&YeFpKdGACoitc&p_rfDB{rc@Lt9)ZO|hqSO(?n**fHe-8DpZ4=kD{+bc1R0ZjV2B z%sXAPs@x@+Wq7ClX&mRlfEcV!+6@U|=R|-2xSin0c)#Vq%qTon{(=%7(u`IbrP&Nx z=NHnHZoHBnz;7{|;Pg>A`;|G}7NLtU1V=dcK<^3bi_Eq{Cr@8wY zPk5hg(JGPSm^p1|Lg5ex=9%xaIipKrH{6ezAgiSqdeR?hL`$dcF51*J7P7u4jx-KmH_tEtJMnV+nzrkm`|Xu=YIZSJZa^cYj3_rsB0u2!PU zS=*A&CrDqrF}xW!w?>?u!4-6$`DiNBch7JDQ%F$9+r^EM@z9#fp1qvl$t2lYO52z$NC^A;NAzyqGNa8XlrNC~S+x7x&}Z+! zamNQC!8WEQe%?`I1LGcleOthYiQ^_K9UgrhXNDopY`hm{0o?Q#rZB>MRS@oL5s&qQ z5+#EuVFE6kz+n)%XK?Cq%Zhxp$zv*u{0)hpvgGO$K2_TfZfmVp`1uSkS+crC;~jdj zOtOEe)H}5@mG+iDEGsuxeUE+Bb}idrVM8w=Yp+d6u!j8XIjVPI*V2xrZK>?;h*n%# zWqkdL12-C6H%+M5Ca3W&*JK+=t*+2)4JAF58a^zvzWQsM#@JV8m*!B}tKM_{$tqP# z;!UWnIlEWUnlo{hsYvL0w*+pIsM@|8DWwQFYo<-{U5cS17*HrsXlxESc%B8v0E`=b zXK;ucaT}^{&7L>1DdPaxYEV;{yeNQ;LD_oUy})9gy+wFzOVpBRQmd4Y%46jJJ)K=i z=eRIn`cp3PA8T+^4p=(;6FCtivx7qqc|7z9yEi}iB_$Bd&*ZCqd8YEw6FZ}aCCicjN_Z{wzw^Q zJ<IHwwdB4}yxHt9NTg3BMAedzcTtSLr-LmrbRr4#ZGD8$mGcTGwuOY_Wp= zt}P~N!imQ>MxJtA;N@79A~?qn3q&4TpMo`~C znq#g?gC*(k9Lag8O)MLko)nk-6sk(1&ej=Tq5>0E+!4@b2LV&!nbf1=Kh%=seyE7Z zD35wfwh3xj%%()TS|Be+JL7 z?QnXMtw8pP#b48tyQ@OGLTvmT29G9vg?uu zl2&r{qE-DCtTJT|@;MyKRQlNBEGyFIL5XB1yl`q}ul=Zg{QB{T#Oky&l3~GH0}#j5 z3Nxw$1oAvra6-wuks4M&Wmva^68QtG2wX8v9lSSZAx$}Ei!o3j&URR()oWYynf;n z@*NV@O)|tTa4>T2uCfE|6-N@IY%y2+qhoEfHu{DOw)?Tf6YT8>3KE?=NR+?MK@(*4IW#LT6x zs1v5L1)iSWM?yv3hTAaJE?2GU+dRnJnOaGdC8|b%ae14OOkcpvrAN&Ufy??G!J{n- zv!A*$t zkA1H1BTA5AP$1ewkc153I3nCWgPFDV%#d#dG8ht`-2(S;rArlRZOpQsh*L$7hK$z? zFXmLPoE9HEKdNxf(;(-O&w*_7rpe40x={7^gin8-B6+Z;m-6w=O|QW4l(u_p-h$e% zU(cr&j2;Pfr0K>hIWi86@1-G!c93DUnv_hPdxr)X)M*$9s9o=ce9_5!1pW`=#x8|v zPqu_u4Os%>p8$+r`;yRNC4%N5yal0q1?ELlC?Q^t;O6G=s@Y6~Yx+5=JD{k68gZ>= zXtE7cU`*P!(<#?IRv>fnQeb8jUXNfudYoeugTJpS{$Z`r zd4cSOnk(%P8T*$B^(46Yf%$CScrkVIrJEgjR1+Iy)i-)*q;%-a@*Amccd?xu1!FLH zr0Gj5{ghsQE)?i=iCq~w%<}#=zIEpV{-u^>A=abA-cel-8R@qwEnyct*@CD%OTbOO zqj11J$#=a_tiMBj!k66J{kndJ?n;$!nH4-Zi2;Y<00KmnucePqw8mX>nMR$nBh1lm z^9g9V=pV5SXJ~LV6c25EeVqE(J^eDo7{a~Gc+a@XJ}}L;PjI>!M4Q+bG5kftn5}8# zE20^^z$@W`NF7%UW%ylBOA|2$kel%PeUQBMNcc4IVEXlgX^Bz@_qjbDxFvn!<{;!& z=ZM*!L@C)(^7jtb%1>wc%NKHVnWLry-rttyh#zj^p)ZH&9u}dU~y{)?dUao)a^?dIm$;YAX2{s`?=Uu^H@$>Cqhw$x#Ww zvxS%~ZP=aq24a$P2)7A3LCrct80s~YVYqd@yfo|j^(X667$MJZJ0a&z_MNc1@{3Rn z3DLE&BPP*>CSk4SX!2R6fU;mtwZeus8hkvo4+>X2C+Ga{W`OIwBgG>@k(^*Wsx);N zDWZhx;^Z#Y+jFsw&1A48K=LmY0=jK*`YtR+ANs!UsrxSmHGf>dhQQ0QsuZK> zoU9*Rq#htdkaF3sFd4G_N$^Xz+nLxC^6?{nx7=`PlXhncqPQodEzBd)mpig)qNb~8 zm#8YumrJUZSPF1{cUFU84)(G6ey-M&dXeTJS68IFo?F##0i0? z1IzLV#pm>ex093O5M1y@AgM6#!I~Y-8di(_Hkqm; zUA8B_xA@hm#aAVVHyp|{+!4VD4<#N|lyAwuu?EiwJB|75(0ArLcnqT z4DF-J8Tb`j7!Em06UiMjM+3mUGSUG6)i~%KN$0J`OlY^^Wp^<)6v?DG_oAf$O5}c9 z)ZlF``oO`s7!bD_mb}h7jU{BJhn?V?(P=t$K{TRbrha!y#et!YoWm9M6Yj@we0Z$| zk1Ov#?CTbd4Ysi#FLs;Cc-cScVqtf5w3W4)7jtfe(f7{jamZ)yz8;SRzMiDHlz3z7 z1J@JKn5!|MjurtWI0|4R4Pb|b)64L)a|Ip4PxP*!jMd^AT7+4_qh_;I0M4hH&q_oR zb9n2nuCUQ&3>h*ymNXv7%QGRqhny#0~n^!A25>WlvSR?GJ$CoK+GgUmfhy}_tXIb|^99JN_z{Z!1A8H2WX7irOMNmnt!icrnDbunHWc$oYSoL*snln_(bZ2bGr8&S(>w0^l}h3ZjbA6>2#gDksL#1%F3lCwF5jAWlTTYsKl5J z^{MU>Cfttl=?jW|(^lt=P#%C%f+kp<$BZ7X*haJ&&sH1L3MFu;Qtd&_9byAp6bfqv zvODR;J=0iI*ssxmptl4SH|O*bf-Lf>1KSC9eWiSWUGr+rP=t{tjG9ub-zcmU0(m`nL4AktC-YaVCF!@U=rmG9!E zQIUI{!V;#kA>m=s4N&UQP6L$uUzFfU)843@9WFVm zojb^>sDUkk9PpHm9&E}+P&3PxvEmGsk1h{n#1nnyWmmz5S*FXI zMo(*Pjk+*bzhjKvMPjtI`7AXbIzBiv5x#aV;34JupG|dYq+fELF6I6Gk|t^}U_2`~ zZ6hX)MY?Fw72Hv*@3jC4YFNTk{Lwc~sieM{m`kezhuF^uHt0A2aLEs2sAXn=NhEo(_7`FQ{{2rMm%YmY^Y+3n7z*d@_*H1iB2c^g;oMm$1!u&jxF>8T! zpbU6ghuLKFJ0!Q@=EdTX*WjmGUW7Ig3X zTzvthR@JHCTsU{ntVC!r%hvD9ls8*2JS|A#i-0_5%Q+})KwkkVk;0+S<6j^XlxLw$ zdlP;5vi_*D8;X^P9P?1%yzT=g_Lk!fDwYJ-P56 zHo6O-w8?!?W{%{Dl$h5lic4SnNmO0R-LZoq!QlnD0E5sI%6~l(KGS=hBI=+ZcP5|1 zOdiRUU$+&x?=+&#nvrWO3eg zNT)3jKw;U5H+-5sWY)W3D7i3Fo)HK;n;r#cek>bb8nbjd>FGvQ*E4>!(c54GLoWvC z0>q4=%6|f>05`x%nuxLu5_ujQDtE5}s2!Go8Btm-RUQ@c`$N{FpdVuyKUq z!R-W`w*45j7fz6T9}OKYI<89tG_n^v6a{S^5@EyUMG^}}#1R6!0+Rb@)jqirL7gp2 zIdp*LA+wqkbb^NNk@Y(b$W{t)jaqe^ea)ocE#28~*GRPZ+IWv4Rt|w9h&8NKXxG zU^ps3GYRrM_yg6i)d9AT>>NGdl-)c)c;}$A9v8+ADd=pa13Ui_!n|`xfE6svD)b(B z`&pu{J7&-#&aI<~SkQa}rThsFU#8TdE5h%4bk?Y!(-%K72EbiWQx}Sh1tj-_pAb+0 z710D?f&qZSAaqGq`ux~T0A=Pf>@WZ#4LkGqDvw-a9Udj7Q^`ndJH z>Hl>*#Ufs-kVSO{0rv=$9$OP&qCw5o&Z-CN;Z{FX0%qPAUMe;~j(UJL$9@E<44E*} z2?}!D)%0+q$=t0h<5(*bJ{#lNvTh+~ilfR#2r`VQPc=I@krTnXd)iDhq+aRMqj%i%r1ZAf zHGqGZ28U@1pxD))@=|oSAxYztm=&n}2#4c9Z zdSxTB3&{X_h7K%V&~KvhzL3?SDi3wH>9yINHAG@)G4xIVU zUEZ(?&NU42z_N-5@u1}ebldM*yIZ{=`_jhho2o{r!;pG15D+4qPK04By&cegn*lw+)5s6Y@fB;<4UFe9YfyP7k%L7A z_{PI1pD|VDSyq*MQ_W$;PgA`4>Y`J}D$X;Mnm7mXJKcZfDK94^hsHy5sagYsX;uBY z)Q&r}J0)=r=VhX)>&=hN!g8J&*YxhuEmbpaxPp$P&u4IMGQ;eV8STN3#iK< zg#*2QqECGawTalnZG4hMImY-V%u<0g9zc;U`kV!Yp~(FrqE-X(%QMa9SHMA`H!g8R z3~6)qzn_0bagt?0BZIF10axcO09$vy!2MycXg~AP0E_%$8D0z*z#j0mh?^OZ^<(Y@ zv&jiUXqN5ZA3|R@u0gG>7%r2VWH-inX!!0a`0gU}(7xr(YKTZG0otb%>TtLPK!uU+ z4B+F7T?BA#Q4IC|us8IwKpcdVGQ_&g8?%qed?BXzY%;a=tw(PGO|veW(`{i9{M5O- zk98qf_}guPu8yrr_>(JLpclciWl`D~YyGr{4k-~}s9Gbr4vK9aoO2;SXy@2NH#pzD zoc=rwd=BADf9LL!n}as3kFoq{@bxd*!0 zYA<4i;lZDV_zQrLnW0`N)2*FtR{GrDfe!>oC$Nwr=4k@w=I4Z=`yPPY^JAzbFhGca z3XGv%{D`AFbDMuP3W5$=h%cEF3xdvFNKrFWVOu&iA1oU*EMjH^H0^-k3Ybk`exU2c zxUDlVVJYz^Xm${67D7n2w_uaf?NQ3J(77s3SKukr0C}rr%ZR2hbU&QNP$Iw+Wxx_; zo&i1IR?bcFm=+5N0kZks2i-N+()6-pWgY5x$+&KzJ-Lck4XE-f@W?vbb;=YAvvtlxKor@xjT_qT2T7X; zLLe5p=*gu1>q|@lnWW1W?^Y?SEYc(K2gbu{B2Lo<) z8bk%OYkC6BI=#nvIk#9vdq80Zx1aFUY1ZI$g`(es=2Cw)W0Zc|zNYbVf!~kw6sFo) z>nm_j0pZmN3by*aPO~Tkj!PUf`*pZo7uVxf`Z9BznHLAz4bz}uPOB13iopI2;NK!2 zG`W%JlNTKaoduz{C9K0IeQ%vMasCATWV$u-Ra>j{-$W7tiu7NjFHKRifsQz6?pSQ| zgmdvSwDOzhvsLcz;TC{10+BMzk$UgPV%w&DR&lObO}dXNov_kUjD&M=@BgAt?-Ij{ zY)P%#I9DBoTsqSAgH4A)DnX}EBZxRzb z4@p=p^))ISCN&;tf5vrswoSwl=O4=4(Or)l7B+2XF7~%)nnE|y--<}@qO5<34YM7OD#bP|&;)SwdB7D&iisZshz8n)+oU=B@K3GdQG@1HX?d)$52uzi2SY*2v$^ zx#lLEu@Kv;)`day!au6xu^xAGuE)tHnE4ILIwyWCZdAE)5}w}V&t9xLz`XG>H@D_F zblQlG)BT9!iWbjjey}Rho^4qipJevk8w1(xZ2EAepHs(I#D%yvI$XIf5+$jjG1mXV1abFHimat=GSKi)FyU-nqovQPYZ+9!kNw%6RHBQLu5MA>hCM{&u8Ko5MN;QSf2Z=fYV z-lBhkf(^;U{(cKn!^oUbbyDrB3fRyZ|DV?t&qnD#nF?!Td9e0W-%sSmEd*x?1q8p`#N zP204bcVqrMBx>{7_L)t?J5UjmB5w?=JJsqUkJnG_<$M_;l*7lIRBW9}*5yXW|K0Ri z@38f}zjY*60mEN)DqH#)-L!7iJKG-R@iz67Y#O+7<|roUN4b;3E^3}(=@=j5o!V{bi66)Z5{-aBfXvcr!?f(6t{-dY+_uKv3F#JFN0!J|fZudT} z%g33F|Dj3wzZlN{?2><*o&W51|27Q&&A0pawfR5&0_$<&Ttk54dj5a2@luSJwC-wj UR|IwDa+KC79YgKBW9I_@7s+0FO8@`> literal 37668 zcmeFZXH=70)GmrhQ4s_c(NG12El3CHAW9LW1ws)8q#KY@g}LMWl+tbk>I_k8!qffdHUuyf}w7Vr(XyjU9e&u-sy7Xla3SwYj=7qy- z0&R?qRGodiq#Rv*oLr?synMlE1_pJl5MM`UPuD;pCs%j4w}vper9)T-_-(X0&_-sI;*${YiSCphp2)Hyj%kvg+jcpdIzY6Xb5l3s|r5Tzm^sj z+8Pq*sUfUQUr@-#*i7iGkH4#sl9a5Zvy6<4kdlg&i=&gHvy;5*X;KDlHux94r+qFXiL!E-kB~q9QFL zCoLx@2}Vc;gn9=$hDdq`i2R;G$2Gv&6n_wg2@&*gaeT2@Miex|K~F3x|(`6B$UZY}QOEbV&L)yvg8FaV5|{WI40icg?Vz!jhW zo2mc&{2vwovNbmTv&MhA7cZ|rO9TY!27zPz63Bl#Isg{x>nd&T8sLNQcXrhc0^1a! zpT<}9tiP*cppQSy$LH$rn=<>oWg$5^DMg`wj2)ff-t4Sp5;5MZu?v85 zQ>P^5q-3|YYiz7);2jX?=|S6H*j7>TKzX9>HSD(Rg1R8%l zx@E_{j^#EhhL#rCVBiLVNV(J5*_pZJhZz`rHCT6Se>`o*y#0X__Ujua%U^@Ex&LZDd^{*62;`@3k|gV@Zx~_okEuE(*3_ z4zq84FN8KH3VrN}B|TH`3%GPjGiYP|aWenD?Ps(zka|z&49)CReXpKU4XVp<7S-9g z_0ujaUSq~3gL znb`1%znhff+;11qicI0!`YF25FkD9fSgt7|C(8P2Cv#%;1m+aZY)hS5GebM-JR zlO^TT;1sMpYCA$PS$Z5~4ZFxfh=Zn!$>6d~8mK&5lbtpz)${YMIcuizmfSMv@nxRm z?Uz)s`Fl14b7Lg+i*LicC6V42VcA5}!<&PmAD_h4r^ zw|~?K?d-#N76%Ni{vQ1yDdA0D5($axWlSMFS7H4>QPkf4o# zUsffM9JasI&N%2i>L^qUBbVF$2*eUPeveJK{>=MHVY7^}B=(*{o(DyG>j$uX#@Zi3 zzGikNZb1;u|M#r&Xsw!qb-n+Ge5c)%X*5EB6lznz@k|dVpzKI>d&zo`Uw_VuhTzgx%m#_a%3hMDE(Ne`8S~1S@fesh8zGq+}xUmwT*R>mdqO+>cR8dDB z@=yM=^%FQtgEnHnAGp_8pYoV-x%koihdt2k$Fws%fPOQgjuv|y>%&;les2KAXEBt( zMEDkAsm7l3ZxtCU95nuizIuoDe;9ul#+txP_%QHAFWiWw=hvpRGitOEcdvkzqn508 zqW&c=%s*(813)UPIHLHEki9vJYuhUep&x1r3G_c{jeqry31yLa<3ye_jWTm_=m^*0 ztsQg145Uy&9{cGE=ddt^w;XnfA(b|o$nC_bYz;VVcD$i*upDY;2bu9xciX*@Uw6=o zwmDGRDB!{&zfjSv0=IewLG*jPA^lRiUo?D-Gl z1{BazM)I>cCS{_v)aA*{{DP|I_)hhz9P@1pVY0ll8`}qA-IAGNo=Gy2LUw{66j7Tq z;uhGg1;I_oX;W&BQt3bYQ^+`J4Puj2iDp38+kkE70Zw-m6~ucGW}2LmU|OcvL|t|V zE9G;VSFhmQ^T}Zx+hU3luVn=a7(;T5#C^1Shq9=y*xVrRvZ6^@QSmP4{5RUtDwc2u_S|_84p0^=q!@hb>ypxIUDKFik{T zuMfDk$;eWg`kf-k_l{D25UWW@lRu|sChUAKSDDdHYrCLhr%0-L%v0AFjrEN%zh{Fo6B5!cl*94kM=3ACWpwmP zoIpL=9G{w;Xwks~$+#G9!!2ON;^-dTcZ0^oReE^K1*7us0pGRqBfVS46-Wt@PJf3T zLp{3wPC=N2I!d`7k4!GGLq=ZmHJat&f-a;rEBsvF_6kgvPP?#nx9hC7kE{_;Vr^#R zC2hUoUHf6VJ|1~#DB$3hY=9G2MGNf8Z?K&T^FJ3cp}If|ccT$HXq$@x>5M3-sq>$u zG3scJI9!fNvArO4A8i4GOI}XGurhh*Ei2FY88 z6qBj_2T{=KmDI9o*-sO#t5dlna=XCIu&X<4M<4AB@fZ(lKFO$3vh<#Kw3f6`5m0Vx z{;P*A)LL%f5nPnJKu$F1B8T={3ul2Z=9H?m+V?fK6Dh(by3v)Ieygibpc&f%O{Tf9obu`%4MpQtGA)s zhJsp)khoXBPCYf4d~G_ic+dL@IP+gCiea%ls(3G>JvWNip&#%F~**`SrSGM_0w- zuyTn#j#vzfa1Q-K7Z$nF`VIlNUM)v4XYN44ai*iJ)1OkXTiJ(Ua*D$z`TuHf-tSx?dl zLLr(2!vCcZNVB|C&Jaqa0Z{Km^qNueJ$|TCp5E}~QZnW!g>~Ss)!&7{cso7>_oX#U z6>X{yXSDO`;&-8-sWN-)Z>N`?% z8}G!3yD||X`%uutcr*%%OQEm2d6{k_^WocAfywgqF6_=ew3<<|rbUkesY72q*>-eG zihh4x%d=S0a|P0zL`0O;pdoScj_uT1aiuj?^CC<~9H(@n%tU zn(bRKw%Bg!;sP8`__qTzzhc(#q46gi-*^n@a;GxTWyJhLvR$~_*U)X~w+nla+oA zYx(yGZD%~BSu!oxb+qcd@UE|=eK6Hy| zag`3fI1Tw}+%)%(w?CDym-k#A*ddU5`*92$FL+NO*)~XLW5j@q;(yN0^^e0)ku7>8 z$C`b?5C{)?T4y742N$9MPB+0aaH_5Iqyw3{nL$}2nyS}<~| z#C~4-&(Rv*A8oh@Ld<}1@#ZrHkHtPT?a(~9@j1=pW(c$zIWrad;*a~Awd1RW5E{iB@VzDcLl(YEjZ1LSc1{!zX5J zd2*d6?7~vm zFtcy}S%Tw*g|Tpaornja4?QhRT0UE~7!f`mkL=R=b1MYfIN&CF(Qv$bj#9Gik|7Z& z&CaSt4ap(__dgfn$!W1qZb20|=89FBo+2y~hEWD!fAUc}WhINnnO8TZGujg?D+ zOYr= zn3hSVwt*nx0HlZ5ipYpsCmqPcIzby(dd=Sgy$afVuRg&Of)QcgUh8`$9Y% z4_vBw;)N+sNCO7w%KkSBq`2vb>A&F!@*YO2X$4l?9}b~N0=Kp)GX}?#xxs;*4EoT_ z)r)pK=JI)^DFfRO`LtQ(DbykVYP_8_75ImE>H?!MNptHuP1!({lJYF|ai_&M!_P^& zmHMdkp^3@BUxu8sgM{X7s{<2({{bL@{>putsWqH6(Vk*-Wk3T#$$;5C`5<8vx;HpKzzY2lO86Ag)Uk{{y_~3E-d~H;orMGbbILx8yU-mYLEG5@H754aL za}o96R!mN8ZAxhgpz-k8zgC6xFp3B|VgZ76?hU+?6;)Gk*3h93{SCy_^B@jftXkZ# zy1#{J%m3&s2_Z}QZ{B5qJ`Muq(Kgr>F7WS`b+@-6gmsBu-fMb9|$e z6DfQejz15qM3ZM$fz%vN9e-#=4O&Y5wTpWo*bT>*LB*zk66xW&dBp73e_>6 z0SmS~y~@j_KEMVL4pVDwz_b%<0rmn?yB$&n?ReyOt}W#LFRxnoNt?n`_8f0xMZE`Z zFdf)#fsq%4GPO|#6_mJ4j|9}bcx!5;2;HHbC0YMTi4>I3`3EhGi*xiU{kIk)ieH8( zKFDaFK12HL_D(OvkUWf%T_FfN9e@Q8woia%0W++0DJ6Fa1BvpVEXvUvRxPrpeCfKa zw0(?1s5at=#d0$GzmH(-_x0Mqp32jxUtDP+mP5STPxQtYQXO#Z4GRw4&K}q35qeH_ zJ3@E&<>+k$aRJYCciS91A(W>F&XVr@KK`aQB`3@FsUZ;wU>EPUyf+xFsGFV!T!_9j zdQ1d25$U=H$8)DT%ztAQRQhG0cqO!b0tR4sccbD%{Lu1zy-I>1QUA?_DYXRP)Ip*@0>}C74g&niHJTRh>zeAwr@tok@CPTA|xU@Y(H;Zk=7-}A2+r% ziUBW*mU1RlftYb&5Tv6Xn%h#5+=|^qDS(V``vXjEHx=eL1TxgkeZL?|bTbnH5C@Si z5Jcmj5cnt7xBLnWWQ+FzT>yzn(3REK?VRFo(MZr$Ln#rB%iK>F%$A|DUz*|t@fEm; zTwT0~1M*94+#i&a=54mIS~|IwTd}xt0XUC>^T5-kKC+)$yIKvs$wb@F)*t(`dYTbEUu-rmTAKJ&j146mUWm+6r4ZsNxP+DVfOJX)U z8%O{pIxd~od3TnCZCCn5&Sh^s+87B~hB~{g_yfe1`o?x@=#v)Rr-JBB4=cgIZRLSb z4=n83v$DVG?74r?nhWd4@LNDB-EL}4=W#sM>7+!2r)n~_0a*L_6tsSONLTUi3t9o^ z%nyyU8Tp+A+_9qG0HA3ro^FGQ$g=o&;8GV`MF zzih$KKft`LeKkkrPQTOYdYcSMZw2-HSgEhRUnZGrD@dZ@Lq1*ZL64an#r zP>|12Tc~*1hY#$x^_Pir!bB1=tggUm{|C?kR03QJ*cMr*^}{l+HV_fltRWHjh7D~L zG?R;hUAmp3v`x!$!kptVd4S_-3bptJLu>(ns|WEf9r(t3O3Bm^fPN-}bLbg&6C0a| z&mjhe)8{&#SUjUtKPUpFb($>G< zeu^clQ(?h*J`O=YX4y>Ht&-%^ee6O!29x0U#BI>vu&3_B^7S<2LFm5j0gtdw28L*t zaTm3Kv}~6N&okp=T7quK7{K>&I-BtW%o7C(+yZb~|45YBCq+UKOT)Sf5i`cIMp}LE z>d)lG5}SLc+>q&PdD?CYp(XOe$BO{GY6i+;4PrFF9QW!!EF0=*94(Q`202&s;u#O6 z)RGpR?h9^0XaEJFOa!`Iyk{gL-sI}F9V9D|?r|aB!1223{H`2wP})(Y(2~Aai}Ia5 znjf;~;Dz$+Kx9q1-bpnlhJStK?e-)2X2Jazz)~{kTJVoh$%r6;O&&TL>z^a6v&>7S zEFf)N^}6jn-gk1j1O2>LalDhXl-PCR6x(iw(=W4BC6At2Vz!JXt#>HV4AuJH@wu>M zL*4G=x^pZmIIK=4|BTYtq6I%vXJLR*rD@A$1-#v-{*~77yHgRn(9_}Lqhc4c?cMHX z=jsjnY{kR^HI)*nck-I2(?7&L_ZCo0+>6p>8qj??Yb`sqgCQP+(XrI#z7nE7`*k!h zi?ye7*U8vv;rgXR*9M%Kh0r%{VcLw#=>GY)AN-opz7U@5Q~k;m9fe$ZW#X2V?R5a! zVQ-}qafKF7{ZBFZJK3|jB{ThC3KJdUocn;;sK?w%4 zC+q|rtBA0uV2JTBkflggzHR;GMGq4cNROwu5XP5g z-Sixy#t$qM0iW6c5`Z0L&_n>;;y^fmgiE6HO@e6&CyJKXTD5HUqCyXzYTLtbb?ws? zPSV1y!aZi^bY{QF`sdr|*tzGJ_EVq9L>Jm76|_%DIs;?{PzrGNT^lH9S$1qvP5p!F zj`@U0xBY+w11@>gnwk=vi0;ldFC`_$ArjHkVxF~xM zq?a?qklJM%8a>Z}#3BkfYdZR21&I0z03DG|IvQ`SsX36r&Vi8?9XiP%0a6E{N;n<| z5*Q?L?kJ_s`d!`|nD6bHyd%u*W{1;nvqdqSX6nP7m)GXLJRU#TGqBnN;e?vDER$a1 z#iI+Gy^OqE-2gQJV8(MpA`i}fs^zf~>4}2JsAEIMR21cbn46_BooE8_aN`nyqy=^e zvLdy|nbD4KhUGDjjiIO%10#c2xLc0pkERlfpX6g`M$ApTx4`~=O-`-KQa$?^v=Qlr zs!4$5OBJ@?3Z}Kd9l0NQ|4($aW?*eWcHR-FprKbO*%?GekZ_aRM%<-xRf4(9<1873 zZsCmcZfU0OWwMM0I8H}hBY?kVz==Vd;-VGWcTp7uEzi^2$gC@a#^Luwe0z}C_BOBu z}49|K@j2_1wxQIqh%H_kWpdeP896K&zK7m9j54W&AFpv zhgCBf3U3z_-{6ke%woebSkK*7J*2<<@NsuV2Yd$;p*Ra!W302`2a*Lfa8l#5956m{7*Zhdux05byOok7Kr9Bt-a{q6DHZDzSFlb}x8}Si#)KFY ze%8TUhcuWh3rCMOWZXQhU4K~KGkOO^02cKV)mSgLa2Oy#nX!y^qJ&UU`{PfBL`#vQ zid6I|2-2jCQdb_%)EmZk+MxLod&1BqNJDLOVP2 z&(El4h)3R2s~q&J+7VqSPM>_#0(16#Up>%0+ZsVF%0!UmHjU)*Ng`t4I=%}@+$k3M z%#m`fJB;?@$@sz-5TNL2_$oldKFacRf9{&g<}7J}(GJD!WYD%W*MF3q!hizut`Y)TbOF0}3cH*up(C+!n(U4XOtuqIY-z8L#7WTV&~JU_}~I zmI}wap38Hmnk?DgAb7hy0>lgb{v=&WeE?=GI00gpVv)e=^nlp)CSQI`q zKtkRWAVH^xedsr7%|c&&yLiY^^&KE7mp)kgL8%FjZv#Z>s>8@anzW*giV}~6F7QVy zL203RnrC-mqqAGlTf*$so?}b)Cn0$s%Y*C-EZj)BLfd zR8`y~xrHLY2$`LxhlCD6|5EZebH!qtW{E%~APy(8Qx0VJg^#Wm&%O;D%4jd3b2IK( zyQvl_x}|t|8#PQQ*-42rp4QMzH#XdSTay*z#kRe7A@m`+JP0UwY%zbetr_j*M-h%W zaJ7U_LfA)g=@DhnVgUcanew?Pw>lorJZTa`i8|eL2;rMp7MPZls^RamU$q+&Tb~?W zk5YR{yKq7vv8xN}V8+N$@TO?@?HF+(RFxvm=x0Gxn##+-RJEm+Ad?mH;!oO!5N*=< zKnk`>cSi~68tB6e0bF{@Mh8@ms5U?W%k=StEDy$%%J9wg;^K4^v>OFo=D_N$siOrARZRhx1%&wb4pB&(UeedzKRPU33%grztrpy7PtgCP{@o*$FJ zT3^pzm6!U+eqdKzV&SK1)k9LErx(T*6V;W&QkkQXIt0gS1^ZOF*ExU{xXH|jak6%= z;y&H_64J16;^RS48!rdOcy)A-6L9hN;864&qgh|a4x$48H1IgWu?DybK$8S>0qSYm z$(ovf2x_f<#js(MheW+y{Zk`ekz=B-y!c#d-m)zN8aLT6C$Ma37oHD+t<MKl#v>7hwxr3ZRu-W-C=;KssSDAq$m*q%5!(J3`aEw+Iy7%rcfZ!%Yc2> z#`irN?2alOF!vO+sx)9^0I|zNwt;)}^&m7ptcXSV(eSQLQg7%!PN>;NqgcW03y>Tw zf(V>SX9Zn#+C)q2m4#8}_OLecnW#xPJ`5BEc4NvfRiKGom3}Ve5o?O7kMcD7e>N3t zN3kbU?|lwJXL3uFZ#O@cozs7`=i{`-X?1PNhhsOk=vbC~J-Zt)*$gu%;xW#Uh&#jy zUC!2%R4eiZUa+ktCCj{WAg+KjZh$1jRgsi&9)8er zZiBD6ilf3dnw6@_UqV{G>;fU@^y_QV_tsD;xd)ejDn5}lDo@ea#~{vu)e8Cf0o|L1 zti1*j5Pf{7kDVyW`~u7lxCcQ+ixEu{%KwiS%awL!+!#%HvJZ>bt1^qRk z)oedU*Z~VnhDrI08jq&QCI&Mg?5F9Ow%MVjK+XR%!DvOxGPE*KriFxfY1cUg>)KsmdqR1nnDB^Vs(#s6cPHXRw0I1O z7BTjLPL9$O-9S6K-bh{OIQ>mCfGm>tw)JC1`@VtjQgSS)*}j=mm!qYt3I4dLlfzTT z!rcvXsBfa$1d1nN52S+34$ZimxmDbHBSoF1OpgF(PVFAEud-j;afX#ZTYFw=lD3^g z#M3LE_OeYgPj(xqLn)))S0y42~36?a%t#-K?z;@TOwi$){s>k>_%}b zV>yiX?1b^a^xbdZ6X^_L4WN1CN(4*CDLUDzu08Cp?C5N+gJvE@U?$b~lOD)yJYx>^bo~@T1%x2M- z7N+5r7gL1Az@lwpNXrEwD7#k*Bxh#8k=phvc(~_+%3OF~goS|wRshg7;zd#k&M1pU zS-+X!$X31M>H=q{Beo{|=WPR+Fp=|P(E4)Z3=(C&gLDuktr^gp1;^7#InM=P+-s;c z)Sax3$PHdGOI>>6LUUP5YnJgJITkjLwa_-oOAHRv^6o2o_9*Nl-EE{@zRPRL2@6Y! za7-mW0jD+wdz8|YA3}iK5wI!;Y^K80OQcrE;||7x5;E~r$sqtsAIu7qh5^lEPfl4Y zJ0f_+Sgje&z2xUP>4+TYzI@LQRP%u`9CW@^9+RaSIKvjjCkD2=e;=0EvSK6#xT-Dg z?y6RD^Vln9!Bgi{umUADAC~(-0YYFOMqid<;p9PrN(CBG+RZ+X2iJ@T{&;d-hOYkX zx!#|r+c7C&CsLimV%IQ0%|JNg0G$BRFCKnS0*yjITO$E^;C{p>(N~+Jv%>>ZOD91 z8NE5(@B|*}HIBpFa!aUy3EPv>TZXEtF+y^^9xu_-LXCymcbwXSesG?(ueN>%68INLX^)=9W_1eBK4A zqq-fUH1_p{8{6ma8*1HGun6H>449*ZEmSX7QY-CXd0B>WS5Pm)Ru4t{ZGQgzjqPOm zXQ8Nfa|&Nq5b~_6o*&1S3+8-hCRS-d_XRt;#-X2xk9nWt%hYti1V{+wBG6M%UK6{H zkE`W5>T%GLwM7pP8eYhQQ4oqLAV)Xwl;?Ql`i@~XJ`1swupb8FU0o^d&Vk>Q8?43# zN@5TLZ@OJVN8jsq2jU*Q7vL#u)Uf6t?cc@oK>5pp&pj=Z_LmkL0Vu)mDs@!mxCa9^ z+6`0Mh~xK?gVvwjnsn5_C7Nu0d}|(=@-02_ffMP{N47(L6DacscM@p2HN4CrUU`$Z ze-yqxZS!M(`s@3E{a-e&fJwD!FErH9nwyK4J2Ki$%RqYtfWwvxfaftF?k%(0{F#4~ z?%gAsfma^0rryF(Hl2}tE6;8%pgwmmtmxi;knmE1=fFPkz35!My7q1fs&rwJxTdw} ziAZhXC=QODFY5d9-9>noV)gNU$Es_eH5U$M6*ljGgSs8jKd)Y~iC8WCx;*CnBynK) zNgt-Y5VBNDQR2ED+Ab+Va*Pu_(f(q>f#C?tra#WW4|#Bm?VnuGk0b{Q@I~2rZDR#e zydjQ7H?$ir4l9s$T7t6Z0Sm1YsQ#%`QW}rBUP{S;1G-)#A>2d$Ij@j^ZlT!ST z4O0E&XpJ|n(*`%Z?$fSaIPfh^ThWCfi+VBri3G|$CA4O8we?Fu)7yfEi$7M?%au#= z53;h>Mm-Qt?M;7~GVIuH^|-#nZ(#GLwB}}D7@#?nNVO=>>h7_LoGlM~9g99A>9&v~U@5HGi>*O`N!W1Ak!L ztmLR-Tq3pZF5~&Pxa^FyoDZHeXp`#d7!Uba4|dJvr0JiJpNGs%6u6#=d|Jx;-6_bk zJ8acbK=z#Gk2rO*D!W#Hq z+=J$s6@CwTv>V!984|UmK~=*Jbh4;5-aeuu}N%oR$Ml(Wi|5>R$1!|Ga)TK z=0KDu^u5bs&1iRXfz#s@Mf5~@ecA5kPd;>h;pnb9Fr`Df@Iu#QEuS0K4VnSAdGQUf zzZW;zJ;*q6kq?RJz#M<->ho9H6tbX?(hV(H|ocjiM zIcj=Az2M%D0DTJbt|^t{K+?60sHQ^EZg1Jyi!X_fJ!zeGfTWB^C(xS%L0S3PO?C(; zOz^7fgf6Jz)`9Zs9B{RtX7!)rsU{1|x$Ay!PfVTPVY~;^%^s;ZA6B7v>eYLL#mJVj zVZnOtAAU2U4@ZK>C+|%f6+1-n;0jU(VA_h$x*IthE@9sBTyoL~7E#u3z9!|{l6u_o zMthos))2eKiwF6WtOyS5Dh~rHf%Pe2E%p&(e(bPL|C+Z487N~H-X4HQ;DGfu+(7XV zq>xVo#f@)aV?l$VRs-O(L6F#-pPj6PSNbGDSl2rTAtARkqgdHFFx>;KOZy}FoD?4R8cB|& zp@BXdcnP%-0TieptrSzOjilDjQvaaEqRx^ZeYM|=1V)J z6hekFU%F`$FNI1^hjEC`Q~89^Jr-GCwSUwtDNzv}ZK^DUE>G)sv6oLk8{DREpIjK>$hM=S6;S3xv(H@jN1d8Rr-ifyzY4sVb5_Lky6i4orH#dQi&y zBPO7m=%n)yNqtglJh}POl9_PB$ok%X%Y`gepWfP`sq<&cmoZ7NP(EVEI{&4PyO0Dthn!zF()~`9R5BhDIz1U@q&ztfFT{>$-0CWD(FYcfLH;=?=sK?VW;@+ zu~z(A*{LA&lq=T5**)m@8-iUANMzQj)yJ9kJEi**F}rmwwG}rCNh+B^F!s>735&Nk z+4o`}#60aKI_o^LZ5U2-9yHttu{sFTXJ?OLJ0Pq0mNb2UmP%XynCs>WippCZDVF;9 z`G*{p;EM1#drZJD&gj(_$I)5-XYIB?QEZ63l9&S{v zMT?_R{IE9tQbEhJc`dg)q=P*z1j_ z7!sW;4SEU38w`T*(N68F3Cig@Fx=^B1M3Lh8CB zIxqcm^)!t8rg$HhMer%_mtEAVZq+s!F*J%7)`drgHy!=rxmcf2oxFowpt`JdMffYq$FJ3zLq-YwWoy}74$y#IBDW_TT*fLun-$leO?2ZnXJGZ88q?%fgl|XTX zm>xs&wcAFZX8^a@LGQez25})W*7ls9Go1@BbO4QpVu0w~c#aL26g%Q@{fc)@j^gYX z%UrhMeW+q@T=$~|kH)Y|(sNBD<-FEw53rNwg_B9$8rK4}%_{ZHxGknB-)=kvP@wLo zV{9zxSg)?@#nyNPH|3f#KaEH93==_JGq>jRsLK8yZO0Vr>e{dR4%0@}QZ*G%01~i~ z1UgVl(vT||Z$1m|t70KoxwX?Z^O-T-g?)J9Ojx<{Z4(oZ5j~K55Z3j8e~vZh36qik za*^>@r#8aJq1;{A$W;C)Q(R+C1pMR^a6O~i2=6^<=gxllI7oEq-w5*D57T`Lo`d-I zX-krI!_3VjgSJR*8Vqo-az#?cZGO)h^nypU#6h>6V;{O{NxhG9SW(k9&Nggn6LU4d z{t=^z$$|H(a|}EJV5*`*?pJH9Q#u9m5e`=kBx=~OQ!JL%b(HmRizSWL-0-NWXp88% zg4a@$?zlnXvHp!7#to@b7E7pa<3Cq)e{O11LyTrY-;FrP>0@^cuo6s;_Msbj9-X{i7O3Ir1ka6)LkW(#zdd;Yyom-c*Wrc6x2-lFxD~hUO#|qhr z!cjf2+xUrszhQ%@r;7fnXOwiohl?JS713mYx)t(15gMb(w`B`%So&^k`YwkzqN@ut zUse{#A7QiD*!3v+gzp-`_TLtI*PJlg2+q#tvo--K9F-f%k;6VMEZUX_KaV!3f3cmj zHO1KT!lcy|ZvmQ5DF!sSI<>?j6+r+VkL8K*WHXt^sLcslfvtv|%iFlk-2n^U(cPp^ znx4DI!*g@B>)ALDmzqRhcsH#sahVkqpR;7npXJUk!yd3EQ;^( z9A@tv)V_`@--*jk?uRWUhPS=KCCBb^0HFa(6uB*Z$9Q4Vtn3Ev&25}w1MqoH86D0E zp{`z%1DhjJ|9|G{=wo_a{3%tK)0#Rlik_|AKItPzfOM zoT46WufJWu78@`6RTUh=+1R&YU9r+1+xfVkj z+!a!@7sWhm5pwV;nSdK7SA1pAcpWuqwWGT#PwPR}w}o4c5TJ7~|BGKOOTRwh z0_cG%4Mk0^SWpC4QxtjcCw9h5Q3bEx$G?@{+$Yk!Labc#G}q=S96DZbz|uY>|E{v4 zCDP_iM~#fvvw(jx(riaP4Ygth`VEX7ESL#_?H>=XN6aKGH~LxR-`uU=i@12fr0&wH z`b)uagG~W5D>HU~zfVN?OlbZR&>H_?a%=oY%T5sE7S10F<*SgZFfqKuqjiyGXn(3h z;~0i8htZ~7AU(j z8-6Czl5=X#&pdPPW$Rtl!PSc%5P#Zf8|l~BKYd)p;hIMLR}B>RQ(J;PJAKaz4h5pO zKg+jSKh5N)Y7SIHqza${bMKk)5H~7c>Ve3(IWoEQE!;JQ30?uRi`8jC9S}M2G8* zV9|5+2eQ@vNb#{mS}eqVofzEUQ}%4Z@otC_KMWByqHcJz{fd^)N`Tw`aV+gtN1;sl zs3*3tnK(^tJwcvz=er5dE4Z2Pxvx3*vM-zsdn~X$rD9{46v93o&*zE3N% zN@Mjg1~$fq-PxTh-!E&W;`Q;?%Ex+%))lSlE8Lgw%F5gUyZsLHD0_e_wLe=RAN!IR zfL)I{GmIK%A_RH|$fT;|Fh`m!MN}oYn}^~WZfZ;2TMJ9p5tZ@;2=Iw2`2ur?#a-DN zM+fD9km3yop4NI=%S;Wash~AK9Ptq_FSt4enorKzWg%m)C&!Y|;LR2Q<~RK;Fwc1( zt{;8f%r+!%fq8Ei!ruN!;R9Rh0=7S}{}|T9nfmMub2_&8hK74lSo?jy&n(7S=G?Gx zHjpx?LzcVl#g7o(*f%ewfA(xBG)yk?K!1O4u&#_Ct+b|`Wa&xOmxUsxF(Xzkxa?3% z&nW9ylEQX})mF1ym_A;F=KHBPSL7-mY%RBHariQX@^EM{JqZJIYR~!@(35)mw`n5z~io>JE3p>?->L?-xR7JkCW_r#CF!ZkHN6jKkk! z>e*h#ii`SPP7OGP*VuP6L9on`pRCAx!Dv>8`mxN{lmIR1uHyAqU9K-|KJ}-+2sFp7 zeF0tnmIGURx(LiVa(ysO6}J*?x<~fS8dI5ZS&ziyG`z`57DZgytr%jrUaiabx-56X z$z#96*DFe2RMK6HDrK-HOawie!0Z#;JFA!i_A&%g0O@0*iKeREE9&`V#a-J8v@c15 z+V&j(u79AX3;&(SQ@v{b>^*HVH#Kmu#i+O+P}!heW{*!&4IPq2Hg_5lT|t4#%{E0W zMtpZc6f1W{t0&>hW5l$2sW^x3+B$~7JQQ92Vofos=NP|*#HI2P%qyVg5OUMKnE?4O znKuU6S1(z#WQn8a5T8YNkCe-l7`*C^a+&q{2HYL@hPRUkxX6ZEm>nHyzQYSwj=)-y zK@ZC1y0o0!$N%gFuPX=4zUKfiy)Q{w7aH}&l=N8cu1ilxcH-tMBN)4<|NB;}Ndw(w zL3{W6y|vT*--I7cp7$@;i+#bat(Z>~`Qet5k5lmrf5c^RzU7KKhen(T;NW&we&Z8G zM&4_i3$`C6i=tleFc;^0q^v8t1)fA}hJw~w`K`vxYl+Wl@&FE)^HE7|zC;fDvU1zW z3{j!titu`wXfO;B=+x#PV6h5+UrUY&2$*|w=(~om?f9fonOilcGTOl${e~`!Nw;f` z#`)>4QLh|FqH&7F&6|>3;(JxSV?2s#ujGGURVkmo>)17k(5hW16nyXbY^=RXvU*`a zFw--Jq$CjOUt_ves{Pa41PEMgK3iuE!pzI(FnGVJU}%oltzuc%tgERpcW1Y3-bb5J z-EQro$ zovl=uJs#v8L~7mB^eh0G_T7_k@{Z!GS*BDw>91?!a_AHb;Jq`vtf}A?9c1NNYP@>Q zMOa?c`b?VYE1Qg4g@(gDEkREb4bpQ2-=t0NEK_`Z#lB_X*pCwbS*!Cbd-#TPG~D$R zqwM$zaNS3RkZy8q*7rxZMP4sIZmx1Q{h4S2x+4bD3I~I5-G%_JiEnOrglcAnw6buu z3M}r|j650>7_5jk**pQ>n_!gyNfW&)5=C>C=egmiB&aoze}6xe2bEnle!bAp7}v6s zC;g7y+F;daTzBZ}1ANyy3e8#wcM=PM35r*;D5I-T;W_3OBw**w|0E6`P9bO0OFRn6S_++q6W11kf;4K~`;sMw?| zczegWVJn;Pn0Y2Ma~S61xzA)5rp|~suWeR3F**Ep&wz_HO#uJnnR7KuDy_bV?a{05 zhSL_#u@DXSX7*5HcE#0U({)8lv*hVI)1ig;hpwsKK!A3XN=LKVreL=pS zs?{52mONgEE7^hTw#P2Zb2Q!PFsObHbk8=naPZNR(#vLI=&=rWbU=t%-9W|m<2OT6 z!(R;$S9F3qK$p(o)(dmzLBG$N9xW213cVR=f8XmzFYH(Lt=|_A3xD7Gs4r*-x%eVb zxTDW5jN!5`#5!1X&(%txML8$J*h4jYEYxr8Am;K?R;_{cP1lGcWZ8MXfZo|ilY1Jv zN=aXr_xf%2SadAAcU4~~&f#wfLKhCQsU%ZV>D}1#AXnSOO5cwPoEVddX8RE%&SlJ_ z;4kUQ-TjzF8)4Sj9eG(*k+e{i{sTAiRT{InlaF}U`V1SEP;hpEMMF^kM5L5V9=(Gq z#v`sT`@QKfbJpn@ou6SjCdpxnL6sOa-5ZVXuLY`4W3HgFCq)%GQ z_{scZ?O$X}R|4L(CRD%M(OF2zj`83Z{o!^yKh?E*O(Xt$FgH`Mnzvma2CCIvwGRtk zAkY*5UAv#S5QHaPjtti%9yS*Plcp(HRaS#NTi1)XwKPHgEpd) zbyp$nhJJ?-<*Q#7{O%3%@G`bWD)@gqdin4S-M_y|HBjp%_b2=azpwO-jmtPZ`~b*R zAc8FqJ8IrvWFpM>a8VurhB&ebG&_`zfp_>x3z-zVdL|jfXv|68d{6%Ln+>*WYQ~FW z3-uGJEg3N_;8}8j^0`Gn9$05484?F7TF%^;y#BkLf;hT%dE;2G0ocxFMGQD((_wlF1J=+RMZL@1`U>DF0_nxo>*OcG`+r% z(^B&#)sunexOfLqxTgUXb++T#_^{vmOTZWanb(RkG1_3ma<%gW^R8T)DSf0mK(u+q zO3;3nl3NIwBH_9sOmgKC8g06UN<#RA&_SM?NNMy7K3K=k-Yx@B!Pr*zrti{EatCT^RykQKc6(W6%cF^-z2{ew7}rx+xoIh`H^<>6 zI1O#Z4^v*+2x1}iOV_FiXq7esB@>=gz?T={zO6g5>p;v~1e>O+3?^j69#+tHb{zQ5 z*!6b)5N!DDYZ&0hfDA|~>ED~)?}vf&S(;HG`~>DPv%c_~ifTaXKWi&K=V3;H^)^I5 zi&=sDdP+4| zfbN;>O?O7vlhm|G3t>#unX~h%`LR;_%W5=XW|d?e|0VgijO+P%d!jlX4s1MvtRRnr zM`W1@iofq3yu6Xgg@`i{5xNmS_?pkf4OBuq_c`7N`vCG$Fp9FRIb^b{~ zMFo%Dz}Pah8>kuW^bQH{h;w#1AtJ2edohV?#o+%sVj=7?*V8o4-DTTrE+)+hGd^8_ z{Jds0z8jnG9)q1Uk}JprHp8t=@C>})cW);-Hpb&!{{wR74b?&d%IWu%nY}fTfs1^Ox99Pyw)Ga-pvzbOjy4H8u zxit-aeDKUV`mX1py`(Q}g@9h>o~Z!D1o=p#OS1lSIm<$S1SBVqF2B02cxRss>uzk= z*Tbo6Li``{DzR`kxBDkbA+4+&Sx`_zb|E^7aYZw|@CyBuwOE|c3SQex5)bWtooA7s z>qdv3o6iz`;yJ?7D~kZ-T>dT7ka)rm1= zuMH`6rJiAE@)Q5OiP@lG;NUzUz@%c6qllf~KdNj9Udc&`=M?F#qVU8MF<=Zjl&4$PBHVXq(>y;k;9Kr>;s(hbN0u2aKF zQ^tZDH=~@=qnpnsc~M6-%RkKDm-!mCU-=Lca&YdvHO2Ip?|D`96}7Q?WtTZD$WA|_G7ri%Rsz>y2EvwS zuTm(`Xx6kX@U5iQqq9fH{L~U=8G45p3CDx?{FGvsF1}~-)mRM(p~UXrJP?@0`}fu4 zCw--12XEvt)WhcZUuR!74E(wP8MrUOId}E2&cjzdFYoFx|H|1upyIh}H@gbJz2g`a zpKw*a)>y(Ai)~yR01ZcyB>v(UnP<&D)S$@k6)Rl`6EWweTS?Iy>vK4_1UV)*?DIVB zOSsh_0xku?RSvopzwE6_{jJ7$H7n+JEY9;4_pd~>8ZRx-khRz-{{oNd2LC@t0;LjO zFD%n@xgBA4=mP~F6AU`l+z50W|Kj`4V@V4q^7uCe_(WdQyWi*^Jb;3S=y~$crrLxJ z$^ReKIrwUxtt@kO7PIM7yJ0Lc|etlXa~b5$mNEC8|&4)w}XRygHR$^lO7G2R{PmL za-@+SAbPc#b(4u#8h5t-w*G~EdCt$O<UuxduAB5!~CwvFqDdn6eFf^3sI? zHsXmd5oXCjn{ux|2ZUEOAQu_b!1JoBv zd`(Wd^@7{2JjZVLBoNfuF8+pk5L8Oq=1V<@$_>|eUfHWMK_3edM7(a1C}`;B+h#YL z2ne%CdjS0hkH%(%4&6pNz)F3t&c;w(aIVyPbMOx}0d)+n%u7t~g*mFb7|W=eI5W87 z!H_aR^vrinC(arWd-Aem6pk*ir0qjaW}j1yG2cy%x0a1-6j=^(nF|r^Xx!4By03dp zCpa$+SX_u7o>m~usxc==!ux|1u?99AKinp}9>)|f~@ zO!FiU&F@1y0dU{F7zvh9U-LGsOl?p$Qx{?>7SfY7B(Z?b+)eYyv3F0Fz!#qk*$5)q zCf-*1s7=KXs#8zm=sR1lbd@axs(^SB-S?`@Y+lFzTf8Z2bMB6?ab!66Z_5?YGz9QDO7Ak(val(OKjK>xi$C!t@9}8XF7UD>|minW=oBx8eR7g#< z^SlPQe4Nc3Q4e&P@|V^z@D@i4S?ggYwmki%(W3?-&ArAvsX4u<<2dPZ5k1cBq!-*+3(hh<{?E>Bn04z(SK54>n+#i|iQA74ux`gQGC zI&{hAK>HN}gzy>`kQz)o)M92(C7)-kp5S=isCKZHba9D#a9i1)C+}^N1wytoN=mc+ z@^U@zOdT1yD$Pc{8%=RWB#uVFjYBk<(09C`mUSi1ag2F8vh|`2`0@0NFmq;h2sZcnHp7vR=3fl5$AP+h1CE~SR9jyRW4&5lkSH70BD$RQkb}IQ z<6m9O)X^za{%v%z&HG03M@9uQth(EHJ6ZNi^PQ@7e z^=L&Q;@QZYUmCaa7@Dq;lh2$Dt;n1IDM09Orl`U6KjLaQp&3HG1> zSg^xK0E6=Qa%`B#QN7?S1NnC64`J5SfYayd8hss~&wle;V_>iNUhC2qEhpk*#Ou7- zm#~)jWK|vhx&vEhBExYM5;p@!tXP%!JN$2YZ{X35iFJ8h)S<^|-b$lQYxD2H#f9jQ zS^ZuKS|e2-0J>)1Pc_Cd`9A7t(&es}b^DW>bpt|l^Koi`b2|;xEjQujywyrItzP!N z^qeVe_8(2VrcIPpnpP8;p%lDM>F~<}c&4!!T2kwQ#049ZP9N{u$fRX#RQBAuJ%kM{ zcZqYwYl+*EOcd|gc6^Q`*$=i|u!`n-+EVE5*8u0;0(I}I*f8Uxdh^rOD${tu%$c#y zp5C`V4Q4Z{ucwcobe+4j@*&qc`vQ&;vkSnRwUXDV?3$@q%#{v|DXn&IaQH(((~Qm1 zMvJOdzh!<^b_Ic35%{6n-!QQ6X&~du_?({Qe2pl&KJs%5U7D#Ba^YrOPBoeXY|rw+u$0p>$^^btrNQ1^MIMwks}^0aK|TuAh}$WiLG(F_Fda48eu zNJ;?ftVbD9eGW6CJ7<3O3RQXXnI{$XzW(avk=EE=|G=C>-~;ea36?FiU%9wnIME&I z(7oHX|5=h8UbJe}v&-Q%Yo};>CPG}D<9FW5xB2zl!S-T9{h`%F|9R;vD{9-CqZItj zi*JBQai(a#Ctc{pSW+R{rKv?RLi(YJycAMJP}|A~b1zz>|EsIIS|+@ucOl6+TRXe7 zpFM=J+3PIfjl^SaG(#Dp9(r9FZ?C+Dj77SCwC7YrGQ90ciRkxb&MSs;FxUhpWvjrUR)c|A3`b?nA4kDgDI)xwM`1t zJKQ5buTJN7#j&ll4zie7{Dw}`3BH&waOhBf1x(JdYPEh zuagWbF8ALT`|UZdCG^Wl?)%Gv&U0e5yfk-h_3(M8<jp*509|1SSrsn@ z)@$!Y-mT=sh!B*`j53}jN^0=X2#_Uol8*P8ckDg!IYaf_@9>*>RSQ>#PV)>03T@@p z_vn4TEkaheG-+q!BDQqHk~1GihsukgWpXx(qku##4AjG*B{S@Km#dq@Shs;Ria*!5 zwit|wJp%oqfXZ^M>;xSf);jY}*=>vQV4h)Pt>lY$-wy5cR)~!vKl|*s{m7!MzLH%u8}+HOa@bA|3`<0a7o*V|nMg z3htSz5Ck>i5Rl5^kw8xK^1Ciq**Ib_dkDZTPau6FgwT29Ky+alN3gG%OT|n#nmn;z zQZ{GkmS$K!5R}vEsNH~rvf|Q*M(S<;B$rI^qiLhw{<%&y_ye=-)eEm*;SyX5=6on8 zKViPZUS*6k`e|Oa^}A^?R7W1#9s3Domi?l$J6lo|39ta*Sj!&3i3_txz&(dO2YoYa zxDx;9kk)I)zHD>}5032Sz{YTz034Qt5I_SBOe2NRiO0XiZpnqMG+))LqL6Ev{rX~r z&&JisHLzKa*J@`oIA%v)99>&xyyY1W?RTG~!ZYmQx@}C%!YWF|YGO5MG23LLZ7SPt z?7;j!@z)cY)a|CJxOmf?>tk^o$#S#8*4Jm_OMfo>1dz0)KrsM|Fm}S0Xe{WkYz~22 zm^*-h=|pgvTYb#46f4}G<>?&NdpO(}wBdt)_PtOu#rTGWtF3XU>_b(Y^K-1utBMdB z52ZX*pUz;^Zd-bJa;(3NU)yd>$v`An@>icMVH|g*Qs#t}?-_>{nV4f{jdk*kfhVW@ z8Fzng$>1*R9AbYCLH^DTfJH!ohS$#$PVUFSs=6!-pv_2Q0^omrtQ$_|^%~)BW%o|2 z*F8UQW5OZGJ3>0aUEgx*nSSZSV@&15E+pgPy{FFSO36`c#dA%zNxg{D%@0TcBhiLz?|fjiK8x(qco$LU>aY37=`3hfUP)k`g+XH zK%fP9;s(B~D&UZ=l?!Pt-gUvjcF z^bh8>8L@Rc_eF}or)M}ipUW}c0tf3Lr7U|!K$bDcPCJ6D*{QBwv2#am>e+=S-JB~5 zO`0*876``z8>HU{vK|JX_W=A2yI1aj47SBNyIJ=}3Wbyi+!$jIAQ}sRcGOYaQ1!&V z1YM%C%2omQXA_S$piG3z%*)Q`oy6VNxgJm`^P+NJ?3bFfsy}-x+$|e%?Awi;PIR3K zk53UPqT!~mqk2+v!3x(%ZGjMsFq&QWzQ=Uyl=F#e876OCRx}0*TM13=ZU~iatnf1= z=f3xM&EP7!2rH~R3HUY6{sDF9RDjsM?cr0+k0)yM(%v=$v*Lmk1m>7MTMDRXo7Jdi_5GM5&)g9A!dtutzwEpgWj@ z$IYxZLBsaet?!MC=$dMdtI-V-yjVNGqK)|L@y%1cB3r&L&7l_CGIxgUaTKU|6w=l8 zE_y$H%hdGQ%>!52@2{C~k~K|hOSbj7PO0n{kPQ4zjKb+aKzFthgWLsPNycPsa z0sU%Gr+x$^5G1t!Nt|BxIKH%ZC~;wYEO}8!QP6HNv|zq}U+Ig--iNHreND+bIH~JF zL-i!$6W>D!qB8aD5o$FXn9>j$P{56uV|U5fA!UG8lf)x5Q04{>z$DA7i0zl`hipXc z^nTZl^|r;6*NTqXE#+)-h?%)IJG8Gh;Kzy);-cxf+^~6WJO!@5Px;o3QufpAq?JfT z&?X!cd+xAFamAZA20{V~A&GVipF8Lomz1^H-V$rPKnb*sqA9!fZXiQ$oGfq1LXco6 zTSe?r4e+c4Z(5IH>h8;zrq@e-Frg_Fq55499>uyI0}BoMz2Esfv>es7SM_gHKFT(F zd*<~&624y^pX=M0!qHP*guF1_pm>YVf*%~yJ#-e2q!>!$+*}?QOz+rK*LYo08^1=^ zV6HJYrcvI)e(8zJ8Q1M4dx*0q-Sd;q?CBT^dPR8mlVfvAEv?3iprY~Olp?lmb#Y8? z&H2HV;``<%%!32pS{5f9X3Wrl!Z8VBfXR>l zj{Qyx4$^-rPaLn}_>hn->W6HRQYey=OZ8~AWuqVDu$wO}q9a{DtvZ7ETAR=n^Od#6 z_=PHH9cT5e|Ga=6Wjqg9k4l+;Jf{Bjq@T&6!&A;DOHWuWGy&EKp?(E)b~upu6d{O0 z;BGdi4t43r-*!YVoC3;@BSut72}lM3^;6Tw_n`{Jk6CGqd9QJ;FC4qrz{(P~ZLh|F z|MV;TFs>if_8=o-e6kWRy3JcbzoWHqjWF|5rS1*Z<8yB&#lWF&;H9}hK+0TO@sVxg zBa2{Ifo$=u5lx6P+lnALm`NcLfw!PRSE+M`s4vzhqTz8PHD$VpKIv^? z#m(gog||K<1%6cg$xHhgMQm$PpY0h6F!vod)Dqq1qnZ--{)-CVtKVrq;n2YoJ8k70 z8~6b8$%{Ij37wqZMJjUHhDqBaCK_~f(nEK&6G+}brTh+hJ=Gr+^uVAxJ#9P2bAvk~UsN^1kR{ zUTM#`&gM-Vc`UB}{S)Mbz2%}Ah7b-#S_A!I(M#yKm1Era6(tnDeQ4!QBhF2>0iqyX zQ1rdq^MNi(iGD_jS>pY1M}*NR^=ps6VO<})1qmfLq2;ixUr8@qj*G+nmHiz5P^E^sHpX87~Q#0olm`s#gfC+^)QYz3y*YLr+7pgS&1eX~4=8?04)ui{VD){$ zP0?yQw1YpNVqoOYtu4l*H9GW>RIVWs?>{+?FkrHhk;(;^-<;-a@^E5%$E~im=5m2z z=6_r$gmxEv6baI(j*6t1UH7<%?VBTge)X-HiJPA9lqlLv;~JPtIjREKh3vwgU67k) z*1ouxXp@^N)n+JLIe`(l@QFsr;Tth8wvY&^LDrDYF?lSgdiMY|1Mq_s1FfKCEYwvE zDthSxNe;3Mw^HU-RUrsrq&bABALpf1BD1}Id61Ti+Euvfg}k4bZn!&5BlL+N7RuI2 zU^46NQ0tqYnTRvA!%6#LUyzJ@q(MXFDhCIpw!vqDy>fxf>8JJs?w>GUpo|XbFg_Y! zko@!#909R-1Aae|P~su}_^QHTpyY>?568<{1Av)6f7<)d8;`0cuN4}Kbj)R3?EB#s z$)HDZH-0z(Kg_nx#+U0mTlqGGAFijozx9>wN-uk)@KCg>qf_*WTiXYP4s@Gj*hA#q zD-Bs~<6)0%AmRXi2TT%#mugXKY_C#XJggx_SZU3n-2{p;5IG=R>-WEtTH9J7pe1cr zdO*bb^=}rt+4m+ALO^n6;w-c-2rxmCDCRm4 z@+6>c3-=>I9ley@vR`?vjone_9+|*ru$)KWDt8^o&*3ls$abCt5+Z3-Qq98t$j$$F z?UK|uClUBH|81YxW)pR7nd^c4#oWxqLXK)&L$)Ipb;QbdIQ(!zd9|6%lI;C}RCSw@ zg@}aG*svMRG^5g`yNrh~8j~CI`6nTpc;XadXMIwsal}b^r0eS#v8^ z-=l$`)Dv#q4%dtODn3;FBUnom zczasFwIWpJPvURbC~Q5K?gezg_6ULPM5CMrCW^;y}YTR-f&3yqH~390BR15cR>{{MVyKk{={7pmBkz03r)XspR2S zFVm`!OSfFrvWwH3i~CBUFrR>^B^>C#fmC@C_+!8H$bUIf=qIhpr}#L~`b*cB zw>MtwzcVw8y+ePyweGw9E3N%HK`!9;3+6^%#*;2NLr_LhX$#8Ib;f3o@e>|>2zZof z;JRu?tVTW@_xW_jlB)5H!4rDG-i@Mljx*bRRFYDg;yRA4NiLmsU-~iduI@?ZbVdAb z+LKSleC9$#{sJAQj4kl1BVsLylVCwNL6f?%g>mcZ;@ajy;Knw*2tcP-K<$>U8SR=?VIPU6zS(yV*-=ZqpJ)iTPmX>H_P> zo(v)k_@KU2!bdh8rfV;|oVRw_!S`uhO8(k3mOcV%N3s64FGAe-}3%`w(y#rt(NrZ|YFpgq%v58BFSIJlw zAFweloV;BJyrUTE)*=TE$ zs{joTGBErFNDgbyvTtRWP>1mO-eW~5CuHBE&Bv1*0q(aID8Zae(~Yqvz;G~RRT>%8{h(q6d)U!I+Vn z)tx&FmB*8`KL{aR|Id8=}1I9xLh}j$WCP+YK+37f(tq%=yt)i%;LyWU3 zm7il2|J^ieH~>x9G`|hDo=}pxCyfdQ*1vwJjevhTWJG&<$Xf>9wHJl?2eA*1V#e; znzs^Iz1@%_m-4qLkUmj)&{KO8!lJWm>q&&Raz_I-eFy{#Z%Agv0hq=TMs5^+$y zYClBitwKRC$fpd-TTY-(BI^oafWmd^QfL(l|Ltq3ZhrX`nerqA+CMo)2Kc)KB&{(n z8VSIIKM8|nID#)`qqCzC-Chh<g!zHtXg9X%&)%%^qku&NfpWG*gHBL}F!&L5nch zi)yHF?Sazz(5f65(|}OnzHno>(U?!a=7j-ILtYgbfDO{Gz^VzsKprRqib^5}L_C7_ z)rpI4pt^{FiWi46PdC&nRW=$Vc>md}yskX$JzDryu@4=Oq0=}uuWPm-!jv@xtfB^c zfJ*z`MLg=b%SdNyZ1u4j_PN?wu8RygPh5r@WC5gh8*KSrTNLy;and;wL7b@|)9S*kXK$G` zzx?{+*L<%fRn^Y**=J{F8k+;A(-)eFr8OqEEa#q_s7=vwH%9a1Dns)6C3^WB&|`f7 zMVMC!9u8!>hR1>Ns;k;FJuzA53|g=AU3_p7VE{52C*Z=)#)dWZAq?!ZhseOxP1b|6 zL}o~Oi`bYKMddk$prtm#m;&IP?!O6vxUW&Ir+U5%Q$1KH>&xj{dJ0_-@p8lvMN|s- zf1o`|nx0?DSr@?`?%wcL!aZSIPk4X+;<^Cfy@n>dHyGCgZ`1DZOWNv0+vjAyhUddf zjm{L{aQp}vmZl^C&6_n%Bjm)q%krpcU4ol!#3Jl?49OvpA>H7K7ojk5znYT>?JM^Dtv^1}5pxz!5jPedeu{!4P(AO%%bXUw;Oc58e{4nFR zw4YO=!D`}znP?~GXa|JaKqnE*gg!v)qqRTqa?|jr%ed)O%;*_>w-G|0st!KsZqEmp zD%k0nk1M#sptX-I6QU6KRz2{`jt5Kpi(fjz8(F}vwG$vHL)%yqNQTU-;ab!M6gfp4 zX$TpGJSOGgV|a!@7L$APu2~ie?tiit;`moX%dV~^j`i2E`a<7v*vSMT^$)ktPZ(vn z|DA*F`Zv{)GvzKGeZPSjO3oW@NQpY!$&5VV@uKm!^OG(cA zJ*VyJYGVdgr74f)3~XIunk!@(kr`sKvV`*ePoBb12?}C9Mc~4L-yTdqOVZ!p^iyy5 z%aBe*KPgf0F*M#mG3_Gc!1i9U;40*kB4|G0Yp4?36}2dDY1`_@Wk1b&5NHQl9vIY+`z7(c8Lh7HR<*30DG@>hav%~mkR~m%~ zx&-CLD7~ZFLf3z$HjuoHGYrd1xBNc{t9P_NT_&B&bl` zACUNc|9oGFXu~$=&F3f9v8yzmss;cWB8Hmu3YawV*`%t0H@n)W&uH%}{59o84c()N ztp`1IGSv%Rf?Li}6AVc-J-xh9AXb?$jAG@1sRj})!r z|0z;V(n(*eRwhmA?aR9d!A%tyFjr(m$8iY}Yq5sDy?<1$F#0umYb}VQffGrl5n6w{ z!Q>?&g~dhqhUJ=Kdf9Z2ElF3SC0;e!3^VaAz)2Z* zz&IUS(4vy7xLZ4A7$}clv6~N}U4U0(0y94HYSl3A1T-9l(F{|z4l@)<8k(QgRK;ti z%KbeaO=Q+Z6sC?yv&TnS`=hV9zxZjYrswx0R-#`G38E!Mty3eOBh-e=mmM`ASnOZ5 z^YSGaT{|({84N7ZwbdXEnZN>u4TRwVoU{v&&<&Q$)y*^&g|o#i_=_@)sZ(4>5XQZX zXCjW}S}@a5KnF3jf+|aJNhGq@F?13na2$qS=4Zvi94S=f6YjVuQYsj4pv6MIhy(^; zNl$sdRIq|nGnduM7Xoaqq9cxXU{^G4753UH`igI)){0_fy~ zx{wl3XloCrP%2XY;mj8T)s=DUwgzW@V5~O5Vk)vccI|2+;Ffz!n=f^GAv0-k1gMW` z0HbI$TyPHwavqH0Fe|vex5a^vGl%Lm56wbazcG|2+qaSud}j&6H>2RXeA9Y#=L|Gg z_<0V4w}hC}2AFHpmI7|Haz3o2SDBLlO9U79^@q}y*AUFW-`3B0VH<5-1A;YDpl&X@ zF98_~!*(30?*5~oV8)-F8EfnS_tRr=A-YMG)pe+&Fu4mcfQu^*G3HD&jHMt1m>q|Q zBT;CO1Wbk5@Uupk^DX3-hN7je1Ko+$atQhno1}+F6#(=XI2G5=_HpNBUUr1${v^t9 z847yUNywa*#HVmK#i98|2j*g6!FxyI8}EfM=u?PbYr%LasplF4P2CC`m08Y154t0EPv<6~3OHsCgWE}Yr{>)Y z9-W7T`i-;IP}LfhV<-V? z-TW|vACLNTMhC6TWr$oC=l*{YaU>5DRLQJXhrOQet8#B6y|q@ z8I^)X=6Ya`|89|*K0z6&V9ecz=)oS?dKE#{V1t3-GXo_4?tfj^dk93dh13$1P2a-sESh(WEj?&BZlF8;GmV#=Q*&sPwkC*-H|~^3oS4}1<6Ju3+8=W z*s@HT>|1{z&knj-$X3Ypgi;`ey)?*P=$ zw@4G#LUTki!bx2Uo~hEehd(ap!z{nITykMP3+prT9963HfV?(B*>_qvXGH z&3%S@>ms`IKKv1(tW#NDp?cgM0lKj;aBs&vJYJg>^jSmPrvpu3n>I@7rF2b8aF-7? zmRMqG^CQB4OvlY)t^$Rhf9XXFrVMtRcnB`pby)qrl)raz%XF)KPuIJ3$fS*QFSOZ% zzmJ=|P8-L}e=Kb$!U4I!-G8B`Fqe6@%0=YQJEe#$G^q6Mf79Idud9ikyyd>i<&W+& zOi^8!Rq6fM8qW`^Z0dqA3u^VBakZH402$6B)}uckco?Mm1SXV#VkCbQL&#~7zb#h} z;>NyJtb;iZaBDpzQpQ?T`Et5B{|2+GZzGY-m?TPrBMlD<=L$U>bK3v@>+ZhEsZO%$ zkhlG8xe>Zt{bDY67htIENeArb(W>;f9pIlUodN^kdiC!PsqUl!hI6P#WijHdSj|ckSPY zpHQiJN_!h`R$!fXVt8x&)E4d*tw;L|_^SAl`+t4R}>?z~Z8RC1S#ppZ#p210fatdjc^zdoRFY8pV zX*VZ@H-&PCY;PsVK01J15t!D`Paf0#yA8$mr^bdAy~Grw=qpAXr{^^VriMIL{9XHl z)3?dlmXDS52Q*zzcT;J#L-U$H&2s;~@gwD@LDS^&ruW*#$27AaUTuHP>|}*-AHAAr zb?LlwnV^e6S@LSP5%0auWsFVce_tS0xhBYNaFp?Cv~0Fff@4xkt|I3g2|1Ii&Uf}OhyWd7Gr`JWfy9QOZi z8)$}HdEkVeod5h^Z|8sOZvM~3`#)X03+w+J#s8xd_*V@6{f~bS^cQPsWoO2A)5P*K RlgJ{D9kDPfJ9H}Q{{wiyO&9 Date: Thu, 21 Oct 2021 18:08:04 +0100 Subject: [PATCH 140/254] [docs] Move LLVM FAQ into the LLVM page. --- docs/source/faq.rst | 59 -------------------------------------- docs/source/llvm/index.rst | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 59 deletions(-) diff --git a/docs/source/faq.rst b/docs/source/faq.rst index 9f64ec4e8..32999214b 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -45,65 +45,6 @@ What features are going to be added in the future? See :ref:`roadmap `. -Is compiler optimization really a sequential decision process? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Compilers frequently package individual transformations as "optimization passes" -which are then applied in a sequential order. Usually this order is fixed (e.g. -`real world example -`_). -CompilerGym replaces that fixed order with a sequential decision process where -any pass may be applied at any stage. - - -LLVM Environment ----------------- - - -When does the environment consider an episode “done”? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The compiler itself doesn't have a signal for termination. Actions are like -rewrite rules, it is up to the user to decide when no more improvement can be -achieved from further rewrites. E.g. for simple random search we can use -`"patience" -`_. -The only exception is if the compiler crashes, or the code ends up in an -unexpected state - we have to abort. This happens. - - -How do I run this on my own program? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By compiling your program to an unoptimized LLVM bitcode file. This can be done -automatically for C/C++ programs using the :meth:`env.make_benchmark() -` API, or you can do this yourself using -clang: - -:: - - $ clang -emit-llvm -c -O0 -Xclang -disable-O0-optnone -Xclang -disable-llvm-passes myapp.c - -Then pass the path of the generated `.bc` file to the CompilerGym command-line -tools using the `--benchmark` flag, e.g. - -:: - - $ bazel run -c opt //compiler_gym/bin:random_search -- \ - --env=llvm-ic-v0 \ - --benchmark=file:///$PWD/myapp.bc - - -Should I always try different actions? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Some optimization actions may be called multiple times after other actions. An -example of this is `dead code elimination -`_, which can be used to -"clean up mess" generated from a previous action. So repeating the same action -in different context can bring improvements. - - Development ----------- diff --git a/docs/source/llvm/index.rst b/docs/source/llvm/index.rst index 9975a918f..5ffb8afbe 100644 --- a/docs/source/llvm/index.rst +++ b/docs/source/llvm/index.rst @@ -1082,3 +1082,61 @@ transforms as a discrete space. +-----------------------------------+------------------------------------------------------------------------------+ | `-mergereturn` | Unify function exit nodes | +-----------------------------------+------------------------------------------------------------------------------+ + + +FAQ +--- + +Is this really a sequential decision process? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Yes. Compilers frequently package individual transformations as "optimization +passes" which are then applied in a sequential order. Usually this order is +fixed (e.g. `real world example +`_). +The CompilerGym LLVM environment replaces that fixed order with a sequential +decision process where any pass may be applied at any stage. + + +When does the environment consider an episode “done”? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The compiler itself doesn't have a signal for termination. Actions are like +rewrite rules, it is up to the user to decide when no more improvement can be +achieved from further rewrites. E.g. for simple random search we can use +`"patience" +`_. +The only exception is if the compiler crashes, or the code ends up in an +unexpected state - we have to abort. This happens. + + +How do I run this on my own program? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By compiling your program to an unoptimized LLVM bitcode file. This can be done +automatically for C/C++ programs using the :meth:`env.make_benchmark() +` API, or you can do this yourself using +clang: + +:: + + $ clang -emit-llvm -c -O0 -Xclang -disable-O0-optnone -Xclang -disable-llvm-passes myapp.c + +Then pass the path of the generated `.bc` file to the CompilerGym command-line +tools using the `--benchmark` flag, e.g. + +:: + + $ bazel run -c opt //compiler_gym/bin:random_search -- \ + --env=llvm-ic-v0 \ + --benchmark=file:///$PWD/myapp.bc + + +Should I always try different actions? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some optimization actions may be called multiple times after other actions. An +example of this is `dead code elimination +`_, which can be used to +"clean up mess" generated from a previous action. So repeating the same action +in different context can bring improvements. From 440d2f7a95e0ee682fb7a71a1a92bbdbec4576ee Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 18:12:37 +0100 Subject: [PATCH 141/254] [docs] Update and rejig FAQ questions. --- docs/source/faq.rst | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/docs/source/faq.rst b/docs/source/faq.rst index 32999214b..7f16af3dc 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -8,31 +8,19 @@ question not answered here? File an issue on the `GitHub issue tracker .. contents:: Topics: :local: -General -------- - - What can I do with this? -~~~~~~~~~~~~~~~~~~~~~~~~ - -This projects lets you control the decisions that a compiler makes when -optimizing a program. Currently, it lets you control the selection and ordering -of optimization passes for LLVM in order to minimize the size of the code. - -We wrote a small wrapper around the OpenAI gym environment which lets you step -through the optimization of a program using a text user interface. Have a play -around with it to better understand what is going on: - -:: - - $ python -m compiler_gym.bin.manual_env --env=llvm-v0 +------------------------ -Once you get the hang of things, try submitting your best algorithm to our -`leaderboards `_! +CompilerGym lets you control the decisions that a compiler makes when optimizing +a program. Currently, it lets you control the selection and ordering of +optimization passes for LLVM, the command line flags for the GCC compiler, and +the order of loop nests for CUDA. The goal is to steer the compiler towards +producing the best compiled program, as determined by a reward signal that +measures some property of the program such as its code size or execution time. Do I have to use reinforcement learning? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------- No. We think that the the gym provides a useful abstraction for sequential decision making. You may use any technique you wish to explore the optimization @@ -40,7 +28,7 @@ space. What features are going to be added in the future? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------------------- See :ref:`roadmap `. From c21cfd34715f26e881395a65ec9ff1396ffe1c88 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 18:19:03 +0100 Subject: [PATCH 142/254] [docs] Update contributing links. --- CONTRIBUTING.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ead4ef3e..6c398ed45 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,8 @@ We actively welcome your pull requests. [building from source](https://github.com/facebookresearch/CompilerGym/blob/development/INSTALL.md) to set up your environment. 3. If you've added code that should be tested, add tests. -4. If you've changed APIs, update the [documentation](/docs/source). +4. If you've changed APIs, update the + [documentation](https://github.com/facebookresearch/CompilerGym/tree/development/docs/source). 5. Ensure the `make test` suite passes. 6. Make sure your code lints (see [Code Style](#code-style) below). 7. If you haven't already, complete the [Contributor License Agreement @@ -60,8 +61,9 @@ and file a [Pull Request](#pull-requests). Please include: 2. A CSV file of your results. The [compiler_gym.leaderboard](https://facebookresearch.github.io/CompilerGym/compiler_gym/leaderboard.html) package provides utilities to help generate results using your agent. -3. A write-up of your approach. You may use the - [submission template](/leaderboard/SUBMISSION_TEMPLATE.md) as a guide. +3. A write-up of your approach. You may use the [submission + template]([/leaderboard/SUBMISSION_TEMPLATE.md](https://raw.githubusercontent.com/facebookresearch/CompilerGym/development/leaderboard/SUBMISSION_TEMPLATE.md)) + as a guide. Please make sure to update to the latest CompilerGym release prior to submission. We do not require that you submit the source code for your approach, @@ -86,8 +88,8 @@ is simple: We use [pre-commit](https://pre-commit.com/) to ensure that code is formatted prior to committing. Before submitting pull requests, please run pre-commit. See -the [config file](/.pre-commit-config.yaml) for installation and usage -instructions. +[INSTALL.md](https://github.com/facebookresearch/CompilerGym/blob/development/INSTALL.md) +for installation and usage instructions. Other common sense rules we encourage are: From ab7d9fdbd1e174544d23958714c5938c3b24e806 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 18:19:27 +0100 Subject: [PATCH 143/254] [docs] Add a survey paper to FAQ. --- docs/source/faq.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/source/faq.rst b/docs/source/faq.rst index 7f16af3dc..6aec64e0f 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -24,7 +24,10 @@ Do I have to use reinforcement learning? No. We think that the the gym provides a useful abstraction for sequential decision making. You may use any technique you wish to explore the optimization -space. +space. Researchers have had success using search techniques, genetic algorithms, +supervised and unsupervised machine learning, and deep reinforcement learning. +Take a look at `this paper `_ for a +brief introduction to the field. What features are going to be added in the future? From b4108420c6f2493094736882b1ef5154acb3cebf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 20 Oct 2021 19:30:07 +0100 Subject: [PATCH 144/254] [llvm] Propagate runtime observation counts on fork(). --- compiler_gym/envs/llvm/llvm_env.py | 22 +++++++++++++--- tests/llvm/runtime_test.py | 42 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index 2528831f2..82e0163f1 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -514,12 +514,15 @@ def runtime_observation_count(self) -> int: :type: int """ - return int(self.send_param("llvm.get_runtimes_per_observation_count", "")) + return self._runtimes_per_observation_count or int( + self.send_param("llvm.get_runtimes_per_observation_count", "") + ) @runtime_observation_count.setter def runtime_observation_count(self, n: int) -> None: self._runtimes_per_observation_count = n - self.send_param("llvm.set_runtimes_per_observation_count", str(n)) + if self.in_episode: + self.send_param("llvm.set_runtimes_per_observation_count", str(n)) @property def runtime_warmup_runs_count(self) -> int: @@ -545,11 +548,22 @@ def runtime_warmup_runs_count(self) -> int: :type: int """ - return int( + return self._runtimes_warmup_per_observation_count or int( self.send_param("llvm.get_warmup_runs_count_per_runtime_observation", "") ) @runtime_warmup_runs_count.setter def runtime_warmup_runs_count(self, n: int) -> None: self._runtimes_warmup_per_observation_count = n - self.send_param("llvm.set_warmup_runs_count_per_runtime_observation", str(n)) + if self.in_episode: + self.send_param( + "llvm.set_warmup_runs_count_per_runtime_observation", str(n) + ) + + def fork(self): + fkd = super().fork() + if self.runtime_observation_count is not None: + fkd.runtime_observation_count = self.runtime_observation_count + if self.runtime_warmup_runs_count is not None: + fkd.runtime_warmup_runs_count = self.runtime_warmup_runs_count + return fkd diff --git a/tests/llvm/runtime_test.py b/tests/llvm/runtime_test.py index 21c774a67..541707f6f 100644 --- a/tests/llvm/runtime_test.py +++ b/tests/llvm/runtime_test.py @@ -149,5 +149,47 @@ def test_invalid_runtime_count(env: LlvmEnv): env.runtime_observation_count = -1 +def test_runtime_observation_count_before_reset(env: LlvmEnv): + """Test setting property before reset() is called.""" + env.runtime_observation_count = 10 + assert env.runtime_observation_count == 10 + env.reset() + assert env.runtime_observation_count == 10 + + +def test_runtime_warmup_runs_count_before_reset(env: LlvmEnv): + """Test setting property before reset() is called.""" + env.runtime_warmup_runs_count = 10 + assert env.runtime_warmup_runs_count == 10 + env.reset() + assert env.runtime_warmup_runs_count == 10 + + +def test_runtime_observation_count_fork(env: LlvmEnv): + """Test that custom count properties propagate on fork().""" + env.runtime_observation_count = 2 + env.runtime_warmup_runs_count = 1 + + with env.fork() as fkd: + assert fkd.runtime_observation_count == 2 + assert fkd.runtime_warmup_runs_count == 1 + + env.reset() + with env.fork() as fkd: + assert fkd.runtime_observation_count == 2 + assert fkd.runtime_warmup_runs_count == 1 + + +def test_default_runtime_observation_count_fork(env: LlvmEnv): + """Test that default property values propagate on fork().""" + env.reset() + rc = env.runtime_observation_count + wc = env.runtime_warmup_runs_count + + with env.fork() as fkd: + assert fkd.runtime_observation_count == rc + assert fkd.runtime_warmup_runs_count == wc + + if __name__ == "__main__": main() From b2434ac2a64426adae0f930e8453f6d5672d3fd2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 21 Oct 2021 18:39:53 +0100 Subject: [PATCH 145/254] [llvm] Add a wrapper class to use runtime as reward. Issue #370. --- compiler_gym/wrappers/BUILD | 1 + compiler_gym/wrappers/__init__.py | 2 + compiler_gym/wrappers/llvm.py | 130 +++++++++++++++++++++ docs/source/compiler_gym/wrappers.rst | 8 ++ tests/wrappers/BUILD | 12 ++ tests/wrappers/llvm_test.py | 83 +++++++++++++ tests/wrappers/time_limit_wrappers_test.py | 2 - 7 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 compiler_gym/wrappers/llvm.py create mode 100644 tests/wrappers/llvm_test.py diff --git a/compiler_gym/wrappers/BUILD b/compiler_gym/wrappers/BUILD index ae33f5c4d..2963d90d3 100644 --- a/compiler_gym/wrappers/BUILD +++ b/compiler_gym/wrappers/BUILD @@ -11,6 +11,7 @@ py_library( "commandline.py", "core.py", "datasets.py", + "llvm.py", "time_limit.py", ], visibility = ["//visibility:public"], diff --git a/compiler_gym/wrappers/__init__.py b/compiler_gym/wrappers/__init__.py index 5d01ae118..c68f78f01 100644 --- a/compiler_gym/wrappers/__init__.py +++ b/compiler_gym/wrappers/__init__.py @@ -19,6 +19,7 @@ IterateOverBenchmarks, RandomOrderBenchmarks, ) +from compiler_gym.wrappers.llvm import RuntimePointEstimateReward from compiler_gym.wrappers.time_limit import TimeLimit __all__ = [ @@ -28,6 +29,7 @@ "ConstrainedCommandline", "CycleOverBenchmarks", "IterateOverBenchmarks", + "RuntimePointEstimateReward", "ObservationWrapper", "RandomOrderBenchmarks", "RewardWrapper", diff --git a/compiler_gym/wrappers/llvm.py b/compiler_gym/wrappers/llvm.py new file mode 100644 index 000000000..3b2b22784 --- /dev/null +++ b/compiler_gym/wrappers/llvm.py @@ -0,0 +1,130 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Wrapper classes for the LLVM environments.""" +from typing import Callable, Iterable, List, Optional + +import numpy as np + +from compiler_gym.datasets.benchmark import BenchmarkInitError +from compiler_gym.envs.llvm import LlvmEnv +from compiler_gym.service.connection import ServiceError +from compiler_gym.spaces import Reward +from compiler_gym.util.gym_type_hints import ObservationType +from compiler_gym.wrappers import CompilerEnvWrapper + + +class RuntimePointEstimateReward(CompilerEnvWrapper): + """LLVM wrapper that uses a point estimate of program runtime as reward. + + This class wraps an LLVM environment and registers a new runtime reward + space. Runtime is estimated from one or more runtime measurements, after + optionally running one or more warmup runs. At each step, reward is the + change in runtime estimate from the runtime estimate at the previous step. + """ + + class RuntimeReward(Reward): + def __init__( + self, + runtime_count: int, + warmup_count: int, + estimator: Callable[[Iterable[float]], float], + ): + super().__init__( + id="runtime", + observation_spaces=["Runtime"], + default_value=0, + min=None, + max=None, + default_negates_returns=True, + deterministic=False, + platform_dependent=True, + ) + self.runtime_count = runtime_count + self.warmup_count = warmup_count + self.starting_runtime: Optional[float] = None + self.previous_runtime: Optional[float] = None + self.current_benchmark: Optional[str] = None + self.estimator = estimator + + def reset(self, benchmark, observation_view) -> None: + # If we are changing the benchmark then check that it is runnable. + if benchmark != self.current_benchmark: + if not observation_view["IsRunnable"]: + raise BenchmarkInitError(f"Benchmark is not runnable: {benchmark}") + self.current_benchmark = benchmark + self.starting_runtime = None + + # Compute initial runtime if required, else use previously computed + # value. + if self.starting_runtime is None: + self.starting_runtime = self.estimator(observation_view["Runtime"]) + + self.previous_runtime = self.starting_runtime + + def update( + self, + actions: List[int], + observations: List[ObservationType], + observation_view, + ) -> float: + del actions # unused + del observation_view # unused + runtimes = observations[0] + if len(runtimes) != self.runtime_count: + raise ServiceError( + f"Expected {self.runtime_count} runtimes but received {len(runtimes)}" + ) + runtime = self.estimator(runtimes) + + reward = self.previous_runtime - runtime + self.previous_runtime = runtime + return reward + + def __init__( + self, + env: LlvmEnv, + runtime_count: int = 30, + warmup_count: int = 0, + estimator: Callable[[Iterable[float]], float] = np.median, + ): + """Constructor. + + :param env: The environment to wrap. + + :param runtime_count: The number of times to execute the binary when + estimating the runtime. + + :param warmup_count: The number of warmup runs of the binary to perform + before measuring the runtime. + + :param estimator: A function that takes a list of runtime measurements + and produces a point estimate. + """ + super().__init__(env) + + self.env.unwrapped.reward.add_space( + self.RuntimeReward( + runtime_count=runtime_count, + warmup_count=warmup_count, + estimator=estimator, + ) + ) + self.env.unwrapped.reward_space = "runtime" + + self.env.unwrapped.runtime_observation_count = runtime_count + self.env.unwrapped.runtime_warmup_runs_count = warmup_count + + def fork(self) -> "RuntimePointEstimateReward": + fkd = self.env.fork() + # Remove the original "runtime" space so that we that new + # RuntimePointEstimateReward wrapper instance does not attempt to + # redefine, raising a warning. + del fkd.unwrapped.reward.spaces["runtime"] + return RuntimePointEstimateReward( + env=fkd, + runtime_count=self.reward.spaces["runtime"].runtime_count, + warmup_count=self.reward.spaces["runtime"].warmup_count, + estimator=self.reward.spaces["runtime"].estimator, + ) diff --git a/docs/source/compiler_gym/wrappers.rst b/docs/source/compiler_gym/wrappers.rst index 207042293..bdbaad115 100644 --- a/docs/source/compiler_gym/wrappers.rst +++ b/docs/source/compiler_gym/wrappers.rst @@ -66,3 +66,11 @@ Datasets wrappers .. autoclass:: RandomOrderBenchmarks .. automethod:: __init__ + + +LLVM Environment wrappers +------------------------- + +.. autoclass:: RuntimePointEstimateReward + + .. automethod:: __init__ diff --git a/tests/wrappers/BUILD b/tests/wrappers/BUILD index d0b680dea..f2a42de18 100644 --- a/tests/wrappers/BUILD +++ b/tests/wrappers/BUILD @@ -37,6 +37,18 @@ py_test( ], ) +py_test( + name = "llvm_test", + timeout = "long", + srcs = ["llvm_test.py"], + deps = [ + "//compiler_gym/envs/llvm", + "//compiler_gym/wrappers", + "//tests:test_main", + "//tests/pytest_plugins:llvm", + ], +) + py_test( name = "time_limit_wrappers_test", timeout = "short", diff --git a/tests/wrappers/llvm_test.py b/tests/wrappers/llvm_test.py new file mode 100644 index 000000000..c7359b9a1 --- /dev/null +++ b/tests/wrappers/llvm_test.py @@ -0,0 +1,83 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Unit tests for compiler_gym.wrappers.llvm.""" +import numpy as np +import pytest +from flaky import flaky + +from compiler_gym.datasets.benchmark import BenchmarkInitError +from compiler_gym.envs.llvm import LlvmEnv +from compiler_gym.wrappers import RuntimePointEstimateReward +from tests.test_main import main + +pytest_plugins = ["tests.pytest_plugins.llvm"] + + +def test_invalid_runtime_count(env: LlvmEnv): + env = RuntimePointEstimateReward(env, runtime_count=-10) + with pytest.raises( + ValueError, match="runtimes_per_observation_count must be >= 1. Received: -10" + ): + env.reset() + + +def test_invalid_warmup_count(env: LlvmEnv): + env = RuntimePointEstimateReward(env, warmup_count=-10) + with pytest.raises( + ValueError, + match="warmup_runs_count_per_runtime_observation must be >= 0. Received: -10", + ): + env.reset() + + +def test_reward_range(env: LlvmEnv): + env = RuntimePointEstimateReward(env, runtime_count=3) + assert env.reward_range == (-float("inf"), float("inf")) + + +def test_reward_range_not_runnable_benchmark(env: LlvmEnv): + env = RuntimePointEstimateReward(env, runtime_count=3) + + with pytest.raises( + BenchmarkInitError, match=r"^Benchmark is not runnable: benchmark://npb-v0/1$" + ): + env.reset(benchmark="benchmark://npb-v0/1") + + +def test_fork(env: LlvmEnv): + env = RuntimePointEstimateReward(env) + with env.fork() as fkd: + assert fkd.reward_space_spec.id == "runtime" + + +@pytest.mark.parametrize("runtime_count", [1, 3, 5]) +@pytest.mark.parametrize("warmup_count", [0, 1, 3]) +@pytest.mark.parametrize("estimator", [np.median, min]) +@flaky # Runtime can fail +def test_reward_values(env: LlvmEnv, runtime_count, warmup_count, estimator): + env = RuntimePointEstimateReward( + env, runtime_count=runtime_count, warmup_count=warmup_count, estimator=estimator + ) + env.reset() + + assert env.reward_space_spec.runtime_count == runtime_count + assert env.reward_space_spec.warmup_count == warmup_count + assert env.reward_space_spec.estimator == estimator + + _, reward_a, done, info = env.step(env.action_space.sample()) + assert not done, info + + _, reward_b, done, info = env.step(env.action_space.sample()) + assert not done, info + + _, reward_c, done, info = env.step(env.action_space.sample()) + assert not done, info + + assert env.episode_reward == reward_a + reward_b + reward_c + assert reward_a or reward_b or reward_c + + +if __name__ == "__main__": + main() diff --git a/tests/wrappers/time_limit_wrappers_test.py b/tests/wrappers/time_limit_wrappers_test.py index 455e50fd9..f74c76ea5 100644 --- a/tests/wrappers/time_limit_wrappers_test.py +++ b/tests/wrappers/time_limit_wrappers_test.py @@ -5,8 +5,6 @@ """Unit tests for //compiler_gym/wrappers.""" from compiler_gym.envs.llvm import LlvmEnv from compiler_gym.wrappers import TimeLimit - -# from gym.wrappers import TimeLimit from tests.test_main import main pytest_plugins = ["tests.pytest_plugins.llvm"] From 0f5572978f387721a74e49cb009df2045efac697 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 22 Oct 2021 16:23:33 +0100 Subject: [PATCH 146/254] [tests] Mark xfailing macOS tests. --- tests/wrappers/llvm_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/wrappers/llvm_test.py b/tests/wrappers/llvm_test.py index c7359b9a1..cbb44fb73 100644 --- a/tests/wrappers/llvm_test.py +++ b/tests/wrappers/llvm_test.py @@ -3,6 +3,8 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Unit tests for compiler_gym.wrappers.llvm.""" +import sys + import numpy as np import pytest from flaky import flaky @@ -52,6 +54,11 @@ def test_fork(env: LlvmEnv): assert fkd.reward_space_spec.id == "runtime" +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) @pytest.mark.parametrize("runtime_count", [1, 3, 5]) @pytest.mark.parametrize("warmup_count", [0, 1, 3]) @pytest.mark.parametrize("estimator", [np.median, min]) From c3a30827ee53d4d6f24492c8b38e6907539ace9b Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 22 Oct 2021 17:04:01 +0100 Subject: [PATCH 147/254] [llvm] Call send_param() before updating the runtimes param. --- compiler_gym/envs/llvm/llvm_env.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler_gym/envs/llvm/llvm_env.py b/compiler_gym/envs/llvm/llvm_env.py index 82e0163f1..a5811a6c4 100644 --- a/compiler_gym/envs/llvm/llvm_env.py +++ b/compiler_gym/envs/llvm/llvm_env.py @@ -520,9 +520,11 @@ def runtime_observation_count(self) -> int: @runtime_observation_count.setter def runtime_observation_count(self, n: int) -> None: - self._runtimes_per_observation_count = n if self.in_episode: self.send_param("llvm.set_runtimes_per_observation_count", str(n)) + # NOTE(cummins): Keep this after the send_param() call because + # send_param() will raise an error if the valid is invalid. + self._runtimes_per_observation_count = n @property def runtime_warmup_runs_count(self) -> int: @@ -554,11 +556,13 @@ def runtime_warmup_runs_count(self) -> int: @runtime_warmup_runs_count.setter def runtime_warmup_runs_count(self, n: int) -> None: - self._runtimes_warmup_per_observation_count = n if self.in_episode: self.send_param( "llvm.set_warmup_runs_count_per_runtime_observation", str(n) ) + # NOTE(cummins): Keep this after the send_param() call because + # send_param() will raise an error if the valid is invalid. + self._runtimes_warmup_per_observation_count = n def fork(self): fkd = super().fork() From 00cca3440676476426d453ec9694c978728a28c7 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 25 Oct 2021 19:25:46 +0100 Subject: [PATCH 148/254] Mark macOS xfail tests. --- tests/wrappers/llvm_test.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/wrappers/llvm_test.py b/tests/wrappers/llvm_test.py index cbb44fb73..5a8cfe39a 100644 --- a/tests/wrappers/llvm_test.py +++ b/tests/wrappers/llvm_test.py @@ -17,6 +17,11 @@ pytest_plugins = ["tests.pytest_plugins.llvm"] +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_invalid_runtime_count(env: LlvmEnv): env = RuntimePointEstimateReward(env, runtime_count=-10) with pytest.raises( @@ -25,6 +30,11 @@ def test_invalid_runtime_count(env: LlvmEnv): env.reset() +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_invalid_warmup_count(env: LlvmEnv): env = RuntimePointEstimateReward(env, warmup_count=-10) with pytest.raises( @@ -48,6 +58,11 @@ def test_reward_range_not_runnable_benchmark(env: LlvmEnv): env.reset(benchmark="benchmark://npb-v0/1") +@pytest.mark.xfail( + sys.platform == "darwin", + strict=True, + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_fork(env: LlvmEnv): env = RuntimePointEstimateReward(env) with env.fork() as fkd: From 599feb3640c077fda11bf09dab0f4f1517f41240 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 25 Oct 2021 19:26:59 +0100 Subject: [PATCH 149/254] [ci] Fix redundant double testing of loop_tool on macOS. --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2cd676e46..bb10ba6af 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -149,7 +149,7 @@ jobs: run: python -m pip install -r tests/requirements.txt - name: Run the test suite - run: make install-test-cov PYTEST_ARGS="--ignore tests/llvm --ignore tests/gcc" + run: make install-test-cov PYTEST_ARGS="--ignore tests/llvm --ignore tests/gcc --ignore tests/loop_tool" - name: Upload coverage report to Codecov uses: codecov/codecov-action@v2 From 71596a9d88ff561d5ea6bc0aa37e3ddd4017e853 Mon Sep 17 00:00:00 2001 From: Bram Wasti Date: Mon, 11 Oct 2021 08:03:27 -0700 Subject: [PATCH 150/254] check in code used to generate plots for loop_tool in paper --- examples/run_loop_tool_sweep.py | 46 +++++++++++++++++++++++++++++++++ examples/run_loop_tool_sweep.sh | 30 +++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 examples/run_loop_tool_sweep.py create mode 100755 examples/run_loop_tool_sweep.sh diff --git a/examples/run_loop_tool_sweep.py b/examples/run_loop_tool_sweep.py new file mode 100644 index 000000000..022510268 --- /dev/null +++ b/examples/run_loop_tool_sweep.py @@ -0,0 +1,46 @@ +import sys + +import compiler_gym + +names = ["toggle_mode", "up", "down", "toggle_thread"] +actions = [3, 0, 1, 3, 0] +base = 1024 * 512 +K = int(sys.argv[1]) * base + +vectorize = int(sys.argv[2]) +run_log = int(sys.argv[3]) +env = compiler_gym.make("loop_tool-v0") +env.reset( + benchmark=env.datasets.benchmark(uri="benchmark://loop_tool-v0/{}".format(K)), + action_space="simple", +) +if vectorize - 1: + vs = [1] * (vectorize - 1) + actions += vs + [0, 1, 0] + vs + [0, 2, 0] +for a in actions: + o = env.step(a) + +if run_log: + env.observation_space = "action_state" + inner = 1 + step = 512 + for i in range(1, step): + o = env.step(1) + inner += 1 + while inner * vectorize < K: + env.observation_space = "loop_tree" + for i in range(step): + if i == step - 1: + env.observation_space = "flops" + o = env.step(1) + inner += 1 + print(f"{K}, {inner}, {vectorize}: {o[0]}", flush=True) + step *= 2 +else: + for i in range(K // (vectorize * 1024)): + env.observation_space = "action_state" + for j in range(1022 if i == 0 else 1023): + o = env.step(1) + env.observation_space = "flops" + o = env.step(1) + print(f"{K}, {(i + 1) * 1024}, {vectorize}: {o[0]}", flush=True) diff --git a/examples/run_loop_tool_sweep.sh b/examples/run_loop_tool_sweep.sh new file mode 100755 index 000000000..ee1ca6438 --- /dev/null +++ b/examples/run_loop_tool_sweep.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -ve +mkdir -p results + +python run_loop_tool_sweep.py 1 4 1 | tee results/s1_v4_log.txt +python run_loop_tool_sweep.py 1 1 1 | tee results/s1_v1_log.txt + +python run_loop_tool_sweep.py 2 4 1 | tee results/s2_v4_log.txt +python run_loop_tool_sweep.py 2 1 1 | tee results/s2_v1_log.txt + +python run_loop_tool_sweep.py 4 4 1 | tee results/s4_v4_log.txt +python run_loop_tool_sweep.py 4 1 1 | tee results/s4_v1_log.txt + +python run_loop_tool_sweep.py 8 4 1 | tee results/s8_v4_log.txt +python run_loop_tool_sweep.py 8 1 1 | tee results/s8_v1_log.txt + +python run_loop_tool_sweep.py 16 4 1 | tee results/s16_v4_log.txt +python run_loop_tool_sweep.py 16 1 1 | tee results/s16_v1_log.txt + +python run_loop_tool_sweep.py 1 4 0 | tee results/s1_v4_linear.txt +python run_loop_tool_sweep.py 1 1 0 | tee results/s1_v1_linear.txt + +python run_loop_tool_sweep.py 2 4 0 | tee results/s2_v4_linear.txt +python run_loop_tool_sweep.py 2 1 0 | tee results/s2_v1_linear.txt + +python run_loop_tool_sweep.py 4 4 0 | tee results/s4_v4_linear.txt +python run_loop_tool_sweep.py 4 1 0 | tee results/s4_v1_linear.txt + +python run_loop_tool_sweep.py 8 4 0 | tee results/s8_v4_linear.txt +python run_loop_tool_sweep.py 8 1 0 | tee results/s8_v1_linear.txt From e2f5b058ecae90a0b81a4d742d720687c740ac62 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 25 Oct 2021 19:30:34 +0100 Subject: [PATCH 151/254] [examples] Add license header to new sources. --- examples/run_loop_tool_sweep.py | 4 ++++ examples/run_loop_tool_sweep.sh | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/examples/run_loop_tool_sweep.py b/examples/run_loop_tool_sweep.py index 022510268..6f69c2b65 100644 --- a/examples/run_loop_tool_sweep.py +++ b/examples/run_loop_tool_sweep.py @@ -1,3 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. import sys import compiler_gym diff --git a/examples/run_loop_tool_sweep.sh b/examples/run_loop_tool_sweep.sh index ee1ca6438..0dad73f5b 100755 --- a/examples/run_loop_tool_sweep.sh +++ b/examples/run_loop_tool_sweep.sh @@ -1,4 +1,8 @@ #!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. set -ve mkdir -p results From 10f52f642da4adbe9589149e56caa280fdb3fa13 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 25 Oct 2021 19:33:09 +0100 Subject: [PATCH 152/254] [examples] Refactor to `with` syntax. --- examples/run_loop_tool_sweep.py | 62 ++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/examples/run_loop_tool_sweep.py b/examples/run_loop_tool_sweep.py index 6f69c2b65..05bcf9cb5 100644 --- a/examples/run_loop_tool_sweep.py +++ b/examples/run_loop_tool_sweep.py @@ -13,38 +13,38 @@ vectorize = int(sys.argv[2]) run_log = int(sys.argv[3]) -env = compiler_gym.make("loop_tool-v0") -env.reset( - benchmark=env.datasets.benchmark(uri="benchmark://loop_tool-v0/{}".format(K)), - action_space="simple", -) -if vectorize - 1: - vs = [1] * (vectorize - 1) - actions += vs + [0, 1, 0] + vs + [0, 2, 0] -for a in actions: - o = env.step(a) +with compiler_gym.make("loop_tool-v0") as env: + env.reset( + benchmark=env.datasets.benchmark(uri="benchmark://loop_tool-v0/{}".format(K)), + action_space="simple", + ) + if vectorize - 1: + vs = [1] * (vectorize - 1) + actions += vs + [0, 1, 0] + vs + [0, 2, 0] + for a in actions: + o = env.step(a) -if run_log: - env.observation_space = "action_state" - inner = 1 - step = 512 - for i in range(1, step): - o = env.step(1) - inner += 1 - while inner * vectorize < K: - env.observation_space = "loop_tree" - for i in range(step): - if i == step - 1: - env.observation_space = "flops" + if run_log: + env.observation_space = "action_state" + inner = 1 + step = 512 + for i in range(1, step): o = env.step(1) inner += 1 - print(f"{K}, {inner}, {vectorize}: {o[0]}", flush=True) - step *= 2 -else: - for i in range(K // (vectorize * 1024)): - env.observation_space = "action_state" - for j in range(1022 if i == 0 else 1023): + while inner * vectorize < K: + env.observation_space = "loop_tree" + for i in range(step): + if i == step - 1: + env.observation_space = "flops" + o = env.step(1) + inner += 1 + print(f"{K}, {inner}, {vectorize}: {o[0]}", flush=True) + step *= 2 + else: + for i in range(K // (vectorize * 1024)): + env.observation_space = "action_state" + for j in range(1022 if i == 0 else 1023): + o = env.step(1) + env.observation_space = "flops" o = env.step(1) - env.observation_space = "flops" - o = env.step(1) - print(f"{K}, {(i + 1) * 1024}, {vectorize}: {o[0]}", flush=True) + print(f"{K}, {(i + 1) * 1024}, {vectorize}: {o[0]}", flush=True) From f97f697dbd0390b649c82ab42a1ff1eb7fdf32f6 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 22 Oct 2021 14:38:59 +0100 Subject: [PATCH 153/254] [examples] Add implementations of LLVM autotuners. --- compiler_gym/envs/llvm/compute_observation.py | 3 +- .../llvm_autotuning/autotuners/__init__.py | 96 ++++++++ examples/llvm_autotuning/autotuners/greedy.py | 26 +++ .../llvm_autotuning/autotuners/greedy_test.py | 30 +++ .../llvm_autotuning/autotuners/nevergrad_.py | 64 ++++++ .../autotuners/nevergrad_test.py | 29 +++ .../llvm_autotuning/autotuners/opentuner_.py | 217 ++++++++++++++++++ .../autotuners/opentuner_test.py | 30 +++ .../llvm_autotuning/autotuners/random_.py | 43 ++++ .../llvm_autotuning/autotuners/random_test.py | 28 +++ .../llvm_autotuning/count_autotuner_loc.sh | 14 ++ examples/requirements.txt | 3 + 12 files changed, 582 insertions(+), 1 deletion(-) create mode 100644 examples/llvm_autotuning/autotuners/__init__.py create mode 100644 examples/llvm_autotuning/autotuners/greedy.py create mode 100644 examples/llvm_autotuning/autotuners/greedy_test.py create mode 100644 examples/llvm_autotuning/autotuners/nevergrad_.py create mode 100644 examples/llvm_autotuning/autotuners/nevergrad_test.py create mode 100644 examples/llvm_autotuning/autotuners/opentuner_.py create mode 100644 examples/llvm_autotuning/autotuners/opentuner_test.py create mode 100644 examples/llvm_autotuning/autotuners/random_.py create mode 100644 examples/llvm_autotuning/autotuners/random_test.py create mode 100644 examples/llvm_autotuning/count_autotuner_loc.sh diff --git a/compiler_gym/envs/llvm/compute_observation.py b/compiler_gym/envs/llvm/compute_observation.py index 426b9fce6..ba4a820f4 100644 --- a/compiler_gym/envs/llvm/compute_observation.py +++ b/compiler_gym/envs/llvm/compute_observation.py @@ -11,6 +11,7 @@ import google.protobuf.text_format from compiler_gym.service.proto import Observation +from compiler_gym.util.gym_type_hints import ObservationType from compiler_gym.util.runfiles_path import runfiles_path from compiler_gym.util.shell_format import plural from compiler_gym.views.observation_space_spec import ObservationSpaceSpec @@ -35,7 +36,7 @@ def pascal_case_to_enum(pascal_case: str) -> str: def compute_observation( observation_space: ObservationSpaceSpec, bitcode: Path, timeout: float = 300 -): +) -> ObservationType: """Compute an LLVM observation. This is a utility function that uses a standalone C++ binary to compute an diff --git a/examples/llvm_autotuning/autotuners/__init__.py b/examples/llvm_autotuning/autotuners/__init__.py new file mode 100644 index 000000000..22108f42c --- /dev/null +++ b/examples/llvm_autotuning/autotuners/__init__.py @@ -0,0 +1,96 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""This modules defines a class for describing LLVM autotuners.""" +import tempfile +from pathlib import Path +from typing import Any, Dict + +from llvm_autotuning.autotuners.greedy import greedy # noqa autotuner +from llvm_autotuning.autotuners.nevergrad_ import nevergrad # noqa autotuner +from llvm_autotuning.autotuners.opentuner_ import opentuner_ga # noqa autotuner +from llvm_autotuning.autotuners.random_ import random # noqa autotuner +from llvm_autotuning.optimization_target import OptimizationTarget +from pydantic import BaseModel, validator + +from compiler_gym.compiler_env_state import CompilerEnvState +from compiler_gym.envs import CompilerEnv +from compiler_gym.util.capture_output import capture_output +from compiler_gym.util.runfiles_path import transient_cache_path +from compiler_gym.util.temporary_working_directory import temporary_working_directory +from compiler_gym.util.timer import Timer + + +class Autotuner(BaseModel): + + algorithm: str + """The name of the autotuner algorithm.""" + + optimization_target: OptimizationTarget + """The target that the autotuner is optimizing for.""" + + search_time_seconds: int + """The search budget of the autotuner.""" + + algorithm_config: Dict[str, Any] = {} + """An optional dictionary of keyword arguments for the autotuner function.""" + + @property + def autotune(self): + """Return the autotuner function for this algorithm. + + An autotuner function takes a single CompilerEnv argument and optional + keyword configuration arguments (determined by algorithm_config) and + tunes the environment, returning nothing. + """ + try: + return globals()[self.algorithm] + except KeyError as e: + raise ValueError( + f"Unknown autotuner: {self.algorithm}.\n" + f"Make sure the {self.algorithm}() function definition is available " + "in the global namespace of {__file__}." + ) from e + + @property + def autotune_kwargs(self) -> Dict[str, Any]: + """Get the keyword arguments dictionary for the autotuner.""" + kwargs = { + "optimization_target": self.optimization_target, + "search_time_seconds": self.search_time_seconds, + } + kwargs.update(self.algorithm_config) + return kwargs + + def __call__(self, env: CompilerEnv, seed: int = 0xCC) -> CompilerEnvState: + """Autotune the given environment. + + :param env: The environment to autotune. + + :param seed: The random seed for the autotuner. + + :returns: A CompilerEnvState tuple describing the autotuning result. + """ + # Run the autotuner in a temporary working directory and capture the + # stdout/stderr. + with tempfile.TemporaryDirectory( + dir=transient_cache_path("."), prefix="autotune-" + ) as tmpdir: + with temporary_working_directory(Path(tmpdir)): + with capture_output(): + with Timer() as timer: + self.autotune(env, seed=seed, **self.autotune_kwargs) + + return CompilerEnvState( + benchmark=env.benchmark.uri, + commandline=env.commandline(), + walltime=timer.time, + reward=self.optimization_target.final_reward(env), + ) + + # === Start of implementation details. === + + @validator("algorithm_config", pre=True) + def validate_algorithm_config(cls, value) -> Dict[str, Any]: + return value or {} diff --git a/examples/llvm_autotuning/autotuners/greedy.py b/examples/llvm_autotuning/autotuners/greedy.py new file mode 100644 index 000000000..2a5eb44df --- /dev/null +++ b/examples/llvm_autotuning/autotuners/greedy.py @@ -0,0 +1,26 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from time import time + + +def greedy(env, search_time_seconds: int, **kwargs) -> None: + """A greedy search policy. + + At each step, the policy evaluates all possible actions and selects the + action with the highest reward. The search stops when no action produces a + positive reward. + + :param env: The environment to optimize. + """ + + def eval_action(env, action: int): + with env.fork() as fkd: + return (fkd.step(action)[1], action) + + end_time = time() + search_time_seconds + while time() < end_time: + best = max(eval_action(env, action) for action in range(env.action_space.n)) + if best[0] <= 0 or env.step(best[1])[2]: + return diff --git a/examples/llvm_autotuning/autotuners/greedy_test.py b/examples/llvm_autotuning/autotuners/greedy_test.py new file mode 100644 index 000000000..bb462ff22 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/greedy_test.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Integration tests for the LLVM autotuners.""" +import pytest +from llvm_autotuning.autotuners import Autotuner + +import compiler_gym + + +@pytest.mark.skip(reason="greedy takes a long time") +def test_autotune(): + with compiler_gym.make("llvm-v0", reward_space="IrInstructionCount") as env: + env.reset(benchmark="benchmark://cbench-v1/crc32") + + autotuner = Autotuner( + algorithm="greedy", + optimization_target="codesize", + search_time_seconds=3, + ) + + result = autotuner(env) + print(result) + assert result.benchmark == "benchmark://cbench-v1/crc32" + assert result.walltime >= 3 + assert result.commandline == env.commandline() + assert env.episode_reward + assert env.benchmark == "benchmark://cbench-v1/crc32" + assert env.reward_space == "IrInstructionCount" diff --git a/examples/llvm_autotuning/autotuners/nevergrad_.py b/examples/llvm_autotuning/autotuners/nevergrad_.py new file mode 100644 index 000000000..f7b8fd043 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/nevergrad_.py @@ -0,0 +1,64 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from functools import lru_cache +from time import time +from typing import Tuple + +import nevergrad as ng +from llvm_autotuning.optimization_target import OptimizationTarget + +from compiler_gym.envs import CompilerEnv + + +def nevergrad( + env: CompilerEnv, + optimization_target: OptimizationTarget, + search_time_seconds: int, + seed: int, + episode_length: int = 100, + optimizer: str = "DiscreteLenglerOnePlusOne", + **kwargs +) -> None: + """Optimize an environment using nevergrad. + + Nevergrad is a gradient-free optimization platform that provides + implementations of various black box optimizations techniques: + + https://facebookresearch.github.io/nevergrad/ + """ + if optimization_target == OptimizationTarget.RUNTIME: + + def calculate_negative_reward(actions: Tuple[int]) -> float: + env.reset() + env.step(actions) + return -env.episode_reward + + else: + # Only cache the deterministic non-runtime rewards. + @lru_cache(maxsize=int(1e4)) + def calculate_negative_reward(actions: Tuple[int]) -> float: + env.reset() + env.step(actions) + return -env.episode_reward + + params = ng.p.Choice( + choices=range(env.action_space.n), + repetitions=episode_length, + deterministic=True, + ) + params.random_state.seed(seed) + + optimizer_class = getattr(ng.optimizers, optimizer) + optimizer = optimizer_class(parametrization=params, budget=1, num_workers=1) + + end_time = time() + search_time_seconds + while time() < end_time: + x = optimizer.ask() + optimizer.tell(x, calculate_negative_reward(x.value)) + + # Get best solution and replay it. + recommendation = optimizer.provide_recommendation() + env.reset() + env.step(recommendation.value) diff --git a/examples/llvm_autotuning/autotuners/nevergrad_test.py b/examples/llvm_autotuning/autotuners/nevergrad_test.py new file mode 100644 index 000000000..485e781aa --- /dev/null +++ b/examples/llvm_autotuning/autotuners/nevergrad_test.py @@ -0,0 +1,29 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Integration tests for the LLVM autotuners.""" +from llvm_autotuning.autotuners import Autotuner + +import compiler_gym + + +def test_autotune(): + with compiler_gym.make("llvm-v0", reward_space="IrInstructionCount") as env: + env.reset(benchmark="benchmark://cbench-v1/crc32") + env.reward_space = "IrInstructionCount" + + autotuner = Autotuner( + algorithm="nevergrad", + optimization_target="codesize", + search_time_seconds=3, + ) + + result = autotuner(env) + print(result) + assert result.benchmark == "benchmark://cbench-v1/crc32" + assert result.walltime >= 3 + assert result.commandline == env.commandline() + assert env.episode_reward >= 0 + assert env.benchmark == "benchmark://cbench-v1/crc32" + assert env.reward_space == "IrInstructionCount" diff --git a/examples/llvm_autotuning/autotuners/opentuner_.py b/examples/llvm_autotuning/autotuners/opentuner_.py new file mode 100644 index 000000000..e579e62b1 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/opentuner_.py @@ -0,0 +1,217 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import random +import subprocess +import tempfile +import warnings + +from compiler_gym.service.connection import ServiceError + +# Ignore import deprecation warnings from opentuner. +warnings.filterwarnings("ignore", category=DeprecationWarning) + +import numpy as np # noqa: E402 +import opentuner as os # noqa: E402 +from llvm_autotuning.optimization_target import OptimizationTarget # noqa: E402 +from opentuner import ( # noqa: E402 + ConfigurationManipulator, + MeasurementInterface, + PermutationParameter, + Result, +) +from opentuner.search.binaryga import BinaryGA # noqa: E402 +from opentuner.search.manipulator import BooleanParameter # noqa: E402 +from opentuner.tuningrunmain import TuningRunMain # noqa: E402 + +from compiler_gym.envs import CompilerEnv # noqa: E402 +from compiler_gym.envs.llvm import compute_observation # noqa: E402 +from compiler_gym.third_party.llvm import opt_path # noqa: E402 +from compiler_gym.util.runfiles_path import transient_cache_path # noqa: E402 + + +def opentuner_ga( + env: CompilerEnv, + optimization_target: OptimizationTarget, + search_time_seconds: int, + seed: int, + max_copies_of_pass: int = 4, + population: int = 200, + tournament: int = 5, + mutate: int = 2, + sharing: int = 1, + **kwargs, +) -> None: + """Optimize an environment using opentuner. + + OpenTuner is an extensible framework for program autotuning: + + https://opentuner.org/ + """ + cache_dir = transient_cache_path("llvm_autotuning") + cache_dir.mkdir(exist_ok=True, parents=True) + with tempfile.TemporaryDirectory(dir=cache_dir, prefix="opentuner-") as tmpdir: + argparser = os.default_argparser() + args = argparser.parse_args( + args=[ + f"--stop-after={search_time_seconds}", + f"--database={tmpdir}/opentuner.db", + "--no-dups", + "--technique=custom", + f"--seed={seed}", + "--parallelism=1", + ] + ) + os.search.technique.register( + BinaryGA( + population=population, + tournament=tournament, + mutate=mutate, + sharing=sharing, + name="custom", + ) + ) + manipulator = LlvmOptFlagsTuner( + args, + target=optimization_target, + benchmark=env.benchmark, + max_copies_of_pass=max_copies_of_pass, + ) + tuner = TuningRunMain(manipulator, args) + tuner.main() + + class DesiredResult: + def __init__(self, configuration) -> None: + self.configuration = configuration + + class Configuration: + def __init__(self, data) -> None: + self.data = data + + wrapped = DesiredResult(Configuration(manipulator.best_config)) + manipulator.run(wrapped, None, None) + env.reset() + env.step(manipulator.serialize_actions(manipulator.best_config)) + + +class LlvmOptFlagsTuner(MeasurementInterface): + def __init__( + self, + *args, + target: OptimizationTarget, + benchmark=None, + max_copies_of_pass=4, + **kwargs, + ): + super().__init__(*args, **kwargs) + self.opt = str(opt_path()) + + self.env = target.make_env(benchmark) + self.env.reset() + self.target = target + self.observation_space = self.env.observation.spaces[ + target.optimization_space_enum_name + ] + + self.unoptimized_path = str( + self.env.service.connection.working_dir / "opentuner-unoptimized.bc" + ) + self.tmp_optimized_path = str( + self.env.service.connection.working_dir / "opentuner-optimized.bc" + ) + self.env.write_bitcode(self.unoptimized_path) + self.env.write_bitcode(self.tmp_optimized_path) + + self.cost_o0 = self.env.observation["IrInstructionCountO0"] + self.cost_oz = self.env.observation["IrInstructionCountOz"] + + self.flags_limit = self.env.action_space.n * max_copies_of_pass + self.run_count = 0 + self.best_config = None + + def manipulator(self) -> ConfigurationManipulator: + """Define the search space.""" + manipulator = ConfigurationManipulator() + # A permutation parameter to order the passes that are present. + manipulator.add_parameter( + PermutationParameter("flag_order", list(range(self.flags_limit))) + ) + # Boolean parameters for whether each pass is present. + for i in range(self.flags_limit): + manipulator.add_parameter(BooleanParameter(f"flag{i}")) + + def biased_random(): + cfg = ConfigurationManipulator.random(manipulator) + # duplicates in the search space, bias to `n / 2` enabled + disabled = random.sample( + range(self.flags_limit), k=self.flags_limit - self.env.action_space.n + ) + cfg.update({f"flag{x}": False for x in disabled}) + return cfg + + manipulator.random = biased_random + + return manipulator + + def serialize_flags(self, config): + """Convert a point in the search space to an ordered list of opt flags.""" + return [self.env.action_space.flags[a] for a in self.serialize_actions(config)] + + def serialize_actions(self, config): + """Convert a point in the search space to an ordered list of opt flags.""" + n = len(self.env.action_space.flags) + serialized = [] + for i in config["flag_order"]: + if config[f"flag{i}"]: + serialized.append(i % n) + return serialized + + def __del__(self): + self.env.close() + + def run(self, desired_result, input, limit): + """Run a single config.""" + del input # Unused + del limit # Unused + + self.run_count += 1 + + try: + # Run opt to produce an optimized bitcode file. + cmd = [ + self.opt, + str(self.unoptimized_path), + "-o", + str(self.tmp_optimized_path), + ] + cmd += self.serialize_flags(desired_result.configuration.data) + subprocess.check_call(cmd, timeout=300) + except (subprocess.CalledProcessError, subprocess.TimeoutExpired): + return Result(time=float("inf")) + + # We need to jump through a couple of hoops to optimize for runtime + # using OpenTuner. Replace the environment benchmark with the current + # optimized file. Use the same benchmark protocol buffer so that any + # dynamic configuration is preserved. + if self.target == OptimizationTarget.RUNTIME: + try: + new_benchmark = self.env.benchmark + new_benchmark.proto.program.uri = f"file:///{self.tmp_optimized_path}" + self.env.reset(benchmark=new_benchmark) + return Result(time=float(np.median(self.env.observation.Runtime()))) + except (ServiceError, TimeoutError): + return Result(time=float("inf")) + + try: + return Result( + time=float( + compute_observation(self.observation_space, self.tmp_optimized_path) + ) + ) + except (ValueError, TimeoutError): + return Result(time=float("inf")) + + def save_final_config(self, configuration): + # Save parameter for later. + self.best_config = configuration.data diff --git a/examples/llvm_autotuning/autotuners/opentuner_test.py b/examples/llvm_autotuning/autotuners/opentuner_test.py new file mode 100644 index 000000000..28bda8456 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/opentuner_test.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Integration tests for the LLVM autotuners.""" +import pytest +from llvm_autotuning.autotuners import Autotuner + +import compiler_gym + + +@pytest.mark.skip(reason="Workaround from pytest: I/O operation on closed file") +def test_autotune(): + with compiler_gym.make("llvm-v0", reward_space="IrInstructionCount") as env: + env.reset(benchmark="benchmark://cbench-v1/crc32") + + autotuner = Autotuner( + algorithm="opentuner_ga", + optimization_target="codesize", + search_time_seconds=3, + ) + + result = autotuner(env) + print(result) + assert result.benchmark == "benchmark://cbench-v1/crc32" + assert result.walltime >= 3 + assert result.commandline == env.commandline() + assert env.episode_reward >= 0 + assert env.benchmark == "benchmark://cbench-v1/crc32" + assert env.reward_space == "IrInstructionCount" diff --git a/examples/llvm_autotuning/autotuners/random_.py b/examples/llvm_autotuning/autotuners/random_.py new file mode 100644 index 000000000..7ef575f22 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/random_.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from tempfile import TemporaryDirectory + +from llvm_autotuning.optimization_target import OptimizationTarget + +from compiler_gym.envs import CompilerEnv +from compiler_gym.random_search import random_search as lib_random_search +from compiler_gym.util.runfiles_path import transient_cache_path + + +def random( + env: CompilerEnv, + optimization_target: OptimizationTarget, + search_time_seconds: int, + patience: int = 350, + **kwargs +) -> None: + """Run a random search on the environment. + + :param env: The environment to optimize. + + :param optimization_target: The target to optimize for. + + :param search_time_seconds: The total search time. + + :param patience: The number of steps to search without an improvement before + resetting to a new trajectory. + """ + with TemporaryDirectory( + dir=transient_cache_path("."), prefix="autotune-" + ) as tmpdir: + final_env = lib_random_search( + make_env=lambda: optimization_target.make_env(env.benchmark), + outdir=tmpdir, + total_runtime=search_time_seconds, + patience=patience, + nproc=1, + ) + env.apply(final_env.state) + final_env.close() diff --git a/examples/llvm_autotuning/autotuners/random_test.py b/examples/llvm_autotuning/autotuners/random_test.py new file mode 100644 index 000000000..98062a9a5 --- /dev/null +++ b/examples/llvm_autotuning/autotuners/random_test.py @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Integration tests for the LLVM autotuners.""" +from llvm_autotuning.autotuners import Autotuner + +import compiler_gym + + +def test_autotune(): + with compiler_gym.make("llvm-v0", reward_space="IrInstructionCount") as env: + env.reset(benchmark="benchmark://cbench-v1/crc32") + + autotuner = Autotuner( + algorithm="random", + optimization_target="codesize", + search_time_seconds=3, + ) + + result = autotuner(env) + print(result) + assert result.benchmark == "benchmark://cbench-v1/crc32" + assert result.walltime >= 3 + assert result.commandline == env.commandline() + assert env.episode_reward + assert env.benchmark == "benchmark://cbench-v1/crc32" + assert env.reward_space == "IrInstructionCount" diff --git a/examples/llvm_autotuning/count_autotuner_loc.sh b/examples/llvm_autotuning/count_autotuner_loc.sh new file mode 100644 index 000000000..3698bac57 --- /dev/null +++ b/examples/llvm_autotuning/count_autotuner_loc.sh @@ -0,0 +1,14 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +# +# Run this script without arguments from any directory: +# +# bash llvm_autotuning/count_autotuner_loc.sh +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +for file in $(ls "$SCRIPT_DIR"/autotuners/*.py | grep -v _test | grep -v __init__ | sort); do + echo -n $(basename "$file") + sloccount "$file" | grep 'Total Physical Source Lines of Code' | cut -d'=' -f2 +done diff --git a/examples/requirements.txt b/examples/requirements.txt index 1b8580395..c31cde583 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1 +1,4 @@ +nevergrad>=0.4.3 +opentuner>=0.8.5 +submitit>=1.2.0 torch>=1.6.0 From 98a2a29fc048231f64d00d61c13170dca58f743a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 7 Oct 2021 17:04:00 +0100 Subject: [PATCH 154/254] [examples] Add Autophase environment wrappers. --- examples/llvm_rl/__init__.py | 0 examples/llvm_rl/autophase_wrappers.py | 170 ++++++++++++++++++++ examples/llvm_rl/autophase_wrappers_test.py | 44 +++++ 3 files changed, 214 insertions(+) create mode 100644 examples/llvm_rl/__init__.py create mode 100644 examples/llvm_rl/autophase_wrappers.py create mode 100644 examples/llvm_rl/autophase_wrappers_test.py diff --git a/examples/llvm_rl/__init__.py b/examples/llvm_rl/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/llvm_rl/autophase_wrappers.py b/examples/llvm_rl/autophase_wrappers.py new file mode 100644 index 000000000..39dd48a95 --- /dev/null +++ b/examples/llvm_rl/autophase_wrappers.py @@ -0,0 +1,170 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Environment wrappers to closer replicate the MLSys'20 Autophase paper.""" +from collections.abc import Iterable as IterableType +from typing import List, Union + +import gym +import numpy as np + +from compiler_gym.envs import CompilerEnv, LlvmEnv +from compiler_gym.wrappers import ConstrainedCommandline, ObservationWrapper + + +class AutophaseNormalizedFeatures(ObservationWrapper): + """A wrapper for LLVM environments that use the Autophase observation space + to normalize and clip features to the range [0, 1]. + """ + + # The index of the "TotalInsts" feature of autophase. + TotalInsts_index = 51 + + def __init__(self, env: CompilerEnv): + super().__init__(env=env) + # Force Autophase observation space. + self.env.observation_space = self.env.unwrapped.observation.spaces["Autophase"] + # Adjust the bounds to reflect the normalized values. + self.env.observation_space_spec.space = gym.spaces.Box( + low=np.full( + self.env.observation_space_spec.space.shape[0], 0, dtype=np.float32 + ), + high=np.full( + self.env.observation_space_spec.space.shape[0], 1, dtype=np.float32 + ), + dtype=np.float32, + ) + + def observation(self, observation): + if observation[self.TotalInsts_index] <= 0: + return np.zeros(observation.shape) + return np.clip(observation / observation[self.TotalInsts_index], 0, 1) + + +class ConcatActionsHistogram(ObservationWrapper): + """A wrapper that concatenates a histogram of previous actions to each + observation. + + The actions histogram is concatenated to the end of the existing 1-D box + observation, expanding the space. + + The actions histogram has bounds [0,inf]. If you specify a fixed episode + length `norm_to_episode_len`, each histogram update will be scaled by + 1/norm_to_episode_len, so that `sum(observation) == 1` after episode_len + steps. + """ + + def __init__(self, env: CompilerEnv, norm_to_episode_len: int = 0): + super().__init__(env=env) + assert isinstance( + self.observation_space, gym.spaces.Box + ), f"Can only contatenate actions histogram to box shape, not {self.observation_space}" + assert isinstance( + self.action_space, gym.spaces.Discrete + ), "Can only construct histograms from discrete spaces" + assert len(self.observation_space.shape) == 1, "Requires 1-D observation space" + self.increment = 1 / norm_to_episode_len if norm_to_episode_len else 1 + + # Reshape the observation space. + self.env.observation_space_spec.space = gym.spaces.Box( + low=np.concatenate( + ( + self.env.observation_space.low, + np.zeros( + self.action_space.n, dtype=self.env.observation_space.dtype + ), + ) + ), + high=np.concatenate( + ( + self.env.observation_space.high, + # The upper bound is 1.0 if we are normalizing to the + # episode length, else infinite for unbounded episode + # lengths. + np.ones(self.action_space.n, dtype=self.env.observation_space.dtype) + * (1.0 if norm_to_episode_len else np.inf), + ) + ), + dtype=self.env.observation_space.dtype, + ) + + def reset(self, *args, **kwargs): + self.histogram = np.zeros((self.action_space.n,)) + return super().reset(*args, **kwargs) + + def step(self, action: Union[int, List[int]], observations=None, **kwargs): + if not isinstance(action, IterableType): + action = [action] + for a in action: + self.histogram[a] += self.increment + return super().step(action, **kwargs) + + def observation(self, observation): + return np.concatenate((observation, self.histogram)) + + +class AutophaseActionSpace(ConstrainedCommandline): + """An action space wrapper that limits the action space to that of the + Autophase paper. + + The actions used in the Autophase work are taken from: + + https://github.com/ucb-bar/autophase/blob/2f2e61ad63b50b5d0e2526c915d54063efdc2b92/gym-hls/gym_hls/envs/getcycle.py#L9 + + Note that 4 of the 46 flags are not included. Those are: + + -codegenprepare Excluded from CompilerGym + -scalarrepl Removed from LLVM in https://reviews.llvm.org/D21316 + -scalarrepl-ssa Removed from LLVM in https://reviews.llvm.org/D21316 + -terminate Not found in LLVM 10.0.0 + """ + + def __init__(self, env: LlvmEnv): + super().__init__( + env=env, + flags=[ + "-adce", + "-break-crit-edges", + "-constmerge", + "-correlated-propagation", + "-deadargelim", + "-dse", + "-early-cse", + "-functionattrs", + "-functionattrs", + "-globaldce", + "-globalopt", + "-gvn", + "-indvars", + "-inline", + "-instcombine", + "-ipsccp", + "-jump-threading", + "-lcssa", + "-licm", + "-loop-deletion", + "-loop-idiom", + "-loop-reduce", + "-loop-rotate", + "-loop-simplify", + "-loop-unroll", + "-loop-unswitch", + "-lower-expect", + "-loweratomic", + "-lowerinvoke", + "-lowerswitch", + "-mem2reg", + "-memcpyopt", + "-partial-inliner", + "-prune-eh", + "-reassociate", + "-sccp", + "-simplifycfg", + "-sink", + "-sroa", + "-strip", + "-strip-nondebug", + "-tailcallelim", + ], + ) diff --git a/examples/llvm_rl/autophase_wrappers_test.py b/examples/llvm_rl/autophase_wrappers_test.py new file mode 100644 index 000000000..046d16888 --- /dev/null +++ b/examples/llvm_rl/autophase_wrappers_test.py @@ -0,0 +1,44 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import numpy as np +import pytest + +import compiler_gym + +from . import autophase_wrappers as wrappers + + +@pytest.fixture(scope="function") +def env(): + with compiler_gym.make("llvm-v0") as env: + yield env + + +def test_AutophaseNormalizedFeatures(env): + env = wrappers.AutophaseNormalizedFeatures(env) + assert env.observation_space_spec.id == "Autophase" + assert env.observation_space.shape == (56,) + assert env.observation_space.dtype == np.float32 + + +def test_ConcatActionsHistogram(env): + env.observation_space = "Autophase" + num_features = env.observation_space.shape[0] + num_actions = env.action_space.n + + env = wrappers.ConcatActionsHistogram(env) + env.reset() + action = env.action_space.sample() + obs, _, _, _ = env.step(action) + assert env.observation_space.shape == (num_features + num_actions,) + assert obs.shape == (num_features + num_actions,) + + +def test_AutophaseActionSpace(env): + env = wrappers.AutophaseActionSpace(env) + + env.reset() + env.step(env.action_space.sample()) + assert env.action_space.n == 42 From 2e3b1769b9409e268c1af1385201d46ad17cab3c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 26 Oct 2021 12:19:25 +0100 Subject: [PATCH 155/254] [tests] Mark flaky and xfail tests. --- .../demo_without_bazel_test.py | 2 ++ .../action_sensitivity_analysis_test.py | 9 ++------- tests/llvm/datasets/csmith_test.py | 4 ++-- tests/llvm/fork_env_test.py | 7 +++++++ tests/llvm/fresh_environment_observation_reward_test.py | 1 - 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/example_compiler_gym_service/demo_without_bazel_test.py b/examples/example_compiler_gym_service/demo_without_bazel_test.py index aa9ef51cf..6f6f83834 100644 --- a/examples/example_compiler_gym_service/demo_without_bazel_test.py +++ b/examples/example_compiler_gym_service/demo_without_bazel_test.py @@ -4,7 +4,9 @@ # LICENSE file in the root directory of this source tree. """Smoke test for examples/example_compiler_gym_service/demo_without_bazel.py""" from example_compiler_gym_service.demo_without_bazel import main +from flaky import flaky +@flaky def test_demo_without_bazel(): main() diff --git a/examples/sensitivity_analysis/action_sensitivity_analysis_test.py b/examples/sensitivity_analysis/action_sensitivity_analysis_test.py index 554f432a3..22b91e593 100644 --- a/examples/sensitivity_analysis/action_sensitivity_analysis_test.py +++ b/examples/sensitivity_analysis/action_sensitivity_analysis_test.py @@ -4,23 +4,18 @@ # LICENSE file in the root directory of this source tree. """End-to-end test of //compiler_gym/bin:action_sensitivity_analysis.""" -import sys import tempfile from pathlib import Path -import pytest from absl.flags import FLAGS +from flaky import flaky from sensitivity_analysis.action_sensitivity_analysis import ( run_action_sensitivity_analysis, ) from sensitivity_analysis.sensitivity_analysis_eval import run_sensitivity_analysis_eval -@pytest.mark.xfail( - sys.platform == "darwin", - strict=True, - reason="github.com/facebookresearch/CompilerGym/issues/459", -) +@flaky def test_run_action_sensitivity_analysis(): actions = [0, 1] env = "llvm-v0" diff --git a/tests/llvm/datasets/csmith_test.py b/tests/llvm/datasets/csmith_test.py index 955f85276..a76627f42 100644 --- a/tests/llvm/datasets/csmith_test.py +++ b/tests/llvm/datasets/csmith_test.py @@ -68,7 +68,7 @@ def test_csmith_from_seed_retry_count_exceeded(csmith_dataset: CsmithDataset): strict=True, reason="github.com/facebookresearch/CompilerGym/issues/459", ) -@flaky(rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) +@flaky(max_runs=5, rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) def test_csmith_positive_runtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): benchmark = next(csmith_dataset.benchmarks()) env.reset(benchmark=benchmark) @@ -82,7 +82,7 @@ def test_csmith_positive_runtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): strict=True, reason="github.com/facebookresearch/CompilerGym/issues/459", ) -@flaky(rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) +@flaky(max_runs=5, rerun_filter=lambda err, *args: issubclass(err[0], ServiceError)) def test_csmith_positive_buildtimes(env: LlvmEnv, csmith_dataset: CsmithDataset): benchmark = next(csmith_dataset.benchmarks()) env.reset(benchmark=benchmark) diff --git a/tests/llvm/fork_env_test.py b/tests/llvm/fork_env_test.py index b7ac8b012..55779a945 100644 --- a/tests/llvm/fork_env_test.py +++ b/tests/llvm/fork_env_test.py @@ -4,6 +4,9 @@ # LICENSE file in the root directory of this source tree. """Tests for LlvmEnv.fork().""" import subprocess +import sys + +import pytest from compiler_gym.envs import LlvmEnv from compiler_gym.util.runfiles_path import runfiles_path @@ -201,6 +204,10 @@ def test_fork_modified_ir_is_the_same(env: LlvmEnv): assert "\n".join(env.ir.split("\n")[1:]) == "\n".join(fkd.ir.split("\n")[1:]) +@pytest.mark.xfail( + sys.platform == "darwin", + reason="github.com/facebookresearch/CompilerGym/issues/459", +) def test_fork_rewards(env: LlvmEnv, reward_space: str): """Test that rewards are equal after fork() is called.""" env.reward_space = reward_space diff --git a/tests/llvm/fresh_environment_observation_reward_test.py b/tests/llvm/fresh_environment_observation_reward_test.py index 0ec955090..e9c140000 100644 --- a/tests/llvm/fresh_environment_observation_reward_test.py +++ b/tests/llvm/fresh_environment_observation_reward_test.py @@ -16,7 +16,6 @@ @pytest.mark.xfail( sys.platform == "darwin", - strict=True, reason="github.com/facebookresearch/CompilerGym/issues/459", ) @flaky # Runtime can timeout From fefadb1f94f591a126912d140680b3b31ec653db Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 26 Oct 2021 16:04:22 +0100 Subject: [PATCH 156/254] [tests] Remove bind to all addresses in test logic. Issue #474. --- examples/example_compiler_gym_service/env_tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example_compiler_gym_service/env_tests.py b/examples/example_compiler_gym_service/env_tests.py index 9f5dee8c1..3e4e53404 100644 --- a/examples/example_compiler_gym_service/env_tests.py +++ b/examples/example_compiler_gym_service/env_tests.py @@ -252,7 +252,7 @@ def unsafe_select_unused_port() -> int: being claimed by another process or thread, so it is liable to race conditions """ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(("", 0)) + s.bind(("127.0.0.1", 0)) s.listen(1) port = s.getsockname()[1] s.close() @@ -263,7 +263,7 @@ def port_is_free(port: int) -> bool: """Determine if a port is in use""" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: - s.bind(("", port)) + s.bind(("127.0.0.1", port)) return True except OSError: return False From 554b041cf8b686f939c0edbc596ff3bb5aec467e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 30 Oct 2021 23:12:21 -0400 Subject: [PATCH 157/254] start with a LLVM analysis file --- .../loop_unroller/BUILD | 21 + .../loop_unroller/loop_unroller.cc | 381 ++++++++++++++++++ 2 files changed, 402 insertions(+) create mode 100644 examples/example_unrolling_service/loop_unroller/BUILD create mode 100644 examples/example_unrolling_service/loop_unroller/loop_unroller.cc diff --git a/examples/example_unrolling_service/loop_unroller/BUILD b/examples/example_unrolling_service/loop_unroller/BUILD new file mode 100644 index 000000000..ef9122ff9 --- /dev/null +++ b/examples/example_unrolling_service/loop_unroller/BUILD @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the LICENSE file +# in the root directory of this source tree. +# +# This package exposes the LLVM optimization pipeline as a CompilerGym service. +load("@rules_cc//cc:defs.bzl", "cc_binary") + +cc_binary( + name = "loop_unroller", + srcs = ["loop_unroller.cc"], + copts = [ + "-Wall", + "-fdiagnostics-color=always", + "-fno-rtti", + ], + visibility = ["//visibility:public"], + deps = [ + "@llvm//10.0.0", + ], +) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc new file mode 100644 index 000000000..5d4ae7eae --- /dev/null +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -0,0 +1,381 @@ +//============================================================================== +// Estimate best and worst case execution time of LLVM code. +// +// Hugh Leather hughleat@gmail.com 2020-06-30 +//============================================================================== + +#include +#include +#include +#include +#include +#include + +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/IR/CFG.h" +#include "llvm/IRReader/IRReader.h" +#include "llvm/Pass.h" +#include "llvm/Passes/PassBuilder.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; +using namespace std; + +//------------------------------------------------------------------------------ +// Command line options +//------------------------------------------------------------------------------ +cl::OptionCategory bwcetCategory{"bwcet options"}; + +cl::list inputFiles(cl::Positional, cl::desc{""}, + cl::value_desc{"bitcode filename"}, cl::OneOrMore, + cl::cat{bwcetCategory}); + +cl::opt outputFilename("output", cl::desc("Specify output filename (default to std out)"), + cl::value_desc("output filename"), cl::init("-"), + cl::cat{bwcetCategory}); +cl::alias outputFilenameA("o", cl::desc("Alias for --output"), cl::aliasopt(outputFilename), + cl::cat{bwcetCategory}); + +enum OutputFormat { TXT, JSON, CSV }; +cl::opt outputFormat("format", cl::desc("Choose output format"), + cl::values(clEnumVal(TXT, "Human readable format (default)"), + clEnumVal(JSON, "JSON format"), + clEnumVal(CSV, "CSV format")), + cl::init(TXT), cl::cat{bwcetCategory}); +cl::alias outputFormatA("f", cl::desc("Alias for --format"), cl::aliasopt(outputFormat), + cl::cat{bwcetCategory}); + +cl::opt costKind( + "cost-kind", cl::desc("Target cost kind"), cl::init(TargetTransformInfo::TCK_RecipThroughput), + cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput, "throughput", + "Reciprocal throughput (default)"), + clEnumValN(TargetTransformInfo::TCK_Latency, "latency", "Instruction latency"), + clEnumValN(TargetTransformInfo::TCK_CodeSize, "code-size", "Code size")), + cl::cat{bwcetCategory}); +cl::alias costKindA("k", cl::desc("Alias for --cost-kind"), cl::aliasopt(costKind), + cl::cat{bwcetCategory}); + +//------------------------------------------------------------------------------ +// Determine if CFG is a DAG. +//------------------------------------------------------------------------------ +// Colour for DFS +enum Colour { WHITE, GREY, BLACK }; +// DFS +bool isDAG(const BasicBlock* bb, unordered_map& colour) { + switch (colour[bb]) { + case BLACK: + return true; + case GREY: + return false; + case WHITE: { + colour[bb] = GREY; + for (const auto* succ : successors(bb)) { + if (!isDAG(succ, colour)) + return false; + } + colour[bb] = BLACK; + return true; + } + } +} +bool isDAG(const Function& f) { + unordered_map colour; + return isDAG(&f.getEntryBlock(), colour); +} + +//------------------------------------------------------------------------------ +// Get min and max cost of functions and basic blocks +//------------------------------------------------------------------------------ +TargetIRAnalysis tira; +unique_ptr ttiwp((TargetTransformInfoWrapperPass*) + createTargetTransformInfoWrapperPass(tira)); +using CostT = double; + +CostT getCost(const BasicBlock& bb, const TargetTransformInfo& tti) { + CostT cost = 0; + for (const auto& insn : bb) { + cost += tti.getInstructionCost(&insn, costKind); + } + return cost; +} +CostT minCost(const Function& f, unordered_map bbCost) { + // Cost of best path (path with minimum cost) + CostT best = numeric_limits::infinity(); + // The exit block with the best path cost + const BasicBlock* bestBB = nullptr; + // Predecessors + unordered_map pred; + // Map of costs into each vertex + unordered_map costIn; + // Priority queue + set> q; + // Pointers into q - so we can change priority + unordered_map iter; + // Initialise cost + for (const BasicBlock& v : f.getBasicBlockList()) costIn[&v] = numeric_limits::infinity(); + auto start = &f.getEntryBlock(); + costIn[start] = 0; + // Push into q (and remember iterator) + auto iti = q.insert({costIn[start], start}); + iter[start] = iti.first; + // Do the search + while (!q.empty()) { + // Pop from the q + auto top = q.begin(); + const BasicBlock* v = top->second; + CostT cIn = top->first; + q.erase(top); + iter.erase(v); + assert(cIn == costIn[v]); + + // Get the cost out of this node + int cOut = cIn + bbCost[v]; + // Count the successors as we process them + int numSuccs = 0; + // Process each successor + for (const auto* succ : successors(v)) { + numSuccs++; + // Update if the cost is better + if (cOut < costIn[succ]) { + // Set the new cost + costIn[succ] = cOut; + // Delete from the queue if already in there + if (iter.count(succ)) { + auto it = iter[succ]; + q.erase(it); + } + // Insert into the queue (and remember iterator) + auto iti = q.insert({cOut, succ}); + iter[succ] = iti.first; + // Remember predecessor + pred[succ] = v; + } + } + // Update best if this is an exit block (no successors) and we have a better cost + if (numSuccs == 0 && best > cOut) { + best = cOut; + bestBB = v; + } + } + return best; +} +CostT maxCost(const Function& f, unordered_map bbCost) { + // Cost of best path (path with minimum cost) + CostT best = 0; + // The exit block with the best path cost + const BasicBlock* bestBB = nullptr; + // Predecessors + unordered_map pred; + // Map of costs into each vertex + unordered_map costIn; + // Priority queue + struct RCmp { + bool operator()(const pair& a, + const pair& b) const { + if (a.first == b.first) + return a.second < b.second; + return a.first > b.first; + } + }; + set, RCmp> q; + // Pointers into q - so we can change priority + unordered_map iter; + // Initialise cost + for (const BasicBlock& v : f.getBasicBlockList()) costIn[&v] = 0; + auto start = &f.getEntryBlock(); + costIn[start] = 0; + // Push into q (and remember iterator) + auto iti = q.insert({costIn[start], start}); + iter[start] = iti.first; + // Do the search + while (!q.empty()) { + // Pop from the q + auto top = q.begin(); + const BasicBlock* v = top->second; + CostT cIn = top->first; + q.erase(top); + iter.erase(v); + assert(cIn == costIn[v]); + + // Get the cost out of this node + int cOut = cIn + bbCost[v]; + // Count the successors as we process them + int numSuccs = 0; + // Process each successor + for (const auto* succ : successors(v)) { + numSuccs++; + // Update if the cost is better + if (cOut > costIn[succ]) { + // Set the new cost + costIn[succ] = cOut; + // Delete from the queue if already in there + if (iter.count(succ)) { + auto it = iter[succ]; + q.erase(it); + } + // Insert into the queue (and remember iterator) + auto iti = q.insert({cOut, succ}); + iter[succ] = iti.first; + // Remember predecessor + pred[succ] = v; + } + } + // Update best if this is an exit block (no successors) and we have a better cost + if (numSuccs == 0 && best < cOut) { + best = cOut; + bestBB = v; + } + } + return best; +} + +pair getCost(const Function& f) { + auto& tti = ttiwp->getTTI(f); + + // Precompute BB costs. + unordered_map bbCost; + for (const auto& bb : f.getBasicBlockList()) bbCost[&bb] = getCost(bb, tti); + + if (isDAG(f)) { + return {minCost(f, bbCost), maxCost(f, bbCost)}; + } else { + return {minCost(f, bbCost), numeric_limits::infinity()}; + } +} + +//------------------------------------------------------------------------------ +// Visitor functions, called to process the module +//------------------------------------------------------------------------------ +void visit(const Function& f, ostream& os) { + auto costs = getCost(f); + switch (outputFormat) { + case TXT: { + os << " Function: " << f.getName().str() << " "; + os << "min=" << costs.first << " "; + os << "max=" << costs.second << endl; + break; + } + case JSON: { + os << "{"; + os << "\"function\":\"" << f.getName().str() << "\","; + os << "\"min\":" << costs.first; + if (costs.second != numeric_limits::infinity()) { + os << ",\"max\":" << costs.second; + } + os << "}"; + break; + } + case CSV: { + os << f.getParent()->getName().str() << ","; + os << f.getName().str() << ","; + os << costs.first << ","; + if (costs.second != numeric_limits::infinity()) { + os << costs.second; + } + os << "\n"; + break; + } + } +} +void visit(const Module& m, ostream& os) { + switch (outputFormat) { + case TXT: { + os << "Module: " << m.getName().str() << "\n"; + for (const auto& f : m.functions()) visit(f, os); + break; + } + case JSON: { + os << "{"; + os << "\"module\":\"" << m.getName().str() << "\","; + os << "\"functions\":["; + bool isFirst = true; + for (const auto& f : m.functions()) { + if (!isFirst) + os << ","; + else + isFirst = false; + visit(f, os); + } + os << "]}"; + break; + } + case CSV: { + for (const auto& f : m.functions()) visit(f, os); + break; + } + } +} +void visit(const string& filename, ostream& os) { + // Parse the IR file passed on the command line. + SMDiagnostic err; + LLVMContext ctx; + unique_ptr m = parseIRFile(filename, err, ctx); + + if (!m) + throw err; + + // Run the analysis and print the results + visit(*m, os); +} +void visit(const vector& filenames, ostream& os) { + switch (outputFormat) { + case TXT: { + for (const auto& fn : filenames) visit(fn, os); + break; + } + case JSON: { + os << "["; + bool isFirst = true; + for (const auto& fn : filenames) { + if (!isFirst) + os << ","; + else + isFirst = false; + visit(fn, os); + } + os << "]\n"; + break; + } + case CSV: { + os << "Module, Function, DAG, Min, Max\n"; + for (const auto& fn : filenames) visit(fn, os); + break; + } + } +} +//------------------------------------------------------------------------------ +// Driver +//------------------------------------------------------------------------------ +int main(int argc, char** argv) { + // Hide all options apart from the ones specific to this tool + cl::HideUnrelatedOptions(bwcetCategory); + + cl::ParseCommandLineOptions( + argc, argv, + "Estimates the best and worst case runtime for each function the input IR file\n"); + + try { + // Get the output file + unique_ptr ofs(outputFilename == "-" ? nullptr : new ofstream(outputFilename.c_str())); + if (ofs && !ofs->good()) { + throw "Error opening output file: " + outputFilename; + } + ostream& os = ofs ? *ofs : cout; + + // Makes sure llvm_shutdown() is called (which cleans up LLVM objects) + // http://llvm.org/docs/ProgrammersManual.html#ending-execution-with-llvm-shutdown + llvm_shutdown_obj shutdown_obj; + + // Do the work + visit(inputFiles, os); + + } catch (string e) { + errs() << e; + return -1; + } catch (SMDiagnostic e) { + e.print(argv[0], errs(), false); + return -1; + } + return 0; +} From 1e7850f3a099d2370e8e628d05850492c607117e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 31 Oct 2021 11:12:59 -0400 Subject: [PATCH 158/254] use an IR pass example --- .../loop_unroller/BUILD | 5 +- .../loop_unroller/IRCanonicalizer.h | 77 ++ .../loop_unroller/loop_unroller.cc | 914 +++++++++++------- 3 files changed, 664 insertions(+), 332 deletions(-) create mode 100644 examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h diff --git a/examples/example_unrolling_service/loop_unroller/BUILD b/examples/example_unrolling_service/loop_unroller/BUILD index ef9122ff9..52c8aa580 100644 --- a/examples/example_unrolling_service/loop_unroller/BUILD +++ b/examples/example_unrolling_service/loop_unroller/BUILD @@ -8,7 +8,10 @@ load("@rules_cc//cc:defs.bzl", "cc_binary") cc_binary( name = "loop_unroller", - srcs = ["loop_unroller.cc"], + srcs = [ + "IRCanonicalizer.h", + "loop_unroller.cc", + ], copts = [ "-Wall", "-fdiagnostics-color=always", diff --git a/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h b/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h new file mode 100644 index 000000000..a4e14b517 --- /dev/null +++ b/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h @@ -0,0 +1,77 @@ +#pragma once + +#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" + +/// IRCanonicalizer aims to transform LLVM IR into canonical form. +class IRCanonicalizer : public llvm::FunctionPass { + public: + static char ID; + + /// Constructor for the IRCanonicalizer. + /// + /// \param PreserveOrder Preserves original order of instructions. + /// \param RenameAll Renames all instructions (including user-named). + /// \param FoldPreoutputs Folds all regular instructions (including pre-outputs). + /// \param ReorderOperands Sorts and reorders operands in commutative instructions. + IRCanonicalizer(bool PreserveOrder, bool RenameAll, bool FoldPreoutputs, bool ReorderOperands) + : FunctionPass(ID), + PreserveOrder(PreserveOrder), + RenameAll(RenameAll), + FoldPreoutputs(FoldPreoutputs), + ReorderOperands(ReorderOperands) {} + + bool runOnFunction(llvm::Function& F) override; + + private: + // Random constant for hashing, so the state isn't zero. + const uint64_t MagicHashConstant = 0x6acaa36bef8325c5ULL; + + /// \name Canonicalizer flags. + /// @{ + /// Preserves original order of instructions. + bool PreserveOrder; + /// Renames all instructions (including user-named). + bool RenameAll; + /// Folds all regular instructions (including pre-outputs). + bool FoldPreoutputs; + /// Sorts and reorders operands in commutative instructions. + bool ReorderOperands; + /// @} + + /// \name Naming. + /// @{ + void nameFunctionArguments(llvm::Function& F); + void nameBasicBlocks(llvm::Function& F); + void nameInstructions(llvm::SmallVector& Outputs); + void nameInstruction(llvm::Instruction* I, + llvm::SmallPtrSet& Visited); + void nameAsInitialInstruction(llvm::Instruction* I); + void nameAsRegularInstruction(llvm::Instruction* I, + llvm::SmallPtrSet& Visited); + void foldInstructionName(llvm::Instruction* I); + /// @} + + /// \name Reordering. + /// @{ + void reorderInstructions(llvm::SmallVector& Outputs); + void reorderInstruction(llvm::Instruction* Used, llvm::Instruction* User, + llvm::SmallPtrSet& Visited); + void reorderInstructionOperandsByNames(llvm::Instruction* I); + void reorderPHIIncomingValues(llvm::PHINode* PN); + /// @} + + /// \name Utility methods. + /// @{ + llvm::SmallVector collectOutputInstructions(llvm::Function& F); + bool isOutput(const llvm::Instruction* I); + bool isInitialInstruction(const llvm::Instruction* I); + bool hasOnlyImmediateOperands(const llvm::Instruction* I); + llvm::SetVector getOutputFootprint(llvm::Instruction* I, + llvm::SmallPtrSet& Visited); + /// @} +}; diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 5d4ae7eae..0014da795 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -1,381 +1,633 @@ -//============================================================================== -// Estimate best and worst case execution time of LLVM code. -// -// Hugh Leather hughleat@gmail.com 2020-06-30 -//============================================================================== - -#include -#include -#include -#include -#include -#include - -#include "llvm/Analysis/TargetTransformInfo.h" -#include "llvm/IR/CFG.h" +#include +#include + +#include "IRCanonicalizer.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/IR/BasicBlock.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" #include "llvm/Pass.h" -#include "llvm/Passes/PassBuilder.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" -#include "llvm/Support/raw_ostream.h" using namespace llvm; -using namespace std; - -//------------------------------------------------------------------------------ -// Command line options -//------------------------------------------------------------------------------ -cl::OptionCategory bwcetCategory{"bwcet options"}; - -cl::list inputFiles(cl::Positional, cl::desc{""}, - cl::value_desc{"bitcode filename"}, cl::OneOrMore, - cl::cat{bwcetCategory}); - -cl::opt outputFilename("output", cl::desc("Specify output filename (default to std out)"), - cl::value_desc("output filename"), cl::init("-"), - cl::cat{bwcetCategory}); -cl::alias outputFilenameA("o", cl::desc("Alias for --output"), cl::aliasopt(outputFilename), - cl::cat{bwcetCategory}); - -enum OutputFormat { TXT, JSON, CSV }; -cl::opt outputFormat("format", cl::desc("Choose output format"), - cl::values(clEnumVal(TXT, "Human readable format (default)"), - clEnumVal(JSON, "JSON format"), - clEnumVal(CSV, "CSV format")), - cl::init(TXT), cl::cat{bwcetCategory}); -cl::alias outputFormatA("f", cl::desc("Alias for --format"), cl::aliasopt(outputFormat), - cl::cat{bwcetCategory}); - -cl::opt costKind( - "cost-kind", cl::desc("Target cost kind"), cl::init(TargetTransformInfo::TCK_RecipThroughput), - cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput, "throughput", - "Reciprocal throughput (default)"), - clEnumValN(TargetTransformInfo::TCK_Latency, "latency", "Instruction latency"), - clEnumValN(TargetTransformInfo::TCK_CodeSize, "code-size", "Code size")), - cl::cat{bwcetCategory}); -cl::alias costKindA("k", cl::desc("Alias for --cost-kind"), cl::aliasopt(costKind), - cl::cat{bwcetCategory}); - -//------------------------------------------------------------------------------ -// Determine if CFG is a DAG. -//------------------------------------------------------------------------------ -// Colour for DFS -enum Colour { WHITE, GREY, BLACK }; -// DFS -bool isDAG(const BasicBlock* bb, unordered_map& colour) { - switch (colour[bb]) { - case BLACK: - return true; - case GREY: - return false; - case WHITE: { - colour[bb] = GREY; - for (const auto* succ : successors(bb)) { - if (!isDAG(succ, colour)) - return false; - } - colour[bb] = BLACK; - return true; + +char IRCanonicalizer::ID = 0; + +/// Entry method to the IRCanonicalizer. +/// +/// \param M Module to canonicalize. +bool IRCanonicalizer::runOnFunction(Function& F) { + nameFunctionArguments(F); + nameBasicBlocks(F); + + SmallVector Outputs = collectOutputInstructions(F); + + if (!PreserveOrder) + reorderInstructions(Outputs); + + nameInstructions(Outputs); + + for (auto& I : instructions(F)) { + if (!PreserveOrder) { + if (ReorderOperands && I.isCommutative()) + reorderInstructionOperandsByNames(&I); + + if (auto* PN = dyn_cast(&I)) + reorderPHIIncomingValues(PN); } + + foldInstructionName(&I); } -} -bool isDAG(const Function& f) { - unordered_map colour; - return isDAG(&f.getEntryBlock(), colour); + + return true; } -//------------------------------------------------------------------------------ -// Get min and max cost of functions and basic blocks -//------------------------------------------------------------------------------ -TargetIRAnalysis tira; -unique_ptr ttiwp((TargetTransformInfoWrapperPass*) - createTargetTransformInfoWrapperPass(tira)); -using CostT = double; - -CostT getCost(const BasicBlock& bb, const TargetTransformInfo& tti) { - CostT cost = 0; - for (const auto& insn : bb) { - cost += tti.getInstructionCost(&insn, costKind); +/// Numbers arguments. +/// +/// \param F Function whose arguments will be renamed. +void IRCanonicalizer::nameFunctionArguments(Function& F) { + int ArgumentCounter = 0; + for (auto& A : F.args()) { + if (RenameAll || A.getName().empty()) { + A.setName("a" + Twine(ArgumentCounter)); + ++ArgumentCounter; + } } - return cost; } -CostT minCost(const Function& f, unordered_map bbCost) { - // Cost of best path (path with minimum cost) - CostT best = numeric_limits::infinity(); - // The exit block with the best path cost - const BasicBlock* bestBB = nullptr; - // Predecessors - unordered_map pred; - // Map of costs into each vertex - unordered_map costIn; - // Priority queue - set> q; - // Pointers into q - so we can change priority - unordered_map iter; - // Initialise cost - for (const BasicBlock& v : f.getBasicBlockList()) costIn[&v] = numeric_limits::infinity(); - auto start = &f.getEntryBlock(); - costIn[start] = 0; - // Push into q (and remember iterator) - auto iti = q.insert({costIn[start], start}); - iter[start] = iti.first; - // Do the search - while (!q.empty()) { - // Pop from the q - auto top = q.begin(); - const BasicBlock* v = top->second; - CostT cIn = top->first; - q.erase(top); - iter.erase(v); - assert(cIn == costIn[v]); - - // Get the cost out of this node - int cOut = cIn + bbCost[v]; - // Count the successors as we process them - int numSuccs = 0; - // Process each successor - for (const auto* succ : successors(v)) { - numSuccs++; - // Update if the cost is better - if (cOut < costIn[succ]) { - // Set the new cost - costIn[succ] = cOut; - // Delete from the queue if already in there - if (iter.count(succ)) { - auto it = iter[succ]; - q.erase(it); - } - // Insert into the queue (and remember iterator) - auto iti = q.insert({cOut, succ}); - iter[succ] = iti.first; - // Remember predecessor - pred[succ] = v; - } - } - // Update best if this is an exit block (no successors) and we have a better cost - if (numSuccs == 0 && best > cOut) { - best = cOut; - bestBB = v; + +/// Names basic blocks using a generated hash for each basic block in +/// a function considering the opcode and the order of output instructions. +/// +/// \param F Function containing basic blocks to rename. +void IRCanonicalizer::nameBasicBlocks(Function& F) { + for (auto& B : F) { + // Initialize to a magic constant, so the state isn't zero. + uint64_t Hash = MagicHashConstant; + + // Hash considering output instruction opcodes. + for (auto& I : B) + if (isOutput(&I)) + Hash = hashing::detail::hash_16_bytes(Hash, I.getOpcode()); + + if (RenameAll || B.getName().empty()) { + // Name basic block. Substring hash to make diffs more readable. + B.setName("bb" + std::to_string(Hash).substr(0, 5)); } } - return best; } -CostT maxCost(const Function& f, unordered_map bbCost) { - // Cost of best path (path with minimum cost) - CostT best = 0; - // The exit block with the best path cost - const BasicBlock* bestBB = nullptr; - // Predecessors - unordered_map pred; - // Map of costs into each vertex - unordered_map costIn; - // Priority queue - struct RCmp { - bool operator()(const pair& a, - const pair& b) const { - if (a.first == b.first) - return a.second < b.second; - return a.first > b.first; + +/// Names instructions graphically. +/// This method is a wrapper for recursive nameInstruction(). +/// +/// \see nameInstruction() +/// \param Outputs Vector of pointers to output instructions collected top-down. +void IRCanonicalizer::nameInstructions(SmallVector& Outputs) { + // Keeping track of visited instructions while naming (even depth first) is + // necessary only to avoid infinite loops on PHI nodes. + SmallPtrSet Visited; + + for (auto& I : Outputs) nameInstruction(I, Visited); +} + +/// Names instructions graphically (recursive) in accordance with the +/// def-use tree, starting from the initial instructions (defs), finishing at +/// the output (top-most user) instructions (depth-first). +/// +/// \param I Instruction to be renamed. +void IRCanonicalizer::nameInstruction(Instruction* I, + SmallPtrSet& Visited) { + // Keeping track of visited instructions while naming (even depth first) is + // necessary only to avoid infinite loops on PHI nodes. + if (!Visited.count(I)) { + Visited.insert(I); + + // Determine the type of instruction to name. + if (isInitialInstruction(I)) { + // This is an initial instruction. + nameAsInitialInstruction(I); + } else { + // This must be a regular instruction. + nameAsRegularInstruction(I, Visited); } - }; - set, RCmp> q; - // Pointers into q - so we can change priority - unordered_map iter; - // Initialise cost - for (const BasicBlock& v : f.getBasicBlockList()) costIn[&v] = 0; - auto start = &f.getEntryBlock(); - costIn[start] = 0; - // Push into q (and remember iterator) - auto iti = q.insert({costIn[start], start}); - iter[start] = iti.first; - // Do the search - while (!q.empty()) { - // Pop from the q - auto top = q.begin(); - const BasicBlock* v = top->second; - CostT cIn = top->first; - q.erase(top); - iter.erase(v); - assert(cIn == costIn[v]); - - // Get the cost out of this node - int cOut = cIn + bbCost[v]; - // Count the successors as we process them - int numSuccs = 0; - // Process each successor - for (const auto* succ : successors(v)) { - numSuccs++; - // Update if the cost is better - if (cOut > costIn[succ]) { - // Set the new cost - costIn[succ] = cOut; - // Delete from the queue if already in there - if (iter.count(succ)) { - auto it = iter[succ]; - q.erase(it); - } - // Insert into the queue (and remember iterator) - auto iti = q.insert({cOut, succ}); - iter[succ] = iti.first; - // Remember predecessor - pred[succ] = v; - } + } +} + +/// Names instruction following the scheme: +/// vl00000Callee(Operands) +/// +/// Where 00000 is a hash calculated considering instruction's opcode and output +/// footprint. Callee's name is only included when instruction's type is +/// CallInst. In cases where instruction is commutative, operands list is also +/// sorted. +/// +/// Renames instruction only when RenameAll flag is raised or instruction is +/// unnamed. +/// +/// \see getOutputFootprint() +/// \param I Instruction to be renamed. +void IRCanonicalizer::nameAsInitialInstruction(Instruction* I) { + if (I->getType()->isVoidTy() || (!I->getName().empty() && !RenameAll)) + return; + + // Instruction operands for further sorting. + SmallVector, 4> Operands; + + // Collect operands. + for (auto& OP : I->operands()) { + if (!isa(OP)) { + std::string TextRepresentation; + raw_string_ostream Stream(TextRepresentation); + OP->printAsOperand(Stream, false); + Operands.push_back(StringRef(Stream.str())); } - // Update best if this is an exit block (no successors) and we have a better cost - if (numSuccs == 0 && best < cOut) { - best = cOut; - bestBB = v; + } + + if (I->isCommutative()) + llvm::sort(Operands); + + // Initialize to a magic constant, so the state isn't zero. + uint64_t Hash = MagicHashConstant; + + // Consider instruction's opcode in the hash. + Hash = hashing::detail::hash_16_bytes(Hash, I->getOpcode()); + + SmallPtrSet Visited; + // Get output footprint for I. + SetVector OutputFootprint = getOutputFootprint(I, Visited); + + // Consider output footprint in the hash. + for (const int& Output : OutputFootprint) Hash = hashing::detail::hash_16_bytes(Hash, Output); + + // Base instruction name. + SmallString<256> Name; + Name.append("vl" + std::to_string(Hash).substr(0, 5)); + + // In case of CallInst, consider callee in the instruction name. + if (const auto* CI = dyn_cast(I)) { + Function* F = CI->getCalledFunction(); + + if (F != nullptr) { + Name.append(F->getName()); } } - return best; + + Name.append("("); + for (unsigned long i = 0; i < Operands.size(); ++i) { + Name.append(Operands[i]); + + if (i < Operands.size() - 1) + Name.append(", "); + } + Name.append(")"); + + I->setName(Name); } -pair getCost(const Function& f) { - auto& tti = ttiwp->getTTI(f); +/// Names instruction following the scheme: +/// op00000Callee(Operands) +/// +/// Where 00000 is a hash calculated considering instruction's opcode, its +/// operands' opcodes and order. Callee's name is only included when +/// instruction's type is CallInst. In cases where instruction is commutative, +/// operand list is also sorted. +/// +/// Names instructions recursively in accordance with the def-use tree, +/// starting from the initial instructions (defs), finishing at +/// the output (top-most user) instructions (depth-first). +/// +/// Renames instruction only when RenameAll flag is raised or instruction is +/// unnamed. +/// +/// \see getOutputFootprint() +/// \param I Instruction to be renamed. +void IRCanonicalizer::nameAsRegularInstruction(Instruction* I, + SmallPtrSet& Visited) { + // Instruction operands for further sorting. + SmallVector, 4> Operands; - // Precompute BB costs. - unordered_map bbCost; - for (const auto& bb : f.getBasicBlockList()) bbCost[&bb] = getCost(bb, tti); + // The name of a regular instruction depends + // on the names of its operands. Hence, all + // operands must be named first in the use-def + // walk. - if (isDAG(f)) { - return {minCost(f, bbCost), maxCost(f, bbCost)}; - } else { - return {minCost(f, bbCost), numeric_limits::infinity()}; + // Collect operands. + for (auto& OP : I->operands()) { + if (auto* IOP = dyn_cast(OP)) { + // Walk down the use-def chain. + nameInstruction(IOP, Visited); + Operands.push_back(IOP->getName()); + } else if (isa(OP) && !isa(OP)) { + // This must be an immediate value. + std::string TextRepresentation; + raw_string_ostream Stream(TextRepresentation); + OP->printAsOperand(Stream, false); + Operands.push_back(StringRef(Stream.str())); + } } + + if (I->isCommutative()) + llvm::sort(Operands.begin(), Operands.end()); + + // Initialize to a magic constant, so the state isn't zero. + uint64_t Hash = MagicHashConstant; + + // Consider instruction opcode in the hash. + Hash = hashing::detail::hash_16_bytes(Hash, I->getOpcode()); + + // Operand opcodes for further sorting (commutative). + SmallVector OperandsOpcodes; + + // Collect operand opcodes for hashing. + for (auto& OP : I->operands()) + if (auto* IOP = dyn_cast(OP)) + OperandsOpcodes.push_back(IOP->getOpcode()); + + if (I->isCommutative()) + llvm::sort(OperandsOpcodes.begin(), OperandsOpcodes.end()); + + // Consider operand opcodes in the hash. + for (const int Code : OperandsOpcodes) Hash = hashing::detail::hash_16_bytes(Hash, Code); + + // Base instruction name. + SmallString<512> Name; + Name.append("op" + std::to_string(Hash).substr(0, 5)); + + // In case of CallInst, consider callee in the instruction name. + if (const auto* CI = dyn_cast(I)) + if (const Function* F = CI->getCalledFunction()) + Name.append(F->getName()); + + Name.append("("); + for (unsigned long i = 0; i < Operands.size(); ++i) { + Name.append(Operands[i]); + + if (i < Operands.size() - 1) + Name.append(", "); + } + Name.append(")"); + + if ((I->getName().empty() || RenameAll) && !I->getType()->isVoidTy()) + I->setName(Name); } -//------------------------------------------------------------------------------ -// Visitor functions, called to process the module -//------------------------------------------------------------------------------ -void visit(const Function& f, ostream& os) { - auto costs = getCost(f); - switch (outputFormat) { - case TXT: { - os << " Function: " << f.getName().str() << " "; - os << "min=" << costs.first << " "; - os << "max=" << costs.second << endl; - break; +/// Shortens instruction's name. This method removes called function name from +/// the instruction name and substitutes the call chain with a corresponding +/// list of operands. +/// +/// Examples: +/// op00000Callee(op00001Callee(...), vl00000Callee(1, 2), ...) -> +/// op00000(op00001, vl00000, ...) vl00000Callee(1, 2) -> vl00000(1, 2) +/// +/// This method omits output instructions and pre-output (instructions directly +/// used by an output instruction) instructions (by default). By default it also +/// does not affect user named instructions. +/// +/// \param I Instruction whose name will be folded. +void IRCanonicalizer::foldInstructionName(Instruction* I) { + // If this flag is raised, fold all regular + // instructions (including pre-outputs). + if (!FoldPreoutputs) { + // Don't fold if one of the users is an output instruction. + for (auto* U : I->users()) + if (auto* IU = dyn_cast(U)) + if (isOutput(IU)) + return; + } + + // Don't fold if it is an output instruction or has no op prefix. + if (isOutput(I) || I->getName().substr(0, 2) != "op") + return; + + // Instruction operands. + SmallVector, 4> Operands; + + for (auto& OP : I->operands()) { + if (const Instruction* IOP = dyn_cast(OP)) { + bool HasCanonicalName = + I->getName().substr(0, 2) == "op" || I->getName().substr(0, 2) == "vl"; + + Operands.push_back(HasCanonicalName ? IOP->getName().substr(0, 7) : IOP->getName()); } - case JSON: { - os << "{"; - os << "\"function\":\"" << f.getName().str() << "\","; - os << "\"min\":" << costs.first; - if (costs.second != numeric_limits::infinity()) { - os << ",\"max\":" << costs.second; + } + + if (I->isCommutative()) + llvm::sort(Operands.begin(), Operands.end()); + + SmallString<256> Name; + Name.append(I->getName().substr(0, 7)); + + Name.append("("); + for (unsigned long i = 0; i < Operands.size(); ++i) { + Name.append(Operands[i]); + + if (i < Operands.size() - 1) + Name.append(", "); + } + Name.append(")"); + + I->setName(Name); +} + +/// Reorders instructions by walking up the tree from each operand of an output +/// instruction and reducing the def-use distance. +/// This method assumes that output instructions were collected top-down, +/// otherwise the def-use chain may be broken. +/// This method is a wrapper for recursive reorderInstruction(). +/// +/// \see reorderInstruction() +/// \param Outputs Vector of pointers to output instructions collected top-down. +void IRCanonicalizer::reorderInstructions(SmallVector& Outputs) { + // This method assumes output instructions were collected top-down, + // otherwise the def-use chain may be broken. + + SmallPtrSet Visited; + + // Walk up the tree. + for (auto& I : Outputs) + for (auto& OP : I->operands()) + if (auto* IOP = dyn_cast(OP)) + reorderInstruction(IOP, I, Visited); +} + +/// Reduces def-use distance or places instruction at the end of the basic +/// block. Continues to walk up the def-use tree recursively. Used by +/// reorderInstructions(). +/// +/// \see reorderInstructions() +/// \param Used Pointer to the instruction whose value is used by the \p User. +/// \param User Pointer to the instruction which uses the \p Used. +/// \param Visited Set of visited instructions. +void IRCanonicalizer::reorderInstruction(Instruction* Used, Instruction* User, + SmallPtrSet& Visited) { + if (!Visited.count(Used)) { + Visited.insert(Used); + + if (!isa(Used) && !Used->isEHPad()) { + // Do not move PHI nodes and 'pad' instructions to ensure they are first + // in a basic block. Also do not move their operands before them. + + if (Used->getParent() == User->getParent()) { + // If Used and User share the same basic block move Used just before + // User. + Used->moveBefore(User); + } else { + // Otherwise move Used to the end of the basic block before the + // terminator. + Used->moveBefore(&Used->getParent()->back()); } - os << "}"; - break; - } - case CSV: { - os << f.getParent()->getName().str() << ","; - os << f.getName().str() << ","; - os << costs.first << ","; - if (costs.second != numeric_limits::infinity()) { - os << costs.second; + + for (auto& OP : Used->operands()) { + if (auto* IOP = dyn_cast(OP)) { + // Walk up the def-use tree. + reorderInstruction(IOP, Used, Visited); + } } - os << "\n"; - break; } } } -void visit(const Module& m, ostream& os) { - switch (outputFormat) { - case TXT: { - os << "Module: " << m.getName().str() << "\n"; - for (const auto& f : m.functions()) visit(f, os); - break; - } - case JSON: { - os << "{"; - os << "\"module\":\"" << m.getName().str() << "\","; - os << "\"functions\":["; - bool isFirst = true; - for (const auto& f : m.functions()) { - if (!isFirst) - os << ","; - else - isFirst = false; - visit(f, os); + +/// Reorders instruction's operands alphabetically. This method assumes +/// that passed instruction is commutative. Changing the operand order +/// in other instructions may change the semantics. +/// +/// \param I Instruction whose operands will be reordered. +void IRCanonicalizer::reorderInstructionOperandsByNames(Instruction* I) { + // This method assumes that passed I is commutative, + // changing the order of operands in other instructions + // may change the semantics. + + // Instruction operands for further sorting. + SmallVector, 4> Operands; + + // Collect operands. + for (auto& OP : I->operands()) { + if (auto* VOP = dyn_cast(OP)) { + if (isa(VOP)) { + // This is an an instruction. + Operands.push_back(std::pair(VOP->getName(), VOP)); + } else { + std::string TextRepresentation; + raw_string_ostream Stream(TextRepresentation); + OP->printAsOperand(Stream, false); + Operands.push_back(std::pair(Stream.str(), VOP)); } - os << "]}"; - break; - } - case CSV: { - for (const auto& f : m.functions()) visit(f, os); - break; } } + + // Sort operands. + llvm::sort(Operands.begin(), Operands.end(), llvm::less_first()); + + // Reorder operands. + unsigned Position = 0; + for (auto& OP : I->operands()) { + OP.set(Operands[Position].second); + Position++; + } +} + +/// Reorders PHI node's values according to the names of corresponding basic +/// blocks. +/// +/// \param PN PHI node to canonicalize. +void IRCanonicalizer::reorderPHIIncomingValues(PHINode* PN) { + // Values for further sorting. + SmallVector, 2> Values; + + // Collect blocks and corresponding values. + for (auto& BB : PN->blocks()) { + Value* V = PN->getIncomingValueForBlock(BB); + Values.push_back(std::pair(V, BB)); + } + + // Sort values according to the name of a basic block. + llvm::sort(Values, [](const std::pair& LHS, + const std::pair& RHS) { + return LHS.second->getName() < RHS.second->getName(); + }); + + // Swap. + for (unsigned i = 0; i < Values.size(); ++i) { + PN->setIncomingBlock(i, Values[i].second); + PN->setIncomingValue(i, Values[i].first); + } } -void visit(const string& filename, ostream& os) { - // Parse the IR file passed on the command line. - SMDiagnostic err; - LLVMContext ctx; - unique_ptr m = parseIRFile(filename, err, ctx); - if (!m) - throw err; +/// Returns a vector of output instructions. An output is an instruction which +/// has side-effects or is a terminator instruction. Uses isOutput(). +/// +/// \see isOutput() +/// \param F Function to collect outputs from. +SmallVector IRCanonicalizer::collectOutputInstructions(Function& F) { + // Output instructions are collected top-down in each function, + // any change may break the def-use chain in reordering methods. + SmallVector Outputs; + + for (auto& I : instructions(F)) + if (isOutput(&I)) + Outputs.push_back(&I); - // Run the analysis and print the results - visit(*m, os); + return Outputs; } -void visit(const vector& filenames, ostream& os) { - switch (outputFormat) { - case TXT: { - for (const auto& fn : filenames) visit(fn, os); - break; - } - case JSON: { - os << "["; - bool isFirst = true; - for (const auto& fn : filenames) { - if (!isFirst) - os << ","; - else - isFirst = false; - visit(fn, os); + +/// Helper method checking whether the instruction may have side effects or is +/// a terminator instruction. +/// +/// \param I Considered instruction. +bool IRCanonicalizer::isOutput(const Instruction* I) { + // Outputs are such instructions which may have side effects or are a + // terminator. + if (I->mayHaveSideEffects() || I->isTerminator()) + return true; + + return false; +} + +/// Helper method checking whether the instruction has users and only +/// immediate operands. +/// +/// \param I Considered instruction. +bool IRCanonicalizer::isInitialInstruction(const Instruction* I) { + // Initial instructions are such instructions whose values are used by + // other instructions, yet they only depend on immediate values. + return !I->user_empty() && hasOnlyImmediateOperands(I); +} + +/// Helper method checking whether the instruction has only immediate operands. +/// +/// \param I Considered instruction. +bool IRCanonicalizer::hasOnlyImmediateOperands(const Instruction* I) { + for (const auto& OP : I->operands()) + if (isa(OP)) + return false; // Found non-immediate operand (instruction). + + return true; +} + +/// Helper method returning indices (distance from the beginning of the basic +/// block) of outputs using the \p I (eliminates repetitions). Walks down the +/// def-use tree recursively. +/// +/// \param I Considered instruction. +/// \param Visited Set of visited instructions. +SetVector IRCanonicalizer::getOutputFootprint(Instruction* I, + SmallPtrSet& Visited) { + // Vector containing indexes of outputs (no repetitions), + // which use I in the order of walking down the def-use tree. + SetVector Outputs; + + if (!Visited.count(I)) { + Visited.insert(I); + + if (isOutput(I)) { + // Gets output instruction's parent function. + Function* Func = I->getParent()->getParent(); + + // Finds and inserts the index of the output to the vector. + unsigned Count = 0; + for (const auto& B : *Func) { + for (const auto& E : B) { + if (&E == I) + Outputs.insert(Count); + Count++; + } } - os << "]\n"; - break; + + // Returns to the used instruction. + return Outputs; } - case CSV: { - os << "Module, Function, DAG, Min, Max\n"; - for (const auto& fn : filenames) visit(fn, os); - break; + + for (auto* U : I->users()) { + if (auto* UI = dyn_cast(U)) { + // Vector for outputs which use UI. + SetVector OutputsUsingUI = getOutputFootprint(UI, Visited); + + // Insert the indexes of outputs using UI. + Outputs.insert(OutputsUsingUI.begin(), OutputsUsingUI.end()); + } } } + + // Return to the used instruction. + return Outputs; +} + +/// Reads a module from a file. +/// On error, messages are written to stderr and null is returned. +/// +/// \param Context LLVM Context for the module. +/// \param Name Input file name. +static std::unique_ptr readModule(LLVMContext& Context, StringRef Name) { + SMDiagnostic Diag; + std::unique_ptr Module = parseIRFile(Name, Diag, Context); + + if (!Module) + Diag.print("llvm-canon", errs()); + + return Module; } -//------------------------------------------------------------------------------ -// Driver -//------------------------------------------------------------------------------ + +/// Input LLVM module file name. +cl::opt InputFilename("f", cl::desc("Specify input filename"), + cl::value_desc("filename"), cl::Required); +/// Output LLVM module file name. +cl::opt OutputFilename("o", cl::desc("Specify output filename"), + cl::value_desc("filename"), cl::Required); + +/// \name Canonicalizer flags. +/// @{ +/// Preserves original order of instructions. +cl::opt PreserveOrder("preserve-order", cl::desc("Preserves original instruction order")); +/// Renames all instructions (including user-named). +cl::opt RenameAll("rename-all", cl::desc("Renames all instructions (including user-named)")); +/// Folds all regular instructions (including pre-outputs). +cl::opt FoldPreoutputs("fold-all", + cl::desc("Folds all regular instructions (including pre-outputs)")); +/// Sorts and reorders operands in commutative instructions. +cl::opt ReorderOperands("reorder-operands", + cl::desc("Sorts and reorders operands in commutative instructions")); +/// @} + int main(int argc, char** argv) { - // Hide all options apart from the ones specific to this tool - cl::HideUnrelatedOptions(bwcetCategory); - - cl::ParseCommandLineOptions( - argc, argv, - "Estimates the best and worst case runtime for each function the input IR file\n"); - - try { - // Get the output file - unique_ptr ofs(outputFilename == "-" ? nullptr : new ofstream(outputFilename.c_str())); - if (ofs && !ofs->good()) { - throw "Error opening output file: " + outputFilename; - } - ostream& os = ofs ? *ofs : cout; + cl::ParseCommandLineOptions(argc, argv, + " LLVM-Canon\n\n" + " This tool aims to transform LLVM Modules into canonical form by" + " reordering and renaming instructions while preserving the same" + " semantics. Making it easier to spot semantic differences while" + " diffing two modules which have undergone different passes.\n"); + + LLVMContext Context; + + std::unique_ptr Module = readModule(Context, InputFilename); + + if (!Module) + return 1; - // Makes sure llvm_shutdown() is called (which cleans up LLVM objects) - // http://llvm.org/docs/ProgrammersManual.html#ending-execution-with-llvm-shutdown - llvm_shutdown_obj shutdown_obj; + IRCanonicalizer Canonicalizer(PreserveOrder, RenameAll, FoldPreoutputs, ReorderOperands); - // Do the work - visit(inputFiles, os); + for (auto& Function : *Module) { + Canonicalizer.runOnFunction(Function); + } + + if (verifyModule(*Module, &errs())) + return 1; - } catch (string e) { - errs() << e; - return -1; - } catch (SMDiagnostic e) { - e.print(argv[0], errs(), false); - return -1; + std::error_code EC; + raw_fd_ostream OutputStream(OutputFilename, EC, sys::fs::OF_None); + + if (EC) { + errs() << EC.message(); + return 1; } + + Module->print(OutputStream, nullptr, false); + OutputStream.close(); return 0; } From 90dacf4db9ac4d7e5c1ec520ad3cea62f6d861d9 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 09:48:23 -0400 Subject: [PATCH 159/254] clean up code --- .../loop_unroller/IRCanonicalizer.h | 67 --- .../loop_unroller/loop_unroller.cc | 568 +----------------- 2 files changed, 14 insertions(+), 621 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h b/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h index a4e14b517..a3c0aba09 100644 --- a/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h +++ b/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h @@ -8,70 +8,3 @@ #include "llvm/Pass.h" /// IRCanonicalizer aims to transform LLVM IR into canonical form. -class IRCanonicalizer : public llvm::FunctionPass { - public: - static char ID; - - /// Constructor for the IRCanonicalizer. - /// - /// \param PreserveOrder Preserves original order of instructions. - /// \param RenameAll Renames all instructions (including user-named). - /// \param FoldPreoutputs Folds all regular instructions (including pre-outputs). - /// \param ReorderOperands Sorts and reorders operands in commutative instructions. - IRCanonicalizer(bool PreserveOrder, bool RenameAll, bool FoldPreoutputs, bool ReorderOperands) - : FunctionPass(ID), - PreserveOrder(PreserveOrder), - RenameAll(RenameAll), - FoldPreoutputs(FoldPreoutputs), - ReorderOperands(ReorderOperands) {} - - bool runOnFunction(llvm::Function& F) override; - - private: - // Random constant for hashing, so the state isn't zero. - const uint64_t MagicHashConstant = 0x6acaa36bef8325c5ULL; - - /// \name Canonicalizer flags. - /// @{ - /// Preserves original order of instructions. - bool PreserveOrder; - /// Renames all instructions (including user-named). - bool RenameAll; - /// Folds all regular instructions (including pre-outputs). - bool FoldPreoutputs; - /// Sorts and reorders operands in commutative instructions. - bool ReorderOperands; - /// @} - - /// \name Naming. - /// @{ - void nameFunctionArguments(llvm::Function& F); - void nameBasicBlocks(llvm::Function& F); - void nameInstructions(llvm::SmallVector& Outputs); - void nameInstruction(llvm::Instruction* I, - llvm::SmallPtrSet& Visited); - void nameAsInitialInstruction(llvm::Instruction* I); - void nameAsRegularInstruction(llvm::Instruction* I, - llvm::SmallPtrSet& Visited); - void foldInstructionName(llvm::Instruction* I); - /// @} - - /// \name Reordering. - /// @{ - void reorderInstructions(llvm::SmallVector& Outputs); - void reorderInstruction(llvm::Instruction* Used, llvm::Instruction* User, - llvm::SmallPtrSet& Visited); - void reorderInstructionOperandsByNames(llvm::Instruction* I); - void reorderPHIIncomingValues(llvm::PHINode* PN); - /// @} - - /// \name Utility methods. - /// @{ - llvm::SmallVector collectOutputInstructions(llvm::Function& F); - bool isOutput(const llvm::Instruction* I); - bool isInitialInstruction(const llvm::Instruction* I); - bool hasOnlyImmediateOperands(const llvm::Instruction* I); - llvm::SetVector getOutputFootprint(llvm::Instruction* I, - llvm::SmallPtrSet& Visited); - /// @} -}; diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 0014da795..ef3879897 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -19,545 +19,21 @@ using namespace llvm; -char IRCanonicalizer::ID = 0; - -/// Entry method to the IRCanonicalizer. -/// -/// \param M Module to canonicalize. -bool IRCanonicalizer::runOnFunction(Function& F) { - nameFunctionArguments(F); - nameBasicBlocks(F); - - SmallVector Outputs = collectOutputInstructions(F); - - if (!PreserveOrder) - reorderInstructions(Outputs); - - nameInstructions(Outputs); - - for (auto& I : instructions(F)) { - if (!PreserveOrder) { - if (ReorderOperands && I.isCommutative()) - reorderInstructionOperandsByNames(&I); - - if (auto* PN = dyn_cast(&I)) - reorderPHIIncomingValues(PN); - } - - foldInstructionName(&I); - } - - return true; -} - -/// Numbers arguments. -/// -/// \param F Function whose arguments will be renamed. -void IRCanonicalizer::nameFunctionArguments(Function& F) { - int ArgumentCounter = 0; - for (auto& A : F.args()) { - if (RenameAll || A.getName().empty()) { - A.setName("a" + Twine(ArgumentCounter)); - ++ArgumentCounter; - } - } -} - -/// Names basic blocks using a generated hash for each basic block in -/// a function considering the opcode and the order of output instructions. -/// -/// \param F Function containing basic blocks to rename. -void IRCanonicalizer::nameBasicBlocks(Function& F) { - for (auto& B : F) { - // Initialize to a magic constant, so the state isn't zero. - uint64_t Hash = MagicHashConstant; - - // Hash considering output instruction opcodes. - for (auto& I : B) - if (isOutput(&I)) - Hash = hashing::detail::hash_16_bytes(Hash, I.getOpcode()); - - if (RenameAll || B.getName().empty()) { - // Name basic block. Substring hash to make diffs more readable. - B.setName("bb" + std::to_string(Hash).substr(0, 5)); - } - } -} - -/// Names instructions graphically. -/// This method is a wrapper for recursive nameInstruction(). -/// -/// \see nameInstruction() -/// \param Outputs Vector of pointers to output instructions collected top-down. -void IRCanonicalizer::nameInstructions(SmallVector& Outputs) { - // Keeping track of visited instructions while naming (even depth first) is - // necessary only to avoid infinite loops on PHI nodes. - SmallPtrSet Visited; - - for (auto& I : Outputs) nameInstruction(I, Visited); -} - -/// Names instructions graphically (recursive) in accordance with the -/// def-use tree, starting from the initial instructions (defs), finishing at -/// the output (top-most user) instructions (depth-first). -/// -/// \param I Instruction to be renamed. -void IRCanonicalizer::nameInstruction(Instruction* I, - SmallPtrSet& Visited) { - // Keeping track of visited instructions while naming (even depth first) is - // necessary only to avoid infinite loops on PHI nodes. - if (!Visited.count(I)) { - Visited.insert(I); - - // Determine the type of instruction to name. - if (isInitialInstruction(I)) { - // This is an initial instruction. - nameAsInitialInstruction(I); - } else { - // This must be a regular instruction. - nameAsRegularInstruction(I, Visited); - } - } -} - -/// Names instruction following the scheme: -/// vl00000Callee(Operands) -/// -/// Where 00000 is a hash calculated considering instruction's opcode and output -/// footprint. Callee's name is only included when instruction's type is -/// CallInst. In cases where instruction is commutative, operands list is also -/// sorted. -/// -/// Renames instruction only when RenameAll flag is raised or instruction is -/// unnamed. -/// -/// \see getOutputFootprint() -/// \param I Instruction to be renamed. -void IRCanonicalizer::nameAsInitialInstruction(Instruction* I) { - if (I->getType()->isVoidTy() || (!I->getName().empty() && !RenameAll)) - return; - - // Instruction operands for further sorting. - SmallVector, 4> Operands; - - // Collect operands. - for (auto& OP : I->operands()) { - if (!isa(OP)) { - std::string TextRepresentation; - raw_string_ostream Stream(TextRepresentation); - OP->printAsOperand(Stream, false); - Operands.push_back(StringRef(Stream.str())); - } - } - - if (I->isCommutative()) - llvm::sort(Operands); - - // Initialize to a magic constant, so the state isn't zero. - uint64_t Hash = MagicHashConstant; - - // Consider instruction's opcode in the hash. - Hash = hashing::detail::hash_16_bytes(Hash, I->getOpcode()); - - SmallPtrSet Visited; - // Get output footprint for I. - SetVector OutputFootprint = getOutputFootprint(I, Visited); - - // Consider output footprint in the hash. - for (const int& Output : OutputFootprint) Hash = hashing::detail::hash_16_bytes(Hash, Output); - - // Base instruction name. - SmallString<256> Name; - Name.append("vl" + std::to_string(Hash).substr(0, 5)); - - // In case of CallInst, consider callee in the instruction name. - if (const auto* CI = dyn_cast(I)) { - Function* F = CI->getCalledFunction(); - - if (F != nullptr) { - Name.append(F->getName()); - } - } - - Name.append("("); - for (unsigned long i = 0; i < Operands.size(); ++i) { - Name.append(Operands[i]); - - if (i < Operands.size() - 1) - Name.append(", "); - } - Name.append(")"); - - I->setName(Name); -} - -/// Names instruction following the scheme: -/// op00000Callee(Operands) -/// -/// Where 00000 is a hash calculated considering instruction's opcode, its -/// operands' opcodes and order. Callee's name is only included when -/// instruction's type is CallInst. In cases where instruction is commutative, -/// operand list is also sorted. -/// -/// Names instructions recursively in accordance with the def-use tree, -/// starting from the initial instructions (defs), finishing at -/// the output (top-most user) instructions (depth-first). -/// -/// Renames instruction only when RenameAll flag is raised or instruction is -/// unnamed. -/// -/// \see getOutputFootprint() -/// \param I Instruction to be renamed. -void IRCanonicalizer::nameAsRegularInstruction(Instruction* I, - SmallPtrSet& Visited) { - // Instruction operands for further sorting. - SmallVector, 4> Operands; - - // The name of a regular instruction depends - // on the names of its operands. Hence, all - // operands must be named first in the use-def - // walk. - - // Collect operands. - for (auto& OP : I->operands()) { - if (auto* IOP = dyn_cast(OP)) { - // Walk down the use-def chain. - nameInstruction(IOP, Visited); - Operands.push_back(IOP->getName()); - } else if (isa(OP) && !isa(OP)) { - // This must be an immediate value. - std::string TextRepresentation; - raw_string_ostream Stream(TextRepresentation); - OP->printAsOperand(Stream, false); - Operands.push_back(StringRef(Stream.str())); - } - } - - if (I->isCommutative()) - llvm::sort(Operands.begin(), Operands.end()); - - // Initialize to a magic constant, so the state isn't zero. - uint64_t Hash = MagicHashConstant; - - // Consider instruction opcode in the hash. - Hash = hashing::detail::hash_16_bytes(Hash, I->getOpcode()); - - // Operand opcodes for further sorting (commutative). - SmallVector OperandsOpcodes; - - // Collect operand opcodes for hashing. - for (auto& OP : I->operands()) - if (auto* IOP = dyn_cast(OP)) - OperandsOpcodes.push_back(IOP->getOpcode()); - - if (I->isCommutative()) - llvm::sort(OperandsOpcodes.begin(), OperandsOpcodes.end()); - - // Consider operand opcodes in the hash. - for (const int Code : OperandsOpcodes) Hash = hashing::detail::hash_16_bytes(Hash, Code); - - // Base instruction name. - SmallString<512> Name; - Name.append("op" + std::to_string(Hash).substr(0, 5)); - - // In case of CallInst, consider callee in the instruction name. - if (const auto* CI = dyn_cast(I)) - if (const Function* F = CI->getCalledFunction()) - Name.append(F->getName()); - - Name.append("("); - for (unsigned long i = 0; i < Operands.size(); ++i) { - Name.append(Operands[i]); - - if (i < Operands.size() - 1) - Name.append(", "); - } - Name.append(")"); +class IRCanonicalizer : public llvm::FunctionPass { + public: + static char ID; - if ((I->getName().empty() || RenameAll) && !I->getType()->isVoidTy()) - I->setName(Name); -} - -/// Shortens instruction's name. This method removes called function name from -/// the instruction name and substitutes the call chain with a corresponding -/// list of operands. -/// -/// Examples: -/// op00000Callee(op00001Callee(...), vl00000Callee(1, 2), ...) -> -/// op00000(op00001, vl00000, ...) vl00000Callee(1, 2) -> vl00000(1, 2) -/// -/// This method omits output instructions and pre-output (instructions directly -/// used by an output instruction) instructions (by default). By default it also -/// does not affect user named instructions. -/// -/// \param I Instruction whose name will be folded. -void IRCanonicalizer::foldInstructionName(Instruction* I) { - // If this flag is raised, fold all regular - // instructions (including pre-outputs). - if (!FoldPreoutputs) { - // Don't fold if one of the users is an output instruction. - for (auto* U : I->users()) - if (auto* IU = dyn_cast(U)) - if (isOutput(IU)) - return; - } - - // Don't fold if it is an output instruction or has no op prefix. - if (isOutput(I) || I->getName().substr(0, 2) != "op") - return; - - // Instruction operands. - SmallVector, 4> Operands; - - for (auto& OP : I->operands()) { - if (const Instruction* IOP = dyn_cast(OP)) { - bool HasCanonicalName = - I->getName().substr(0, 2) == "op" || I->getName().substr(0, 2) == "vl"; - - Operands.push_back(HasCanonicalName ? IOP->getName().substr(0, 7) : IOP->getName()); - } - } - - if (I->isCommutative()) - llvm::sort(Operands.begin(), Operands.end()); - - SmallString<256> Name; - Name.append(I->getName().substr(0, 7)); - - Name.append("("); - for (unsigned long i = 0; i < Operands.size(); ++i) { - Name.append(Operands[i]); - - if (i < Operands.size() - 1) - Name.append(", "); - } - Name.append(")"); - - I->setName(Name); -} - -/// Reorders instructions by walking up the tree from each operand of an output -/// instruction and reducing the def-use distance. -/// This method assumes that output instructions were collected top-down, -/// otherwise the def-use chain may be broken. -/// This method is a wrapper for recursive reorderInstruction(). -/// -/// \see reorderInstruction() -/// \param Outputs Vector of pointers to output instructions collected top-down. -void IRCanonicalizer::reorderInstructions(SmallVector& Outputs) { - // This method assumes output instructions were collected top-down, - // otherwise the def-use chain may be broken. - - SmallPtrSet Visited; - - // Walk up the tree. - for (auto& I : Outputs) - for (auto& OP : I->operands()) - if (auto* IOP = dyn_cast(OP)) - reorderInstruction(IOP, I, Visited); -} - -/// Reduces def-use distance or places instruction at the end of the basic -/// block. Continues to walk up the def-use tree recursively. Used by -/// reorderInstructions(). -/// -/// \see reorderInstructions() -/// \param Used Pointer to the instruction whose value is used by the \p User. -/// \param User Pointer to the instruction which uses the \p Used. -/// \param Visited Set of visited instructions. -void IRCanonicalizer::reorderInstruction(Instruction* Used, Instruction* User, - SmallPtrSet& Visited) { - if (!Visited.count(Used)) { - Visited.insert(Used); - - if (!isa(Used) && !Used->isEHPad()) { - // Do not move PHI nodes and 'pad' instructions to ensure they are first - // in a basic block. Also do not move their operands before them. - - if (Used->getParent() == User->getParent()) { - // If Used and User share the same basic block move Used just before - // User. - Used->moveBefore(User); - } else { - // Otherwise move Used to the end of the basic block before the - // terminator. - Used->moveBefore(&Used->getParent()->back()); - } - - for (auto& OP : Used->operands()) { - if (auto* IOP = dyn_cast(OP)) { - // Walk up the def-use tree. - reorderInstruction(IOP, Used, Visited); - } - } - } - } -} - -/// Reorders instruction's operands alphabetically. This method assumes -/// that passed instruction is commutative. Changing the operand order -/// in other instructions may change the semantics. -/// -/// \param I Instruction whose operands will be reordered. -void IRCanonicalizer::reorderInstructionOperandsByNames(Instruction* I) { - // This method assumes that passed I is commutative, - // changing the order of operands in other instructions - // may change the semantics. - - // Instruction operands for further sorting. - SmallVector, 4> Operands; - - // Collect operands. - for (auto& OP : I->operands()) { - if (auto* VOP = dyn_cast(OP)) { - if (isa(VOP)) { - // This is an an instruction. - Operands.push_back(std::pair(VOP->getName(), VOP)); - } else { - std::string TextRepresentation; - raw_string_ostream Stream(TextRepresentation); - OP->printAsOperand(Stream, false); - Operands.push_back(std::pair(Stream.str(), VOP)); - } - } - } - - // Sort operands. - llvm::sort(Operands.begin(), Operands.end(), llvm::less_first()); - - // Reorder operands. - unsigned Position = 0; - for (auto& OP : I->operands()) { - OP.set(Operands[Position].second); - Position++; - } -} - -/// Reorders PHI node's values according to the names of corresponding basic -/// blocks. -/// -/// \param PN PHI node to canonicalize. -void IRCanonicalizer::reorderPHIIncomingValues(PHINode* PN) { - // Values for further sorting. - SmallVector, 2> Values; - - // Collect blocks and corresponding values. - for (auto& BB : PN->blocks()) { - Value* V = PN->getIncomingValueForBlock(BB); - Values.push_back(std::pair(V, BB)); - } + IRCanonicalizer() : FunctionPass(ID) {} - // Sort values according to the name of a basic block. - llvm::sort(Values, [](const std::pair& LHS, - const std::pair& RHS) { - return LHS.second->getName() < RHS.second->getName(); - }); + bool runOnFunction(llvm::Function& F) override; +}; - // Swap. - for (unsigned i = 0; i < Values.size(); ++i) { - PN->setIncomingBlock(i, Values[i].second); - PN->setIncomingValue(i, Values[i].first); - } -} - -/// Returns a vector of output instructions. An output is an instruction which -/// has side-effects or is a terminator instruction. Uses isOutput(). -/// -/// \see isOutput() -/// \param F Function to collect outputs from. -SmallVector IRCanonicalizer::collectOutputInstructions(Function& F) { - // Output instructions are collected top-down in each function, - // any change may break the def-use chain in reordering methods. - SmallVector Outputs; - - for (auto& I : instructions(F)) - if (isOutput(&I)) - Outputs.push_back(&I); - - return Outputs; -} - -/// Helper method checking whether the instruction may have side effects or is -/// a terminator instruction. -/// -/// \param I Considered instruction. -bool IRCanonicalizer::isOutput(const Instruction* I) { - // Outputs are such instructions which may have side effects or are a - // terminator. - if (I->mayHaveSideEffects() || I->isTerminator()) - return true; - - return false; -} - -/// Helper method checking whether the instruction has users and only -/// immediate operands. -/// -/// \param I Considered instruction. -bool IRCanonicalizer::isInitialInstruction(const Instruction* I) { - // Initial instructions are such instructions whose values are used by - // other instructions, yet they only depend on immediate values. - return !I->user_empty() && hasOnlyImmediateOperands(I); -} - -/// Helper method checking whether the instruction has only immediate operands. -/// -/// \param I Considered instruction. -bool IRCanonicalizer::hasOnlyImmediateOperands(const Instruction* I) { - for (const auto& OP : I->operands()) - if (isa(OP)) - return false; // Found non-immediate operand (instruction). - - return true; -} +char IRCanonicalizer::ID = 0; -/// Helper method returning indices (distance from the beginning of the basic -/// block) of outputs using the \p I (eliminates repetitions). Walks down the -/// def-use tree recursively. +/// Entry method to the IRCanonicalizer. /// -/// \param I Considered instruction. -/// \param Visited Set of visited instructions. -SetVector IRCanonicalizer::getOutputFootprint(Instruction* I, - SmallPtrSet& Visited) { - // Vector containing indexes of outputs (no repetitions), - // which use I in the order of walking down the def-use tree. - SetVector Outputs; - - if (!Visited.count(I)) { - Visited.insert(I); - - if (isOutput(I)) { - // Gets output instruction's parent function. - Function* Func = I->getParent()->getParent(); - - // Finds and inserts the index of the output to the vector. - unsigned Count = 0; - for (const auto& B : *Func) { - for (const auto& E : B) { - if (&E == I) - Outputs.insert(Count); - Count++; - } - } - - // Returns to the used instruction. - return Outputs; - } - - for (auto* U : I->users()) { - if (auto* UI = dyn_cast(U)) { - // Vector for outputs which use UI. - SetVector OutputsUsingUI = getOutputFootprint(UI, Visited); - - // Insert the indexes of outputs using UI. - Outputs.insert(OutputsUsingUI.begin(), OutputsUsingUI.end()); - } - } - } - - // Return to the used instruction. - return Outputs; -} +/// \param M Module to canonicalize. +bool IRCanonicalizer::runOnFunction(Function& F) { return true; } /// Reads a module from a file. /// On error, messages are written to stderr and null is returned. @@ -581,27 +57,11 @@ cl::opt InputFilename("f", cl::desc("Specify input filename"), cl::opt OutputFilename("o", cl::desc("Specify output filename"), cl::value_desc("filename"), cl::Required); -/// \name Canonicalizer flags. -/// @{ -/// Preserves original order of instructions. -cl::opt PreserveOrder("preserve-order", cl::desc("Preserves original instruction order")); -/// Renames all instructions (including user-named). -cl::opt RenameAll("rename-all", cl::desc("Renames all instructions (including user-named)")); -/// Folds all regular instructions (including pre-outputs). -cl::opt FoldPreoutputs("fold-all", - cl::desc("Folds all regular instructions (including pre-outputs)")); -/// Sorts and reorders operands in commutative instructions. -cl::opt ReorderOperands("reorder-operands", - cl::desc("Sorts and reorders operands in commutative instructions")); -/// @} - int main(int argc, char** argv) { cl::ParseCommandLineOptions(argc, argv, - " LLVM-Canon\n\n" - " This tool aims to transform LLVM Modules into canonical form by" - " reordering and renaming instructions while preserving the same" - " semantics. Making it easier to spot semantic differences while" - " diffing two modules which have undergone different passes.\n"); + " LLVM-Unroller\n\n" + " This tool aims to give users fine grain control on which loops to " + "unroll and by which factor.\n"); LLVMContext Context; @@ -610,7 +70,7 @@ int main(int argc, char** argv) { if (!Module) return 1; - IRCanonicalizer Canonicalizer(PreserveOrder, RenameAll, FoldPreoutputs, ReorderOperands); + IRCanonicalizer Canonicalizer; for (auto& Function : *Module) { Canonicalizer.runOnFunction(Function); From 0ed07866d93a4bee30efb2490bca4015f4488ad2 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 09:51:03 -0400 Subject: [PATCH 160/254] remove header file --- examples/example_unrolling_service/loop_unroller/BUILD | 1 - .../loop_unroller/IRCanonicalizer.h | 10 ---------- .../loop_unroller/loop_unroller.cc | 1 - 3 files changed, 12 deletions(-) delete mode 100644 examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h diff --git a/examples/example_unrolling_service/loop_unroller/BUILD b/examples/example_unrolling_service/loop_unroller/BUILD index 52c8aa580..3bec18c35 100644 --- a/examples/example_unrolling_service/loop_unroller/BUILD +++ b/examples/example_unrolling_service/loop_unroller/BUILD @@ -9,7 +9,6 @@ load("@rules_cc//cc:defs.bzl", "cc_binary") cc_binary( name = "loop_unroller", srcs = [ - "IRCanonicalizer.h", "loop_unroller.cc", ], copts = [ diff --git a/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h b/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h deleted file mode 100644 index a3c0aba09..000000000 --- a/examples/example_unrolling_service/loop_unroller/IRCanonicalizer.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "llvm/ADT/SetVector.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/IR/Function.h" -#include "llvm/IR/Module.h" -#include "llvm/Pass.h" - -/// IRCanonicalizer aims to transform LLVM IR into canonical form. diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index ef3879897..bffa35f51 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -1,7 +1,6 @@ #include #include -#include "IRCanonicalizer.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" From 2098b5e30267e57bd1640f018d56720b8328a83d Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 09:53:25 -0400 Subject: [PATCH 161/254] change name --- .../loop_unroller/loop_unroller.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index bffa35f51..649cf1ddb 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -18,21 +18,21 @@ using namespace llvm; -class IRCanonicalizer : public llvm::FunctionPass { +class LoopUnroller : public llvm::FunctionPass { public: static char ID; - IRCanonicalizer() : FunctionPass(ID) {} + LoopUnroller() : FunctionPass(ID) {} bool runOnFunction(llvm::Function& F) override; }; -char IRCanonicalizer::ID = 0; +char LoopUnroller::ID = 0; -/// Entry method to the IRCanonicalizer. +/// Entry method to the LoopUnroller. /// /// \param M Module to canonicalize. -bool IRCanonicalizer::runOnFunction(Function& F) { return true; } +bool LoopUnroller::runOnFunction(Function& F) { return true; } /// Reads a module from a file. /// On error, messages are written to stderr and null is returned. @@ -69,7 +69,7 @@ int main(int argc, char** argv) { if (!Module) return 1; - IRCanonicalizer Canonicalizer; + LoopUnroller Canonicalizer; for (auto& Function : *Module) { Canonicalizer.runOnFunction(Function); From 3e184ce0864b78158af623e2195a7c31b76bc2c6 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 10:14:33 -0400 Subject: [PATCH 162/254] everything in class declaration --- .../loop_unroller/loop_unroller.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 649cf1ddb..ce9e42929 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -24,16 +24,11 @@ class LoopUnroller : public llvm::FunctionPass { LoopUnroller() : FunctionPass(ID) {} - bool runOnFunction(llvm::Function& F) override; + bool runOnFunction(llvm::Function& F) override { return true; } }; char LoopUnroller::ID = 0; -/// Entry method to the LoopUnroller. -/// -/// \param M Module to canonicalize. -bool LoopUnroller::runOnFunction(Function& F) { return true; } - /// Reads a module from a file. /// On error, messages are written to stderr and null is returned. /// From 295a5ab936eb3c639d9280afa13800f835b601cb Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 10:30:41 -0400 Subject: [PATCH 163/254] start couning number of loops --- .../loop_unroller/loop_unroller.cc | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index ce9e42929..279235e1e 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -4,6 +4,7 @@ #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Analysis/LoopInfo.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" @@ -13,18 +14,39 @@ #include "llvm/IRReader/IRReader.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" using namespace llvm; +#define DEBUG_TYPE "LoopUnroller" -class LoopUnroller : public llvm::FunctionPass { +class LoopUnroller : public llvm::ModulePass { public: static char ID; - LoopUnroller() : FunctionPass(ID) {} + LoopUnroller() : ModulePass(ID) {} + + bool runOnModule(llvm::Module& M) override { + loopcounter = 0; + for (auto IT = M.begin(), END = M.end(); IT != END; ++IT) { + LoopInfo& LI = getAnalysis(*IT); + for (LoopInfo::iterator LIT = LI.begin(), LEND = LI.end(); LIT != LEND; ++LIT) { + handleLoop(*LIT); + } + } + LLVM_DEBUG(dbgs() << "Found " << loopcounter << " loops.\n"); + return false; + } - bool runOnFunction(llvm::Function& F) override { return true; } + private: + int loopcounter = 0; + void handleLoop(Loop* L) { + ++loopcounter; + for (Loop* SL : L->getSubLoops()) { + handleLoop(SL); + } + } }; char LoopUnroller::ID = 0; @@ -66,9 +88,10 @@ int main(int argc, char** argv) { LoopUnroller Canonicalizer; - for (auto& Function : *Module) { - Canonicalizer.runOnFunction(Function); - } + Canonicalizer.runOnModule(*Module); + // for (auto& Function : *Module) { + // Canonicalizer.runOnFunction(Function); + // } if (verifyModule(*Module, &errs())) return 1; From c6d27748a835b8000c9e5111e8d43782354c559d Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 11:04:18 -0400 Subject: [PATCH 164/254] show 2 methods to count number of loops --- .../loop_unroller/loop_unroller.cc | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 279235e1e..3bdb811f1 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -21,6 +21,11 @@ using namespace llvm; #define DEBUG_TYPE "LoopUnroller" +#define METHOD 1 + +#if (METHOD == 1) +// obtained from https://stackoverflow.com/a/33565910/3880948 +// Error: error: no member named 'ID' in 'llvm::LoopInfo' class LoopUnroller : public llvm::ModulePass { public: static char ID; @@ -48,6 +53,35 @@ class LoopUnroller : public llvm::ModulePass { } } }; +#elif (METHOD == 2) +// based on advice from https://stackoverflow.com/a/30353625/3880948 +// Error message: Assertion failed: (Resolver && "Pass has not been inserted into a PassManager +// object!"), function getAnalysis, file +// external/clang-llvm-10.0.0-x86_64-apple-darwin/include/llvm/PassAnalysisSupport.h, line 221. +class LoopUnroller : public llvm::FunctionPass { + public: + static char ID; + + LoopUnroller() : FunctionPass(ID) {} + + virtual void getAnalysisUsage(AnalysisUsage& AU) const { AU.addRequired(); } + + bool runOnFunction(llvm::Function& F) override { + loopcounter = 0; + LoopInfo& LI = getAnalysis().getLoopInfo(); + for (BasicBlock& BB : F) { + Loop* L = LI.getLoopFor(&BB); + if (L) // if not null + loopcounter++; + } + LLVM_DEBUG(dbgs() << "Found " << loopcounter << " loops.\n"); + return false; + } + + private: + int loopcounter = 0; +}; +#endif // METHOD char LoopUnroller::ID = 0; @@ -88,10 +122,13 @@ int main(int argc, char** argv) { LoopUnroller Canonicalizer; +#if (METHOD == 1) Canonicalizer.runOnModule(*Module); - // for (auto& Function : *Module) { - // Canonicalizer.runOnFunction(Function); - // } +#elif (METHOD == 2) + for (auto& Function : *Module) { + Canonicalizer.runOnFunction(Function); + } +#endif if (verifyModule(*Module, &errs())) return 1; From d1d0bd8db2ee8c98c463303aa8e4ef711f4a4718 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Tue, 2 Nov 2021 11:17:07 -0400 Subject: [PATCH 165/254] fix name --- .../loop_unroller/loop_unroller.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 3bdb811f1..abf32ea25 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -120,13 +120,13 @@ int main(int argc, char** argv) { if (!Module) return 1; - LoopUnroller Canonicalizer; + LoopUnroller Unroller; #if (METHOD == 1) - Canonicalizer.runOnModule(*Module); + Unroller.runOnModule(*Module); #elif (METHOD == 2) for (auto& Function : *Module) { - Canonicalizer.runOnFunction(Function); + Unroller.runOnFunction(Function); } #endif From 6713793622542fc9e96e6aee5c8e58b5cfe0e19e Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Wed, 3 Nov 2021 10:51:57 -0400 Subject: [PATCH 166/254] fix by Hugh Leather --- .../loop_unroller/loop_unroller.cc | 136 +++++++----------- 1 file changed, 54 insertions(+), 82 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index abf32ea25..b1004abee 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include "llvm/ADT/SetVector.h" @@ -9,81 +12,58 @@ #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InstIterator.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" +#include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/Support/ToolOutputFile.h" using namespace llvm; -#define DEBUG_TYPE "LoopUnroller" -#define METHOD 1 - -#if (METHOD == 1) -// obtained from https://stackoverflow.com/a/33565910/3880948 -// Error: error: no member named 'ID' in 'llvm::LoopInfo' -class LoopUnroller : public llvm::ModulePass { - public: - static char ID; +/// Input LLVM module file name. +cl::opt InputFilename(cl::Positional, cl::desc("Specify input filename"), + cl::value_desc("filename"), cl::init("-")); +/// Output LLVM module file name. +cl::opt OutputFilename("o", cl::desc("Specify output filename"), + cl::value_desc("filename"), cl::init("-")); - LoopUnroller() : ModulePass(ID) {} - - bool runOnModule(llvm::Module& M) override { - loopcounter = 0; - for (auto IT = M.begin(), END = M.end(); IT != END; ++IT) { - LoopInfo& LI = getAnalysis(*IT); - for (LoopInfo::iterator LIT = LI.begin(), LEND = LI.end(); LIT != LEND; ++LIT) { - handleLoop(*LIT); - } - } - LLVM_DEBUG(dbgs() << "Found " << loopcounter << " loops.\n"); - return false; - } +namespace llvm { +// The INITIALIZE_PASS_XXX macros put the initialiser in the llvm namespace. +void initializeLoopCounterPass(PassRegistry& Registry); +} // namespace llvm - private: - int loopcounter = 0; - void handleLoop(Loop* L) { - ++loopcounter; - for (Loop* SL : L->getSubLoops()) { - handleLoop(SL); - } - } -}; -#elif (METHOD == 2) -// based on advice from https://stackoverflow.com/a/30353625/3880948 -// Error message: Assertion failed: (Resolver && "Pass has not been inserted into a PassManager -// object!"), function getAnalysis, file -// external/clang-llvm-10.0.0-x86_64-apple-darwin/include/llvm/PassAnalysisSupport.h, line 221. -class LoopUnroller : public llvm::FunctionPass { +class LoopCounter : public llvm::FunctionPass { public: static char ID; + std::unordered_map counts; - LoopUnroller() : FunctionPass(ID) {} + LoopCounter() : FunctionPass(ID) {} - virtual void getAnalysisUsage(AnalysisUsage& AU) const { AU.addRequired(); } + virtual void getAnalysisUsage(AnalysisUsage& AU) const override { + AU.addRequired(); + } bool runOnFunction(llvm::Function& F) override { - loopcounter = 0; LoopInfo& LI = getAnalysis().getLoopInfo(); - for (BasicBlock& BB : F) { - Loop* L = LI.getLoopFor(&BB); - if (L) // if not null - loopcounter++; - } - LLVM_DEBUG(dbgs() << "Found " << loopcounter << " loops.\n"); + auto Loops = LI.getLoopsInPreorder(); + + // Should reall account for module, too. + counts[F.getName().str()] = Loops.size(); return false; } - - private: - int loopcounter = 0; }; -#endif // METHOD -char LoopUnroller::ID = 0; +// Initialise the pass. We have to declare the dependencies we use. +char LoopCounter::ID = 0; +INITIALIZE_PASS_BEGIN(LoopCounter, "count-loops", "Count loops", false, false) +INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) +INITIALIZE_PASS_END(LoopCounter, "count-loops", "Count loops", false, false) /// Reads a module from a file. /// On error, messages are written to stderr and null is returned. @@ -95,53 +75,45 @@ static std::unique_ptr readModule(LLVMContext& Context, StringRef Name) std::unique_ptr Module = parseIRFile(Name, Diag, Context); if (!Module) - Diag.print("llvm-canon", errs()); + Diag.print("llvm-counter", errs()); return Module; } -/// Input LLVM module file name. -cl::opt InputFilename("f", cl::desc("Specify input filename"), - cl::value_desc("filename"), cl::Required); -/// Output LLVM module file name. -cl::opt OutputFilename("o", cl::desc("Specify output filename"), - cl::value_desc("filename"), cl::Required); - int main(int argc, char** argv) { cl::ParseCommandLineOptions(argc, argv, - " LLVM-Unroller\n\n" - " This tool aims to give users fine grain control on which loops to " - "unroll and by which factor.\n"); + " LLVM-Counter\n\n" + " Count the loops in a bitcode file.\n"); LLVMContext Context; + SMDiagnostic Err; + SourceMgr SM; + std::error_code EC; - std::unique_ptr Module = readModule(Context, InputFilename); - - if (!Module) + ToolOutputFile Out(OutputFilename, EC, sys::fs::OF_None); + if (EC) { + Err = SMDiagnostic(OutputFilename, SourceMgr::DK_Error, + "Could not open output file: " + EC.message()); + Err.print(argv[0], errs()); return 1; - - LoopUnroller Unroller; - -#if (METHOD == 1) - Unroller.runOnModule(*Module); -#elif (METHOD == 2) - for (auto& Function : *Module) { - Unroller.runOnFunction(Function); } -#endif - if (verifyModule(*Module, &errs())) + std::unique_ptr Module = readModule(Context, InputFilename); + + if (!Module) return 1; - std::error_code EC; - raw_fd_ostream OutputStream(OutputFilename, EC, sys::fs::OF_None); + // Run the pass + initializeLoopCounterPass(*PassRegistry::getPassRegistry()); + legacy::PassManager PM; + LoopCounter* Counter = new LoopCounter(); + PM.add(Counter); + PM.run(*Module); - if (EC) { - errs() << EC.message(); - return 1; + for (auto& x : Counter->counts) { + Out.os() << x.first << ' ' << x.second << '\n'; } - Module->print(OutputStream, nullptr, false); - OutputStream.close(); + Out.keep(); return 0; } From fdb7461180c4624b3660648f47c38df873620dca Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 6 Nov 2021 09:09:35 -0400 Subject: [PATCH 167/254] move all file into llvm{} and hack meta data change --- .../loop_unroller/loop_unroller.cc | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index b1004abee..1d3ba7267 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -23,9 +23,11 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Transforms/Utils/LoopUtils.h" using namespace llvm; +namespace llvm { /// Input LLVM module file name. cl::opt InputFilename(cl::Positional, cl::desc("Specify input filename"), cl::value_desc("filename"), cl::init("-")); @@ -33,10 +35,8 @@ cl::opt InputFilename(cl::Positional, cl::desc("Specify input filen cl::opt OutputFilename("o", cl::desc("Specify output filename"), cl::value_desc("filename"), cl::init("-")); -namespace llvm { // The INITIALIZE_PASS_XXX macros put the initialiser in the llvm namespace. void initializeLoopCounterPass(PassRegistry& Registry); -} // namespace llvm class LoopCounter : public llvm::FunctionPass { public: @@ -53,8 +53,13 @@ class LoopCounter : public llvm::FunctionPass { LoopInfo& LI = getAnalysis().getLoopInfo(); auto Loops = LI.getLoopsInPreorder(); - // Should reall account for module, too. + // Should really account for module, too. counts[F.getName().str()] = Loops.size(); + + for (auto ALoop : Loops) { + addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable"); + } + return false; } }; @@ -79,6 +84,7 @@ static std::unique_ptr readModule(LLVMContext& Context, StringRef Name) return Module; } +} // namespace llvm int main(int argc, char** argv) { cl::ParseCommandLineOptions(argc, argv, @@ -103,17 +109,23 @@ int main(int argc, char** argv) { if (!Module) return 1; - // Run the pass + // Run the passes initializeLoopCounterPass(*PassRegistry::getPassRegistry()); legacy::PassManager PM; LoopCounter* Counter = new LoopCounter(); + // LoopUnrollConfigurator* UnrollConfigurator = new LoopUnrollConfigurator(); PM.add(Counter); + // PM.add(UnrollConfigurator); + // PM.add(createLoopUnrollPass()); PM.run(*Module); for (auto& x : Counter->counts) { Out.os() << x.first << ' ' << x.second << '\n'; } + Module->print(Out.os(), nullptr, false); + Out.keep(); + return 0; } From 1d0d77f03c81975445da30659e120fcba190a24c Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sat, 6 Nov 2021 12:11:52 -0400 Subject: [PATCH 168/254] add separate loop passes to count and to configure --- .../loop_unroller/loop_unroller.cc | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 1d3ba7267..d84216c80 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -56,6 +56,34 @@ class LoopCounter : public llvm::FunctionPass { // Should really account for module, too. counts[F.getName().str()] = Loops.size(); + return false; + } +}; + +// Initialise the pass. We have to declare the dependencies we use. +char LoopCounter::ID = 0; +INITIALIZE_PASS_BEGIN(LoopCounter, "count-loops", "Count loops", false, false) +INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) +INITIALIZE_PASS_END(LoopCounter, "count-loops", "Count loops", false, false) + +// The INITIALIZE_PASS_XXX macros put the initialiser in the llvm namespace. +void initializeLoopUnrollConfiguratorPass(PassRegistry& Registry); + +class LoopUnrollConfigurator : public llvm::FunctionPass { + public: + static char ID; + + LoopUnrollConfigurator() : FunctionPass(ID) {} + + virtual void getAnalysisUsage(AnalysisUsage& AU) const override { + AU.addRequired(); + } + + bool runOnFunction(llvm::Function& F) override { + LoopInfo& LI = getAnalysis().getLoopInfo(); + auto Loops = LI.getLoopsInPreorder(); + + // Should really account for module, too. for (auto ALoop : Loops) { addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable"); } @@ -65,10 +93,12 @@ class LoopCounter : public llvm::FunctionPass { }; // Initialise the pass. We have to declare the dependencies we use. -char LoopCounter::ID = 0; -INITIALIZE_PASS_BEGIN(LoopCounter, "count-loops", "Count loops", false, false) +char LoopUnrollConfigurator::ID = 1; +INITIALIZE_PASS_BEGIN(LoopUnrollConfigurator, "unroll-loops-configurator", + "Configurates loop unrolling", false, false) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) -INITIALIZE_PASS_END(LoopCounter, "count-loops", "Count loops", false, false) +INITIALIZE_PASS_END(LoopUnrollConfigurator, "unroll-loops-configurator", + "Configurates loop unrolling", false, false) /// Reads a module from a file. /// On error, messages are written to stderr and null is returned. @@ -113,14 +143,14 @@ int main(int argc, char** argv) { initializeLoopCounterPass(*PassRegistry::getPassRegistry()); legacy::PassManager PM; LoopCounter* Counter = new LoopCounter(); - // LoopUnrollConfigurator* UnrollConfigurator = new LoopUnrollConfigurator(); + LoopUnrollConfigurator* UnrollConfigurator = new LoopUnrollConfigurator(); PM.add(Counter); - // PM.add(UnrollConfigurator); + PM.add(UnrollConfigurator); // PM.add(createLoopUnrollPass()); PM.run(*Module); for (auto& x : Counter->counts) { - Out.os() << x.first << ' ' << x.second << '\n'; + llvm::dbgs() << x.first << ": " << x.second << " loops" << '\n'; } Module->print(Out.os(), nullptr, false); From 5f3d2b7c3c7b83f2ff8c20288e1fa40ec3a1f57f Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 7 Nov 2021 00:40:20 -0400 Subject: [PATCH 169/254] add meta data and call loop unroll --- .../loop_unroller/loop_unroller.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index d84216c80..6c59e5745 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -23,6 +23,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/LoopUtils.h" using namespace llvm; @@ -85,7 +86,8 @@ class LoopUnrollConfigurator : public llvm::FunctionPass { // Should really account for module, too. for (auto ALoop : Loops) { - addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable"); + addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable", true); + addStringMetadataToLoop(ALoop, "llvm.loop.unroll.count", 4); } return false; @@ -114,6 +116,7 @@ static std::unique_ptr readModule(LLVMContext& Context, StringRef Name) return Module; } + } // namespace llvm int main(int argc, char** argv) { @@ -146,7 +149,7 @@ int main(int argc, char** argv) { LoopUnrollConfigurator* UnrollConfigurator = new LoopUnrollConfigurator(); PM.add(Counter); PM.add(UnrollConfigurator); - // PM.add(createLoopUnrollPass()); + PM.add(createLoopUnrollPass()); PM.run(*Module); for (auto& x : Counter->counts) { From 3c4774dd5bc7f3ed5d8b20ad3102eb82e9ae28d8 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 7 Nov 2021 01:51:42 -0400 Subject: [PATCH 170/254] pass unroll enable and count as cli --- .../loop_unroller/loop_unroller.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 6c59e5745..d98fce440 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -36,6 +36,13 @@ cl::opt InputFilename(cl::Positional, cl::desc("Specify input filen cl::opt OutputFilename("o", cl::desc("Specify output filename"), cl::value_desc("filename"), cl::init("-")); +static cl::opt UnrollEnable("funroll-loops", cl::desc("Enable loop unrolling"), + cl::init(true)); + +extern cl::opt UnrollCount( + "funroll-count", cl::desc("Use this unroll count for all loops including those with " + "unroll_count pragma values, for testing purposes")); + // The INITIALIZE_PASS_XXX macros put the initialiser in the llvm namespace. void initializeLoopCounterPass(PassRegistry& Registry); @@ -86,8 +93,10 @@ class LoopUnrollConfigurator : public llvm::FunctionPass { // Should really account for module, too. for (auto ALoop : Loops) { - addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable", true); - addStringMetadataToLoop(ALoop, "llvm.loop.unroll.count", 4); + if (UnrollEnable) + addStringMetadataToLoop(ALoop, "llvm.loop.unroll.enable", UnrollEnable); + if (UnrollCount) + addStringMetadataToLoop(ALoop, "llvm.loop.unroll.count", UnrollCount); } return false; From de96b1426f14d6b5d1b53576b891737505232862 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 7 Nov 2021 20:38:41 -0500 Subject: [PATCH 171/254] call loop unroller in env service --- .../loop_unroller/loop_unroller.cc | 2 +- .../service_py/BUILD | 8 +++ .../service_py/example_service.py | 54 ++++++++++++++----- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index d98fce440..99b4df41b 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -36,7 +36,7 @@ cl::opt InputFilename(cl::Positional, cl::desc("Specify input filen cl::opt OutputFilename("o", cl::desc("Specify output filename"), cl::value_desc("filename"), cl::init("-")); -static cl::opt UnrollEnable("funroll-loops", cl::desc("Enable loop unrolling"), +static cl::opt UnrollEnable("floop-unroll", cl::desc("Enable loop unrolling"), cl::init(true)); extern cl::opt UnrollCount( diff --git a/examples/example_unrolling_service/service_py/BUILD b/examples/example_unrolling_service/service_py/BUILD index b8ff53f0a..8da6a5c31 100644 --- a/examples/example_unrolling_service/service_py/BUILD +++ b/examples/example_unrolling_service/service_py/BUILD @@ -4,9 +4,17 @@ # LICENSE file in the root directory of this source tree. load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") +alias( + name = "loop_unroller", + actual = "//examples/example_unrolling_service/loop_unroller:loop_unroller", +) + py_binary( name = "example-unrolling-service-py", srcs = ["example_service.py"], + data = [ + ":loop_unroller", + ], main = "example_service.py", visibility = ["//visibility:public"], deps = [ diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 8a4173827..4e87eaa0b 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -98,7 +98,11 @@ class UnrollingCompilationSession(CompilationSession): ] def __init__( - self, working_directory: Path, action_space: ActionSpace, benchmark: Benchmark + self, + working_directory: Path, + action_space: ActionSpace, + benchmark: Benchmark, + use_custom_opt: bool = True, ): super().__init__(working_directory, action_space, benchmark) logging.info("Started a compilation session for %s", benchmark.uri) @@ -110,6 +114,9 @@ def __init__( self._llc = str(llvm.llc_path()) self._llvm_diff = str(llvm.llvm_diff_path()) self._opt = str(llvm.opt_path()) + # LLVM's opt does not always enforce the unrolling options passed as cli arguments. Hence, we created our own exeutable with custom unrolling pass in examples/example_unrolling_service/loop_unroller that enforces the unrolling factors passed in its cli. + # if self._use_custom_opt is true, use our custom exeutable, otherwise use LLVM's opt + self._use_custom_opt = use_custom_opt # Dump the benchmark source to disk. self._src_path = str(self.working_dir / "benchmark.c") @@ -147,28 +154,47 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo if choice_index < 0 or choice_index >= num_choices: raise ValueError("Out-of-range") - cmd = self._action_space.choice[0].named_discrete_space.value[choice_index] + args = self._action_space.choice[0].named_discrete_space.value[choice_index] logging.info( "Applying action %d, equivalent command-line arguments: '%s'", choice_index, - cmd, + args, ) + args = args.split() # make a copy of the LLVM file to compare its contents after applying the action shutil.copyfile(self._llvm_path, self._llvm_before_path) # apply action - run_command( - [ - self._opt, - *cmd.split(), - self._llvm_path, - "-S", - "-o", - self._llvm_path, - ], - timeout=30, - ) + if self._use_custom_opt: + # our custom unroller has an additional `f` at the beginning of each argument + for i, arg in enumerate(args): + # convert - to -f + arg = arg[0] + "f" + arg[1:] + args[i] = arg + print("args: ", args) + run_command( + [ + "loop_unroller", + *args, + self._llvm_path, + "-o", + self._llvm_path, + ], + timeout=30, + ) + else: + run_command( + [ + self._opt, + *args, + self._llvm_path, + "-S", + "-o", + self._llvm_path, + ], + timeout=30, + ) # compare the IR files to check if the action had an effect try: From cef2149bf0dc3a87f2a8591edfeab4419e0411fd Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Sun, 7 Nov 2021 20:39:17 -0500 Subject: [PATCH 172/254] start a README file --- examples/example_unrolling_service/loop_unroller/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/example_unrolling_service/loop_unroller/README.md diff --git a/examples/example_unrolling_service/loop_unroller/README.md b/examples/example_unrolling_service/loop_unroller/README.md new file mode 100644 index 000000000..a0990367e --- /dev/null +++ b/examples/example_unrolling_service/loop_unroller/README.md @@ -0,0 +1 @@ +TBD From 39c881d344857da8eacdabc22340c8aac861cb4d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 22 Oct 2021 16:11:59 +0100 Subject: [PATCH 173/254] [examples] Add an LLVM autotuning framework. This patch adds an autotuning framework containings various autotuners for the LLVM phase ordering environment by integrating with third-party libraries or implementing simple search strategies. --- examples/.gitignore | 3 + examples/Makefile | 22 ++ examples/README.md | 9 + examples/llvm_autotuning/README.md | 116 ++++++++ examples/llvm_autotuning/__init__.py | 4 + .../llvm_autotuning/autotuners/__init__.py | 13 + .../llvm_autotuning/autotuners/random_test.py | 2 +- examples/llvm_autotuning/benchmarks.py | 146 +++++++++ .../config/autotuner/greedy.yaml | 4 + .../config/autotuner/nevergrad.yaml | 7 + .../config/autotuner/opentuner.yaml | 6 + .../config/autotuner/random.yaml | 6 + .../config/benchmarks/cbench.yaml | 30 ++ .../config/benchmarks/csmith-50.yaml | 4 + examples/llvm_autotuning/config/default.yaml | 23 ++ .../config/executor/debug.yaml | 2 + .../config/executor/local.yaml | 5 + .../llvm_autotuning/config/executor/noop.yaml | 2 + .../config/executor/slurm.yaml | 3 + examples/llvm_autotuning/executor.py | 278 ++++++++++++++++++ examples/llvm_autotuning/executor_test.py | 35 +++ examples/llvm_autotuning/experiment.py | 175 +++++++++++ examples/llvm_autotuning/info.py | 102 +++++++ .../llvm_autotuning/just_keep_going_env.py | 64 ++++ .../llvm_autotuning/optimization_target.py | 106 +++++++ examples/llvm_autotuning/tune.py | 40 +++ examples/setup.py | 22 ++ 27 files changed, 1228 insertions(+), 1 deletion(-) create mode 100644 examples/.gitignore create mode 100644 examples/Makefile create mode 100644 examples/llvm_autotuning/README.md create mode 100644 examples/llvm_autotuning/__init__.py create mode 100644 examples/llvm_autotuning/benchmarks.py create mode 100644 examples/llvm_autotuning/config/autotuner/greedy.yaml create mode 100644 examples/llvm_autotuning/config/autotuner/nevergrad.yaml create mode 100644 examples/llvm_autotuning/config/autotuner/opentuner.yaml create mode 100644 examples/llvm_autotuning/config/autotuner/random.yaml create mode 100644 examples/llvm_autotuning/config/benchmarks/cbench.yaml create mode 100644 examples/llvm_autotuning/config/benchmarks/csmith-50.yaml create mode 100644 examples/llvm_autotuning/config/default.yaml create mode 100644 examples/llvm_autotuning/config/executor/debug.yaml create mode 100644 examples/llvm_autotuning/config/executor/local.yaml create mode 100644 examples/llvm_autotuning/config/executor/noop.yaml create mode 100644 examples/llvm_autotuning/config/executor/slurm.yaml create mode 100644 examples/llvm_autotuning/executor.py create mode 100644 examples/llvm_autotuning/executor_test.py create mode 100644 examples/llvm_autotuning/experiment.py create mode 100644 examples/llvm_autotuning/info.py create mode 100644 examples/llvm_autotuning/just_keep_going_env.py create mode 100644 examples/llvm_autotuning/optimization_target.py create mode 100644 examples/llvm_autotuning/tune.py create mode 100644 examples/setup.py diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 000000000..64e245ad6 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1,3 @@ +/*.egg-info +/build +/dist diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 000000000..14ca67d1f --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,22 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +define HELP +CompilerGym usage examples. See README.md for details. Available targets: + + make install + Install the example python packages. + + make test + Run the example unit tests. +endef +export HELP + +PYTHON ?= python3 + +install: + $(PYTHON) setup.py install + +test: + $(PYTHON) -m pytest . diff --git a/examples/README.md b/examples/README.md index 809001dd1..dd1c1b2c2 100644 --- a/examples/README.md +++ b/examples/README.md @@ -9,6 +9,7 @@ you think is missing? If so, please [contribute](/CONTRIBUTING.md)! - [Autotuning](#autotuning) - [Performing a random walk of an environment](#performing-a-random-walk-of-an-environment) + - [LLVM Autotuning (genetic algorithms, greedy search, + more)](#llvm-autotuning-genetic-algorithms-greedy-search--more) - [GCC Autotuning (genetic algorithms, hill climbing, + more)](#gcc-autotuning-genetic-algorithms-hill-climbing--more) - [Makefile integration](#makefile-integration) - [Random search using the LLVM C++ API](#random-search-using-the-llvm-c-api) @@ -61,6 +62,14 @@ Max reward: 111.0 (+68.94% at step 31) For further details run: `python random_walk.py --help`. +### LLVM Autotuning (genetic algorithms, greedy search, + more) + +The [llvm_autotuning](llvm_autotuning/) directory contains a framework for +running autotuning experiments on the LLVM environments and several +implementations of autotuners. See the [llvm_autotuning](llvm_autotuning/) +directory for further details. + + ### GCC Autotuning (genetic algorithms, hill climbing, + more) The [gcc_search.py](gcc_search.py) script contains implementations of several diff --git a/examples/llvm_autotuning/README.md b/examples/llvm_autotuning/README.md new file mode 100644 index 000000000..b02c62952 --- /dev/null +++ b/examples/llvm_autotuning/README.md @@ -0,0 +1,116 @@ +# Autotuning for LLVM Phase Ordering + +This directory contains various autotuners for the LLVM phase ordering +environment by integrating with third-party libraries or implementing simple +search strategies. + +- [Autotuners](#autotuners) +- [Installation](#installation) +- [Usage](#usage) + - [Running autotuning experiments](#running-autotuning-experiments) + - [Overview of results](#overview-of-results) + + +## Autotuners + +The following autotuning techniques are supported: + +1. Greedy Search: At each step evaluate all possible actions and select the + action which provides the greatest reward, terminating once no positive + reward can be achieved by any action. +1. [Nevergrad](https://facebookresearch.github.io/nevergrad/): A gradient-free + optimization library that supports many optimization strategies. +1. [OpenTuner](https://opentuner.org/): An extensible framework for program + autotuning. +1. Random Search: randomly select actions randomly until a configurable number + of steps have elapsed without a positive reward. + + +## Installation + +Using these scripts requires installing the package of examples code. From the +root of this repository: + +``` +cd examples +python setup.py install +``` + + +## Usage + +There are two scripts, [tune.py](tune.py) and [info.py](info.py). The tuning +script is used to run the autotuning experiments and record log the results to +CSV files. The info script reads and aggregates results over many multiple CSV +files. + +### Running autotuning experiments + +Invoke the tuning script using: + +``` +python -m llvm_autotuning.tune -m +``` + +Where `` is a list of configuration arguments. Key configuration +options are: + +| Argument | Description | +|---------------------------------|-----------------------------------------------------------------------------| +| `autotuner` | Name of the autotuner. One of: {`greedy`,`nevergrad`,`opentuner`,`random`}. | +| `autotuner.optimization_target` | Loss function to optimize for. One of: {`codesize`,`binsize`,`runtime`}. | +| `autotuner.search_time_seconds` | Number of seconds to run on each program instance. Default: 3600. | +| `outputs` | Base output directory. Default: `~/logs/compiler_gym/llvm_autotuning`. | +| `experiment` | Name of the experiment, used to determine output directory. | +| `num_replicas` | Number of times to repeat each experiment. Default: 10. | +| `executor.cpus` | Number of parallel experiment workers. Default: #. cores on machine. | + +For example, to run 10 minutes of code size autotuning using +[Nevergrad](https://facebookresearch.github.io/nevergrad/) using 32 parallel +worker processes, logging results to /tmp/logs/my-experiment: + +``` +python -m llvm_autotuning.tune -m \ + experiment=my-experiment \ + outputs=/tmp/logs \ + executor.cpus=32 \ + num_replicas=10 \ + autotuner=nevergrad \ + autotuner.optimization_target=codesize \ + autotuner.search_time_seconds=600 +``` + +Multiple values can be passed to each configuration option, defining a grid of +unique configurations that will each be run. For example, the following +configuration creates a grid sweep over the search time (5 minutes and 10 +minutes) and episode length (100 steps, 200 steps, and 300 steps): + +``` +python -m llvm_autotuning.tune -m \ + experiment=my-tuning-experiment \ + num_replicas=10 \ + benchmarks=csmith-50 \ + autotuner=nevergrad \ + autotuner.optimization_target=codesize \ + autotuner.search_time_seconds=300,600 \ + autotuner.algorithm_config.episode_length=100,200,300 +``` + +Use `--help` to see the full list of configuration options. + + +### Overview of results + +Summarize autotuning results using: + +``` +python -m llvm_autotuning.info +``` + +This aggregates results in the default `~/logs/compiler_gym/llvm_autotuning` +directory. Specify one or more different directories as command line arguments, +e.g.: + +``` +python -m llvm_autotuning.info /path/to/logs/dir/a ~/logs_dir_b +``` diff --git a/examples/llvm_autotuning/__init__.py b/examples/llvm_autotuning/__init__.py new file mode 100644 index 000000000..626423691 --- /dev/null +++ b/examples/llvm_autotuning/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. diff --git a/examples/llvm_autotuning/autotuners/__init__.py b/examples/llvm_autotuning/autotuners/__init__.py index 22108f42c..6eab0f9b9 100644 --- a/examples/llvm_autotuning/autotuners/__init__.py +++ b/examples/llvm_autotuning/autotuners/__init__.py @@ -23,6 +23,19 @@ class Autotuner(BaseModel): + """This class represents an instance of an autotuning algorithm. + + After instantiating from a config dict, instances of this class can be used + to tune CompilerEnv instances: + + >>> autotuner = Autotuner( + algorithm="greedy", + optimization_target="codesize", + search_time_seconds=1800, + ) + >>> env = compiler_gym.make("llvm-v0") + >>> autotuner(env) + """ algorithm: str """The name of the autotuner algorithm.""" diff --git a/examples/llvm_autotuning/autotuners/random_test.py b/examples/llvm_autotuning/autotuners/random_test.py index 98062a9a5..82f85bf46 100644 --- a/examples/llvm_autotuning/autotuners/random_test.py +++ b/examples/llvm_autotuning/autotuners/random_test.py @@ -23,6 +23,6 @@ def test_autotune(): assert result.benchmark == "benchmark://cbench-v1/crc32" assert result.walltime >= 3 assert result.commandline == env.commandline() - assert env.episode_reward + assert env.episode_reward >= 0 assert env.benchmark == "benchmark://cbench-v1/crc32" assert env.reward_space == "IrInstructionCount" diff --git a/examples/llvm_autotuning/benchmarks.py b/examples/llvm_autotuning/benchmarks.py new file mode 100644 index 000000000..31bfbfaa1 --- /dev/null +++ b/examples/llvm_autotuning/benchmarks.py @@ -0,0 +1,146 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from itertools import islice +from typing import Iterable, List, Union + +from pydantic import BaseModel, Field, root_validator, validator + +from compiler_gym.datasets import Benchmark +from compiler_gym.datasets.uri import BENCHMARK_URI_RE, DATASET_NAME_PATTERN +from compiler_gym.envs.llvm import LlvmEnv + + +class BenchmarksEntry(BaseModel): + """This class represents a single entry in a Benchmarks class.""" + + # === Start of fields list. === + + dataset: str = Field(default=None, allow_mutation=False, regex=DATASET_NAME_PATTERN) + """The name of a dataset to iterate over. If set, benchmarks are produced + by iterating over this dataset in order. If not set, the :code:`uris` list + must be provided. + """ + + uris: List[str] = Field(default=[], allow_mutation=False) + """A list of URIs to iterate over.""" + + max_benchmarks: int = Field(default=0, ge=0, allow_mutation=False) + """The maximum number of benchmarks to yield from the given dataset or URIs + list. + """ + + benchmarks_start_at: int = Field(default=0, ge=0, allow_mutation=False) + """An offset into the dataset or URIs list to start iterating from. + + Note that using very large offsets will slow things down as the + implementation still has to iterate over the excluded benchmarks. + """ + + # === Start of public API. === + + def benchmarks_iterator(self, env: LlvmEnv) -> Iterable[Benchmark]: + """Return an iterator over the benchmarks.""" + return self._benchmark_iterator(env) + + def benchmark_uris_iterator(self, env: LlvmEnv) -> Iterable[str]: + """Return an iterator over the URIs of the benchmarks.""" + return self._benchmark_iterator(env, uris=True) + + # === Start of implementation details. === + + @root_validator + def check_that_either_dataset_or_uris_is_set(cls, values): + assert values.get("dataset") or values.get( + "uris" + ), "Neither dataset or uris given" + return values + + @validator("uris", pre=True) + def validate_uris(cls, value, *, values, **kwargs): + del kwargs + del values + for uri in value: + assert BENCHMARK_URI_RE.match(uri), f"Invalid benchmark URI: {uri}" + return list(value) + + def _benchmark_iterator( + self, env: LlvmEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + return ( + self._uris_iterator(env, uris) + if self.uris + else self._dataset_iterator(env, uris) + ) + + def _uris_iterator( + self, env: LlvmEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + """Iterate from a URIs list.""" + start = self.benchmarks_start_at + n = len(self.uris) + if self.max_benchmarks: + n = min(len(self.uris), n) + + if uris: + # Shortcut in case we already have a list of URIs that we can slice + # rather than iterating over. + return iter(self.uris[start:n]) + + return islice((env.datasets.benchmark(u) for u in self.uris), start, start + n) + + def _dataset_iterator( + self, env: LlvmEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + """Iterate from a dataset name.""" + dataset = env.datasets[self.dataset] + dataset.install() + n = dataset.size or self.max_benchmarks # dataset.size == 0 for inf + if self.max_benchmarks: + n = min(self.max_benchmarks, n) + start = self.benchmarks_start_at + iterator = dataset.benchmark_uris if uris else dataset.benchmarks + return islice(iterator(), start, start + n) + + class Config: + validate_assignment = True + + +class Benchmarks(BaseModel): + """Represents a set of benchmarks to use for training/validation/testing. + + There are two ways of describing benchmarks, either as a list of benchmark + URIs: + + benchmarks: + uris: + - benchmark://cbench-v1/adpcm + - benchmark://cbench-v1/ghostscript + + Or as a dataset to iterate over: + + benchmarks: + dataset: benchmark://cbench-v1 + max_benchmarks: 20 + """ + + benchmarks: List[BenchmarksEntry] + + # === Start of public API. === + + def benchmarks_iterator(self, env: LlvmEnv) -> Iterable[Benchmark]: + """Return an iterator over the benchmarks.""" + for bm in self.benchmarks: + yield from bm.benchmarks_iterator(env) + + def benchmark_uris_iterator(self, env: LlvmEnv) -> Iterable[str]: + """Return an iterator over the URIs of the benchmarks.""" + for bm in self.benchmarks: + yield from bm.benchmark_uris_iterator(env) + + # === Start of implementation details. === + + @validator("benchmarks", pre=True) + def validate_benchmarks(cls, value) -> List[BenchmarksEntry]: + return [BenchmarksEntry(**v) for v in value] diff --git a/examples/llvm_autotuning/config/autotuner/greedy.yaml b/examples/llvm_autotuning/config/autotuner/greedy.yaml new file mode 100644 index 000000000..71f3ac8d0 --- /dev/null +++ b/examples/llvm_autotuning/config/autotuner/greedy.yaml @@ -0,0 +1,4 @@ +--- +algorithm: greedy +optimization_target: codesize +search_time_seconds: 3600 diff --git a/examples/llvm_autotuning/config/autotuner/nevergrad.yaml b/examples/llvm_autotuning/config/autotuner/nevergrad.yaml new file mode 100644 index 000000000..5308545f4 --- /dev/null +++ b/examples/llvm_autotuning/config/autotuner/nevergrad.yaml @@ -0,0 +1,7 @@ +--- +algorithm: nevergrad +optimization_target: codesize +search_time_seconds: 3600 +algorithm_config: + episode_length: 325 + optimizer: DiscreteLenglerOnePlusOne diff --git a/examples/llvm_autotuning/config/autotuner/opentuner.yaml b/examples/llvm_autotuning/config/autotuner/opentuner.yaml new file mode 100644 index 000000000..2815225fb --- /dev/null +++ b/examples/llvm_autotuning/config/autotuner/opentuner.yaml @@ -0,0 +1,6 @@ +--- +algorithm: opentuner_ga +optimization_target: codesize +search_time_seconds: 3600 +algorithm_config: + max_copies_of_pass: 4 diff --git a/examples/llvm_autotuning/config/autotuner/random.yaml b/examples/llvm_autotuning/config/autotuner/random.yaml new file mode 100644 index 000000000..758dfb2c9 --- /dev/null +++ b/examples/llvm_autotuning/config/autotuner/random.yaml @@ -0,0 +1,6 @@ +--- +algorithm: random +optimization_target: codesize +search_time_seconds: 3600 +algorithm_config: + patience: 50 diff --git a/examples/llvm_autotuning/config/benchmarks/cbench.yaml b/examples/llvm_autotuning/config/benchmarks/cbench.yaml new file mode 100644 index 000000000..042e82df8 --- /dev/null +++ b/examples/llvm_autotuning/config/benchmarks/cbench.yaml @@ -0,0 +1,30 @@ +--- +# The set of runnable cBench benchmarks. Enumerated using: +# +# >>> import compiler_gym +# >>> env = compiler_gym.make("llvm-v0") +# >>> for benchmark in env.datasets["benchmark://cbench-v1"]: +# ... env.reset(benchmark) +# ... if env.observation.IsRunnable(): +# ... print(benchmark) +# +benchmarks: + - uris: + - benchmark://cbench-v1/bitcount + - benchmark://cbench-v1/blowfish + - benchmark://cbench-v1/bzip2 + - benchmark://cbench-v1/crc32 + - benchmark://cbench-v1/dijkstra + - benchmark://cbench-v1/gsm + - benchmark://cbench-v1/jpeg-c + - benchmark://cbench-v1/jpeg-d + - benchmark://cbench-v1/patricia + - benchmark://cbench-v1/qsort + - benchmark://cbench-v1/sha + - benchmark://cbench-v1/stringsearch + - benchmark://cbench-v1/stringsearch2 + - benchmark://cbench-v1/susan + - benchmark://cbench-v1/tiff2bw + - benchmark://cbench-v1/tiff2rgba + - benchmark://cbench-v1/tiffdither + - benchmark://cbench-v1/tiffmedian diff --git a/examples/llvm_autotuning/config/benchmarks/csmith-50.yaml b/examples/llvm_autotuning/config/benchmarks/csmith-50.yaml new file mode 100644 index 000000000..7c223ea88 --- /dev/null +++ b/examples/llvm_autotuning/config/benchmarks/csmith-50.yaml @@ -0,0 +1,4 @@ +--- +benchmarks: + - dataset: generator://csmith-v0 + max_benchmarks: 50 diff --git a/examples/llvm_autotuning/config/default.yaml b/examples/llvm_autotuning/config/default.yaml new file mode 100644 index 000000000..994317f29 --- /dev/null +++ b/examples/llvm_autotuning/config/default.yaml @@ -0,0 +1,23 @@ +--- +defaults: + - executor: local + - autotuner: random + - benchmarks: cbench +search_time_seconds: 3600 +# The base directory for logs and other runtime artifacts. +outputs: ~/logs/compiler_gym/llvm_autotuning +# The top subdirectory to arrange files in. Use this to group related runs by +# some logical naming. +experiment: unnamed_experiment +# The number of replicas of each autotuning job to run. +num_replicas: 10 +# Use hydra to manage the output directory layout. Multi-run and single runs +# share the same directory layout (there just won't be a multirun.yaml file for +# the individual runs). +hydra: + run: + dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S}/${experiment}-C0 + sweep: + dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S} + subdir: ${experiment}-C${hydra.job.num} + output_subdir: hydra diff --git a/examples/llvm_autotuning/config/executor/debug.yaml b/examples/llvm_autotuning/config/executor/debug.yaml new file mode 100644 index 000000000..b437d4ffd --- /dev/null +++ b/examples/llvm_autotuning/config/executor/debug.yaml @@ -0,0 +1,2 @@ +--- +type: debug diff --git a/examples/llvm_autotuning/config/executor/local.yaml b/examples/llvm_autotuning/config/executor/local.yaml new file mode 100644 index 000000000..2070c1dd6 --- /dev/null +++ b/examples/llvm_autotuning/config/executor/local.yaml @@ -0,0 +1,5 @@ +--- +type: local +# Specifies the number of parallel worker processes. If -1, defaults to the +# number of cores on the machine. +cpus: -1 diff --git a/examples/llvm_autotuning/config/executor/noop.yaml b/examples/llvm_autotuning/config/executor/noop.yaml new file mode 100644 index 000000000..d498bb4b2 --- /dev/null +++ b/examples/llvm_autotuning/config/executor/noop.yaml @@ -0,0 +1,2 @@ +--- +type: noop diff --git a/examples/llvm_autotuning/config/executor/slurm.yaml b/examples/llvm_autotuning/config/executor/slurm.yaml new file mode 100644 index 000000000..63c07a297 --- /dev/null +++ b/examples/llvm_autotuning/config/executor/slurm.yaml @@ -0,0 +1,3 @@ +--- +type: slurm +cpus: 1 diff --git a/examples/llvm_autotuning/executor.py b/examples/llvm_autotuning/executor.py new file mode 100644 index 000000000..f7feae564 --- /dev/null +++ b/examples/llvm_autotuning/executor.py @@ -0,0 +1,278 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +import multiprocessing +from collections import deque +from contextlib import contextmanager +from enum import Enum +from itertools import islice +from pathlib import Path +from typing import Optional + +from pydantic import BaseModel, Field, validator +from pydantic.class_validators import root_validator +from submitit import AutoExecutor + +logger = logging.getLogger(__name__) + + +class Executor(BaseModel): + """Defines the execution environment for jobs. + + E.g. a node on a cluster, the local machine, etc. To create jobs, + instantiate this class and submit functions to using the executor API: + + >>> executor = Executor(executor="local", block=True) + >>> with executor.get_executor() as executor: + ... executor.submit(my_job, arg1, arg2) + ... executor.submit(another_job) + """ + + class Type(str, Enum): + """Types of execution environments.""" + + SLURM = "slurm" + """Submit jobs to a SLURM cluster scheduler.""" + LOCAL = "local" + """Submit jobs to run on the current machine.""" + DEBUG = "debug" + """Submit jobs to run synchronously on the current machine.""" + NOOP = "noop" + """Submitted jobs return immediately without executing. This can be + useful for debugging, where you want to validate the code and + configuration without performing any computation. + """ + + type: Type = Field(allow_mutation=False) + """The execution environment.""" + + slurm_partition: Optional[str] = Field(default=None, allow_mutation=False) + """The name of the SLURM partition to submit jobs to. + + Only used for :code:`Type.SLURM` executors. + """ + + cpus: int = Field(default=1, allow_mutation=False, ge=1) + """The number of CPU threads to provision. + + If the type of executor is :code:`Type.SLURM`, this is the number of CPU + threads to provision for each job. If the type of executor is + :code:`Type.LOCAL`, this is the number of parallel jobs to process in a + thread pool. If the value is -1 and the executor is :code:`Type.LOCAL`, the + number of physical cores on the machine is used. Has no effect for + :code:`Type.DEBUG` and :code:`Type.NOOP`. + """ + + timeout_hours: float = Field(default=12, allow_mutation=False, gt=0) + + block: bool = Field(default=False, allow_mutation=False) + """If :code:`True`, the :code:`get_executor()` context manager will block + until all jobs have completed when exiting scope. Jobs are still submitted + asynchronously for parallel execution. + """ + + # === Start of public API. === + + @contextmanager + def get_executor(self, logs_dir: Path, cpus=None): + cpus = cpus or self.cpus + if self.type == self.Type.SLURM: + executor = AutoExecutor(folder=logs_dir) + executor.update_parameters( + timeout_min=int(round(self.timeout_hours * 60)), + nodes=1, + cpus_per_task=cpus, + slurm_partition=self.slurm_partition, + ) + name = self.slurm_partition + elif self.type == self.Type.LOCAL: + executor, name = ( + LocalParallelExecutor( + cpus=multiprocessing.cpu_count() if cpus == -1 else cpus, + timeout_seconds=int(round(self.timeout_hours * 3600)), + ), + "local", + ) + elif self.type == self.Type.DEBUG: + executor, name = LocalSynchronousExecutor(), "local" + elif self.type == self.Type.NOOP: + executor, name = DummyExecutor(), "noop" + else: + assert False, f"Unknown executor: {self.type} ({type(self.type).__name__})" + executor = WrappedExecutor(executor, name=name) + yield executor + + if self.type == self.Type.DEBUG or self.block: + wait_on_jobs( + executor.jobs, + executor_name=str(executor), + cancel_on_error=self.type == self.Type.SLURM, + ) + + if hasattr(executor.unwrapped, "close"): + executor.unwrapped.close() + + # === Start of implementation details. === + + @validator("slurm_partition") + def validate_slurm_partition(cls, value, *, values, **kwargs): + del kwargs + if values["type"] == cls.Type.SLURM: + assert value, f"Must specify a partition for executor: {values['executor']}" + return value + + @root_validator + def local_always_blocks(cls, values): + if values["type"] == cls.Type.LOCAL or values["type"] == cls.Type.NOOP: + values["block"] = True + + return values + + class Config: + validate_assignment = True + + +class WrappedExecutor: + """An executor-like interface that records all jobs that are submitted.""" + + def __init__(self, executor, name: str): + self.unwrapped = executor + self.jobs = [] + self.name = name + + def submit(self, *args, **kwargs): + job = self.unwrapped.submit(*args, **kwargs) + logger.info("Submitting job %s to %s ...", job.job_id, self) + self.jobs.append(job) + return job + + def __repr__(self) -> str: + return self.name + + +def wait_on_jobs(jobs, executor_name: str = "executor", cancel_on_error: bool = True): + njobs = len(jobs) + jobs = deque(jobs) + + def cancel_all_jobs(jobs): + print(f"Cancelling {len(jobs)} {executor_name} jobs") + for job in jobs: + try: + job.cancel() + except: # noqa + pass + + # Produce a list of the first few job IDs + max_num_job_ids_to_show = 8 + job_ids = [j.job_id for j in islice(jobs, max_num_job_ids_to_show)] + job_ids = ", ".join(str(x) for x in job_ids) + job_ids = f"job ID: {job_ids}" if len(jobs) == 1 else f"job IDs: {job_ids}" + if len(jobs) > max_num_job_ids_to_show: + job_ids = f"{job_ids} ..." + + logger.info( + f"Waiting for {len(jobs)} {executor_name} jobs to complete with {job_ids}" + ) + completed = 0 + while jobs: + job = jobs.popleft() + if cancel_on_error: + try: + job.result() + completed += 1 + logger.info(f"Jobs completed = {completed} of {njobs} ...") + except Exception as e: # noqa Intentionally broad. + logger.error(f"Caught: {type(e).__name__}: {e}") + jobs.append(job) + return cancel_all_jobs(jobs) + else: + job.result() + completed += 1 + logger.info(f"Jobs completed = {completed} of {njobs} ...") + logger.info("All done.") + + +class LocalParallelExecutor: + """An executor which uses a process pool to process jobs in parallel on the + local machine. + """ + + class LocalJob: + def __init__(self, job_id: int, async_result, timeout_seconds: int): + self._async_result = async_result + self.job_id = job_id + self.timeout_seconds = timeout_seconds + + def result(self): + return self._async_result.get(timeout=self.timeout_seconds) + + def cancel(self): + pass + + def __init__(self, cpus: int, timeout_seconds: int): + self.last_job_id = 0 + self.process_pool = multiprocessing.Pool(cpus) + self.timeout_seconds = timeout_seconds + self.futures = [] + + def submit(self, fn, *args, **kwargs): + self.last_job_id += 1 + self.futures.append(self.process_pool.apply_async(fn, args, kwargs)) + return self.LocalJob( + self.last_job_id, + self.futures[-1], + self.timeout_seconds, + ) + + def close(self): + # Block until all jobs have completed. + for future in self.futures: + future.get() + self.process_pool.close() + + +class LocalSynchronousExecutor: + """An executor where each job is executed synchronously when result() is + called.""" + + class LocalJob: + def __init__(self, job_id: int, fn, *args, **kwargs): + self._callback = lambda: fn(*args, **kwargs) + self.job_id = job_id + + def result(self): + return self._callback() + + def cancel(self): + pass + + def __init__(self): + self.last_job_id = 0 + + def submit(self, fn, *args, **kwargs): + self.last_job_id += 1 + return self.LocalJob(self.last_job_id, fn, *args, **kwargs) + + +class DummyExecutor: + class DummyJob: + def __init__(self, job_id: int): + self.job_id = job_id + + def result(self): + return None + + def cancel(self): + pass + + def __init__(self) -> None: + self.last_job_id = 0 + + def submit(self, fn, *args, **kwargs): + del fn + del args + del kwargs + self.last_job_id += 1 + return self.DummyJob(self.last_job_id) diff --git a/examples/llvm_autotuning/executor_test.py b/examples/llvm_autotuning/executor_test.py new file mode 100644 index 000000000..61a23d7e1 --- /dev/null +++ b/examples/llvm_autotuning/executor_test.py @@ -0,0 +1,35 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Integration tests for the LLVM autotuners.""" +import sys + +import pytest +from llvm_autotuning.executor import Executor + + +def _hello_fn(): + return "Hello, world" + + +@pytest.mark.xfail( + sys.platform == "darwin", + reason="'ResourceWarning: unclosed ' when type == local", +) +@pytest.mark.parametrize("type", ["local", "debug", "slurm"]) +def test_no_args_call(tmpdir, type: str): + with Executor(type=type, cpus=1).get_executor(logs_dir=tmpdir) as executor: + job = executor.submit(_hello_fn) + assert job.result() == "Hello, world" + + +def _add_fn(a, b, *args, **kwargs): + return a + b + sum(args) + kwargs["c"] + + +@pytest.mark.parametrize("type", ["local", "debug", "slurm"]) +def test_call_with_args(tmpdir, type: str): + with Executor(type=type, cpus=1).get_executor(logs_dir=tmpdir) as executor: + job = executor.submit(_add_fn, 1, 1, 1, 1, c=1, d=None) + assert job.result() == 5 diff --git a/examples/llvm_autotuning/experiment.py b/examples/llvm_autotuning/experiment.py new file mode 100644 index 000000000..06ce53674 --- /dev/null +++ b/examples/llvm_autotuning/experiment.py @@ -0,0 +1,175 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import json +import logging +from pathlib import Path +from typing import Iterable, List + +import gym +import pandas as pd +import yaml +from llvm_autotuning.autotuners import Autotuner +from llvm_autotuning.benchmarks import Benchmarks +from llvm_autotuning.executor import Executor +from pydantic import BaseModel, Field + +from compiler_gym import CompilerEnvStateWriter + +logger = logging.getLogger(__name__) + + +class Experiment(BaseModel): + """The composition of a full autotuning experiment, comprising autotuner, + executor, and programs to tune. + """ + + # === Start of fields list. === + + executor: Executor + """The execution environment to use for training / testing jobs.""" + + autotuner: Autotuner + + benchmarks: Benchmarks + """The set of benchmarks to test on.""" + + working_directory: Path + """The working directory where logs and other artifacts are written to.""" + + experiment: str = "unnamed_experiment" + """A logical name for this experiment. This is used for naming RLlib + trials. + """ + + num_replicas: int = Field(default=1, ge=1) + """The number of duplicate jobs to run. E.g. for training, this will train + :code:`n` independent models in trials that share the same working + directory. + """ + + seed: int = 0xCC + """A numeric random seed.""" + + # === Start of public API. === + + def run(self) -> None: + """Run the experiment.""" + + # The working directory may already have been created by hydra, so we + # will check for the config.json file below to see if this experiment + # has already run. + self.working_directory.mkdir(parents=True, exist_ok=True) + + # Dump the parsed config to file. + assert not self.config_path.is_file(), ( + f"Refusing to overwrite file: {self.config_path}. " + "Is the working directory clean?" + ) + with open(self.config_path, "w") as f: + print(json.dumps(json.loads(self.json()), indent=2), file=f) + logger.info("Wrote %s", self.config_path) + + results_num = 0 + with self.executor.get_executor( + logs_dir=self.working_directory / "logs" + ) as executor: + with gym.make("llvm-v0") as env: + for replica_num in range(self.num_replicas): + for benchmark in self.benchmarks.benchmark_uris_iterator(env): + results_num += 1 + results_path = ( + self.working_directory / f"results-{results_num}.csv" + ) + executor.submit( + _experiment_worker, + autotuner=self.autotuner, + benchmark=benchmark, + results_path=results_path, + seed=self.seed + replica_num, + ) + + def yaml(self) -> str: + """Serialize the model configuration to a YAML string.""" + # We can't directly dump the dict() representation because we need to + # simplify the types first, so we go via JSON. + simplified_data = json.loads(self.json()) + return yaml.dump(simplified_data) + + @property + def config_path(self) -> Path: + return self.working_directory / "config.json" + + @property + def results_paths(self) -> Iterable[Path]: + """Return an iterator over results files.""" + for path in self.working_directory.iterdir(): + if path.is_file() and path.name.startswith("results-"): + yield path + + @property + def configuration_number(self) -> str: + return self.working_directory.name.split("-")[-1] + + @property + def timestamp(self) -> str: + return f"{self.working_directory.parent.parent.name}/{self.working_directory.parent.name}" + + @property + def dataframe(self) -> pd.DataFrame: + """Return the results as a dataframe.""" + dfs = [] + for path in self.results_paths: + dfs.append(pd.read_csv(path)) + + if not dfs: + return pd.DataFrame() + + return pd.concat(dfs) + + @classmethod + def from_logsdir(cls, working_directory: Path) -> List["Experiment"]: + """Reconstruct experiments by recursively reading from logs directories.""" + + def find_config_dumps(dir: Path) -> Iterable[Path]: + """Attempt to locate config files recursively in directories.""" + if (dir / "config.json").is_file(): + yield dir / "config.json" + return + + for entry in dir.iterdir(): + if entry.is_dir(): + yield from find_config_dumps(entry) + + experiments: List[Experiment] = [] + for config_path in find_config_dumps(working_directory): + with open(config_path) as f: + try: + config = json.load(f) + config["working_directory"] = config_path.parent + experiments.append(cls(**config)) + except json.decoder.JSONDecodeError as e: + logger.warning( + "Failed to parse JSON for model file %s: %s", config, e + ) + continue + return experiments + + # === Start of implementation details. === + + class Config: + validate_assignment = True + + +def _experiment_worker( + autotuner: Autotuner, benchmark: str, results_path: Path, seed: int +) -> None: + with autotuner.optimization_target.make_env(benchmark) as env: + env.seed(seed) + env.action_space.seed(seed) + state = autotuner(benchmark, seed=seed) + + logger.info("State %s", state) + with CompilerEnvStateWriter(open(results_path, "w")) as writer: + writer.write_state(state, flush=True) diff --git a/examples/llvm_autotuning/info.py b/examples/llvm_autotuning/info.py new file mode 100644 index 000000000..c0a576864 --- /dev/null +++ b/examples/llvm_autotuning/info.py @@ -0,0 +1,102 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import sys +from pathlib import Path +from typing import List + +import pandas as pd +from llvm_autotuning.experiment import Experiment +from pydantic import ValidationError +from tabulate import tabulate +from typer import Typer + +from compiler_gym.util.statistics import geometric_mean + +app = Typer() + + +def experiments_from_paths(log_dirs: List[Path]) -> List[Experiment]: + experiments: List[Experiment] = [] + for path in log_dirs: + try: + experiments += Experiment.from_logsdir(Path(path).expanduser()) + except ValidationError as e: + print(e, file=sys.stderr) + sys.exit(1) + return experiments + + +@app.command() +def info( + log_dirs: List[Path] = ["~/logs/llvm_autotuning"], + all_runs: bool = False, + group_by_working_directory: bool = False, +): + experiments = experiments_from_paths(log_dirs) + + results = [] + for experiment in experiments: + df = experiment.dataframe + if not len(df): + continue + + walltimes = df[["benchmark", "walltime"]].groupby("benchmark").mean() + rewards = df[["benchmark", "reward"]].groupby("benchmark").agg(geometric_mean) + num_results = len(df) + num_benchmarks = len(set(df["benchmark"])) + + df = pd.concat((walltimes, rewards), axis=1) + avg_walltime = df["walltime"].mean() + avg_reward = geometric_mean(df["reward"]) + df = pd.concat( + ( + df, + pd.DataFrame( + [{"walltime": avg_walltime, "reward": avg_reward}], + index=["Average"], + ), + ) + ) + + df = df.reset_index() + df.insert(0, "config", experiment.configuration_number) + df.insert(0, "timestamp", experiment.timestamp) + df.insert(0, "experiment", experiment.experiment) + + if all_runs: + print(experiment.working_directory) + print(tabulate(df, showindex=False, headers="keys", tablefmt="grid")) + print() + + results.append( + { + "working_directory": experiment.working_directory, + "experiment": experiment.experiment, + "timestamp": experiment.timestamp, + "config": experiment.configuration_number, + "num_benchmarks": num_benchmarks, + "num_results": num_results, + "walltime": avg_walltime, + "reward": avg_reward, + } + ) + + df = pd.DataFrame(results) + if not len(df): + print("No results") + return + print("---------------------------------------") + print("Aggregate over experiments:") + if group_by_working_directory: + df = df.groupby(["working_directory"]).mean() + else: + df = df.groupby(["experiment", "timestamp", "config"]).mean() + + pd.set_option("display.max_rows", None) + print(df) + + +if __name__ == "__main__": + app() diff --git a/examples/llvm_autotuning/just_keep_going_env.py b/examples/llvm_autotuning/just_keep_going_env.py new file mode 100644 index 000000000..c36926682 --- /dev/null +++ b/examples/llvm_autotuning/just_keep_going_env.py @@ -0,0 +1,64 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging + +from compiler_gym.wrappers import CompilerEnvWrapper + +logger = logging.getLogger(__name__) + + +# TODO(github.com/facebookresearch/CompilerGym/issues/469): Once step() and +# reset() no longer raise exceptions than this wrapper class can be removed. +class JustKeepGoingEnv(CompilerEnvWrapper): + """This wrapper class prevents the step(), reset(), or close() methods from + raising an exception. + + Just keep swimming ... + |\\ o + | \\ o + |\\ / .\\ o + | | ( + |/\\ / + | / + |/ + """ + + def step(self, *args, **kwargs): + try: + return self.env.step(*args, **kwargs) + except Exception as e: # pylint: disable=broad-except + logger.warning("step() error: %s", e) + + # Return "null" observation / reward. + default_observation = ( + self.env.observation_space_spec.default_value + if self.env.observation_space + else None + ) + default_reward = ( + float( + self.env.reward_space_spec.reward_on_error(self.env.episode_reward) + ) + if self.env.reward_space + else None + ) + + self.close() + + return default_observation, default_reward, True, {"error_details": str(e)} + + def reset(self, *args, **kwargs): + try: + return super().reset(*args, **kwargs) + except Exception as e: # pylint: disable=broad-except + logger.warning("reset() error, retrying: %s", e) + self.close() + return self.reset(*args, **kwargs) + + def close(self): + try: + self.env.close() + except Exception as e: # pylint: disable=broad-except + logger.warning("Ignoring close() error: %s", e) diff --git a/examples/llvm_autotuning/optimization_target.py b/examples/llvm_autotuning/optimization_target.py new file mode 100644 index 000000000..2be2833b3 --- /dev/null +++ b/examples/llvm_autotuning/optimization_target.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +from enum import Enum +from threading import Lock + +import numpy as np +from llvm_autotuning.just_keep_going_env import JustKeepGoingEnv + +import compiler_gym +from compiler_gym.envs import LlvmEnv +from compiler_gym.wrappers import RuntimePointEstimateReward + +logger = logging.getLogger(__name__) + +_RUNTIME_LOCK = Lock() + + +class OptimizationTarget(str, Enum): + CODESIZE = "codesize" + BINSIZE = "binsize" + RUNTIME = "runtime" + + @property + def optimization_space_enum_name(self) -> str: + return { + OptimizationTarget.CODESIZE: "IrInstructionCount", + OptimizationTarget.BINSIZE: "ObjectTextSizeBytes", + OptimizationTarget.RUNTIME: "Runtime", + }[self.value] + + def make_env(self, benchmark: str) -> LlvmEnv: + env: LlvmEnv = compiler_gym.make("llvm-v0", benchmark=benchmark) + + if self.value == OptimizationTarget.CODESIZE: + env.reward_space = "IrInstructionCountOz" + elif self.value == OptimizationTarget.BINSIZE: + env.reward_space = "ObjectTextSizeOz" + elif self.value == OptimizationTarget.RUNTIME: + env = RuntimePointEstimateReward(env, warmup_count=0, runtime_count=3) + else: + assert False, f"Unknown OptimizationTarget: {self.value}" + + # Wrap the env to ignore errors during search. + env = JustKeepGoingEnv(env) + + return env + + def final_reward(self, env: LlvmEnv, runtime_count: int = 30) -> float: + """Compute the final reward of the environment. + + Note that this may modify the environment state. You should call + :code:`reset()` before continuing to use the environment after this. + """ + # Reapply the environment state in a retry loop. + actions = list(env.actions) + env.reset() + for i in range(1, 5 + 1): + _, _, done, info = env.step(actions) + if not done: + break + logger.warning( + "Attempt %d to apply actions during final reward failed: %s", + i, + info.get("error_details"), + ) + else: + raise ValueError("Failed to replay environment's actions") + + if self.value == OptimizationTarget.CODESIZE: + return ( + env.observation.IrInstructionCountOz() + / env.observation.IrInstructionCount() + ) + + if self.value == OptimizationTarget.BINSIZE: + return ( + env.observation.ObjectTextSizeOz() + / env.observation.ObjectTextSizeBytes() + ) + + if self.value == OptimizationTarget.RUNTIME: + with _RUNTIME_LOCK: + with compiler_gym.make("llvm-v0", benchmark=env.benchmark) as new_env: + new_env.reset() + new_env.runtime_observation_count = runtime_count + new_env.runtime_warmup_count = 0 + new_env.apply(env.state) + final_runtimes = new_env.observation.Runtime() + assert len(final_runtimes) == runtime_count + + new_env.reset() + new_env.send_param("llvm.apply_baseline_optimizations", "-O3") + o3_runtimes = new_env.observation.Runtime() + assert len(o3_runtimes) == runtime_count + + logger.debug("O3 runtimes: %s", o3_runtimes) + logger.debug("Final runtimes: %s", final_runtimes) + speedup = np.median(o3_runtimes) / np.median(final_runtimes) + logger.debug("Speedup: %.4f", speedup) + + return speedup + + assert False, f"Unknown OptimizationTarget: {self.value}" diff --git a/examples/llvm_autotuning/tune.py b/examples/llvm_autotuning/tune.py new file mode 100644 index 000000000..2f51238e4 --- /dev/null +++ b/examples/llvm_autotuning/tune.py @@ -0,0 +1,40 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +import os +import sys + +import hydra +from llvm_autotuning.experiment import Experiment +from omegaconf import DictConfig, OmegaConf +from pydantic import ValidationError + +from compiler_gym.util.shell_format import indent + + +@hydra.main(config_path="config", config_name="default") +def main(config: DictConfig) -> None: + logging.basicConfig(level=logging.DEBUG) + + # Parse the config to pydantic models. + OmegaConf.set_readonly(config, True) + try: + model: Experiment = Experiment(working_directory=os.getcwd(), **config) + except ValidationError as e: + print(e, file=sys.stderr) + sys.exit(1) + + print("Experiment configuration:") + print() + print(indent(model.yaml())) + print() + + model.run() + print() + print("Results written to", model.working_directory) + + +if __name__ == "__main__": + main() diff --git a/examples/setup.py b/examples/setup.py new file mode 100644 index 000000000..26e342ac9 --- /dev/null +++ b/examples/setup.py @@ -0,0 +1,22 @@ +import distutils.util + +import setuptools + +with open("../VERSION") as f: + version = f.read().strip() + +setuptools.setup( + name="compiler_gym_examples", + version=version, + description="Example code for CompilerGym", + author="Facebook AI Research", + url="https://github.com/facebookresearch/CompilerGym", + license="MIT", + packages=[ + "llvm_autotuning", + "llvm_autotuning.autotuners", + ], + python_requires=">=3.8", + platforms=[distutils.util.get_platform()], + zip_safe=False, +) From b3d23cf23c4242df8cf8f54f55db79ef3091eabf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 8 Nov 2021 19:13:06 +0000 Subject: [PATCH 174/254] [examples] Add a usage example to docstring. --- examples/llvm_autotuning/just_keep_going_env.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/llvm_autotuning/just_keep_going_env.py b/examples/llvm_autotuning/just_keep_going_env.py index c36926682..c7da6952f 100644 --- a/examples/llvm_autotuning/just_keep_going_env.py +++ b/examples/llvm_autotuning/just_keep_going_env.py @@ -23,6 +23,12 @@ class JustKeepGoingEnv(CompilerEnvWrapper): |/\\ / | / |/ + + Usage: + + >>> env = compiler_gym.make("llvm-v0") + >>> env = JustKeepGoingEnv(env) + # enjoy ... """ def step(self, *args, **kwargs): From 305d71ed3c28817bec2750aa99a5d6d185e20cf4 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Thu, 11 Nov 2021 22:21:07 -0500 Subject: [PATCH 175/254] invoke loop_unroller in our unrolling env example --- .../loop_unroller/loop_unroller.cc | 18 +++++++++--------- .../example_unrolling_service/service_py/BUILD | 7 +------ .../service_py/example_service.py | 5 ++--- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 99b4df41b..9dbed31b3 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -138,14 +138,6 @@ int main(int argc, char** argv) { SourceMgr SM; std::error_code EC; - ToolOutputFile Out(OutputFilename, EC, sys::fs::OF_None); - if (EC) { - Err = SMDiagnostic(OutputFilename, SourceMgr::DK_Error, - "Could not open output file: " + EC.message()); - Err.print(argv[0], errs()); - return 1; - } - std::unique_ptr Module = readModule(Context, InputFilename); if (!Module) @@ -161,12 +153,20 @@ int main(int argc, char** argv) { PM.add(createLoopUnrollPass()); PM.run(*Module); + // Log loop stats for (auto& x : Counter->counts) { llvm::dbgs() << x.first << ": " << x.second << " loops" << '\n'; } + // Output modified IR + ToolOutputFile Out(OutputFilename, EC, sys::fs::OF_None); + if (EC) { + Err = SMDiagnostic(OutputFilename, SourceMgr::DK_Error, + "Could not open output file: " + EC.message()); + Err.print(argv[0], errs()); + return 1; + } Module->print(Out.os(), nullptr, false); - Out.keep(); return 0; diff --git a/examples/example_unrolling_service/service_py/BUILD b/examples/example_unrolling_service/service_py/BUILD index 8da6a5c31..ec30ddf0f 100644 --- a/examples/example_unrolling_service/service_py/BUILD +++ b/examples/example_unrolling_service/service_py/BUILD @@ -4,16 +4,11 @@ # LICENSE file in the root directory of this source tree. load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") -alias( - name = "loop_unroller", - actual = "//examples/example_unrolling_service/loop_unroller:loop_unroller", -) - py_binary( name = "example-unrolling-service-py", srcs = ["example_service.py"], data = [ - ":loop_unroller", + "//examples/example_unrolling_service/loop_unroller", ], main = "example_service.py", visibility = ["//visibility:public"], diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 4e87eaa0b..861b20849 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -172,12 +172,11 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo # convert - to -f arg = arg[0] + "f" + arg[1:] args[i] = arg - print("args: ", args) run_command( [ - "loop_unroller", - *args, + "../loop_unroller/loop_unroller", self._llvm_path, + *args, "-o", self._llvm_path, ], From 60916042c00d0537cbb7c5a1a0341cc5f52b6902 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Thu, 11 Nov 2021 22:24:44 -0500 Subject: [PATCH 176/254] add header --- .../example_unrolling_service/loop_unroller/loop_unroller.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index 9dbed31b3..fd58fff04 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -1,3 +1,7 @@ +// Copyright (c) Facebook, Inc. and its affiliates. +// +// This source code is licensed under the MIT license found in the +// LICENSE file in the root directory of this source tree. #include #include #include From bef3c4b4db77e2ae26b150e8c899f87c8b4f4ac2 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Thu, 11 Nov 2021 22:39:29 -0500 Subject: [PATCH 177/254] fill README file --- examples/example_unrolling_service/loop_unroller/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/example_unrolling_service/loop_unroller/README.md b/examples/example_unrolling_service/loop_unroller/README.md index a0990367e..e4e80980c 100644 --- a/examples/example_unrolling_service/loop_unroller/README.md +++ b/examples/example_unrolling_service/loop_unroller/README.md @@ -1 +1,6 @@ -TBD +LLVM's opt does not always enforce the unrolling options passed as cli arguments. Hence, we created our own exeutable with custom unrolling pass in examples/example_unrolling_service/loop_unroller that enforces the unrolling factors passed in its cli. + +To run the custom unroller: +``` +bazel run //examples/example_unrolling_service/loop_unroller:loop_unroller -- .ll -o .ll --funroll-count= +``` From 2a0be19ba27ccc09d32af0b7609b508c51449161 Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 12 Nov 2021 17:26:02 -0500 Subject: [PATCH 178/254] add option to output to bitcode file or IR assembly --- .../loop_unroller/README.md | 2 +- .../loop_unroller/loop_unroller.cc | 44 ++++++++++++++----- .../service_py/example_service.py | 1 + 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/examples/example_unrolling_service/loop_unroller/README.md b/examples/example_unrolling_service/loop_unroller/README.md index e4e80980c..5684e6580 100644 --- a/examples/example_unrolling_service/loop_unroller/README.md +++ b/examples/example_unrolling_service/loop_unroller/README.md @@ -2,5 +2,5 @@ LLVM's opt does not always enforce the unrolling options passed as cli arguments To run the custom unroller: ``` -bazel run //examples/example_unrolling_service/loop_unroller:loop_unroller -- .ll -o .ll --funroll-count= +bazel run //examples/example_unrolling_service/loop_unroller:loop_unroller -- .ll --funroll-count= -S -o .ll ``` diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index fd58fff04..d92a8f64f 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -12,9 +12,11 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Bitcode/BitcodeWriterPass.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" @@ -26,6 +28,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/LoopUtils.h" @@ -43,10 +46,25 @@ cl::opt OutputFilename("o", cl::desc("Specify output filename"), static cl::opt UnrollEnable("floop-unroll", cl::desc("Enable loop unrolling"), cl::init(true)); -extern cl::opt UnrollCount( +static cl::opt UnrollCount( "funroll-count", cl::desc("Use this unroll count for all loops including those with " "unroll_count pragma values, for testing purposes")); +// Force binary on terminals +static cl::opt Force("f", cl::desc("Enable binary output on terminals")); + +// Output assembly +static cl::opt OutputAssembly("S", cl::desc("Write output as LLVM assembly"), cl::Hidden); + +// Preserve use list order +static cl::opt PreserveBitcodeUseListOrder( + "preserve-bc-uselistorder", cl::desc("Preserve use-list order when writing LLVM bitcode."), + cl::init(true), cl::Hidden); + +static cl::opt PreserveAssemblyUseListOrder( + "preserve-ll-uselistorder", cl::desc("Preserve use-list order when writing LLVM assembly."), + cl::init(false), cl::Hidden); + // The INITIALIZE_PASS_XXX macros put the initialiser in the llvm namespace. void initializeLoopCounterPass(PassRegistry& Registry); @@ -147,6 +165,15 @@ int main(int argc, char** argv) { if (!Module) return 1; + // Prepare output + ToolOutputFile Out(OutputFilename, EC, sys::fs::OF_None); + if (EC) { + Err = SMDiagnostic(OutputFilename, SourceMgr::DK_Error, + "Could not open output file: " + EC.message()); + Err.print(argv[0], errs()); + return 1; + } + // Run the passes initializeLoopCounterPass(*PassRegistry::getPassRegistry()); legacy::PassManager PM; @@ -155,6 +182,12 @@ int main(int argc, char** argv) { PM.add(Counter); PM.add(UnrollConfigurator); PM.add(createLoopUnrollPass()); + // Passes to output the module + if (OutputAssembly) { + PM.add(createPrintModulePass(Out.os(), "", PreserveAssemblyUseListOrder)); + } else if (Force || !CheckBitcodeOutputToConsole(Out.os())) { + PM.add(createBitcodeWriterPass(Out.os(), PreserveBitcodeUseListOrder)); + } PM.run(*Module); // Log loop stats @@ -162,15 +195,6 @@ int main(int argc, char** argv) { llvm::dbgs() << x.first << ": " << x.second << " loops" << '\n'; } - // Output modified IR - ToolOutputFile Out(OutputFilename, EC, sys::fs::OF_None); - if (EC) { - Err = SMDiagnostic(OutputFilename, SourceMgr::DK_Error, - "Could not open output file: " + EC.message()); - Err.print(argv[0], errs()); - return 1; - } - Module->print(Out.os(), nullptr, false); Out.keep(); return 0; diff --git a/examples/example_unrolling_service/service_py/example_service.py b/examples/example_unrolling_service/service_py/example_service.py index 861b20849..e115c5de5 100755 --- a/examples/example_unrolling_service/service_py/example_service.py +++ b/examples/example_unrolling_service/service_py/example_service.py @@ -177,6 +177,7 @@ def apply_action(self, action: Action) -> Tuple[bool, Optional[ActionSpace], boo "../loop_unroller/loop_unroller", self._llvm_path, *args, + "-S", "-o", self._llvm_path, ], From 724f23c985c613c3f9613396134f4c0458b7becd Mon Sep 17 00:00:00 2001 From: Mostafa Elhoushi Date: Fri, 12 Nov 2021 17:42:42 -0500 Subject: [PATCH 179/254] make -S option appear when calling --help --- .../example_unrolling_service/loop_unroller/loop_unroller.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc index d92a8f64f..29c87559a 100644 --- a/examples/example_unrolling_service/loop_unroller/loop_unroller.cc +++ b/examples/example_unrolling_service/loop_unroller/loop_unroller.cc @@ -54,7 +54,7 @@ static cl::opt UnrollCount( static cl::opt Force("f", cl::desc("Enable binary output on terminals")); // Output assembly -static cl::opt OutputAssembly("S", cl::desc("Write output as LLVM assembly"), cl::Hidden); +static cl::opt OutputAssembly("S", cl::desc("Write output as LLVM assembly")); // Preserve use list order static cl::opt PreserveBitcodeUseListOrder( From 63af914d6ece0e82f748c9ff2b83a320bf724e71 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 8 Nov 2021 19:32:07 +0000 Subject: [PATCH 180/254] [docs] Merge docs makefile into top level. --- Makefile | 4 ++-- docs/Makefile | 19 ------------------- docs/make.bat | 39 --------------------------------------- 3 files changed, 2 insertions(+), 60 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/make.bat diff --git a/Makefile b/Makefile index 05c598f09..4465e73c1 100644 --- a/Makefile +++ b/Makefile @@ -262,10 +262,10 @@ doxygen-rst: cd docs && $(PYTHON) generate_cc_rst.py docs: gendocs bazel-build doxygen - PYTHONPATH=$(ROOT)/bazel-bin/package.runfiles/CompilerGym $(MAKE) -C docs html + PYTHONPATH=$(ROOT)/bazel-bin/package.runfiles/CompilerGym sphinx-build -M html docs/source docs/build $(SPHINXOPTS) livedocs: gendocs doxygen - PYTHONPATH=$(ROOT)/bazel-bin/package.runfiles/CompilerGym $(MAKE) -C docs livehtml + PYTHONPATH=$(ROOT)/bazel-bin/package.runfiles/CompilerGym sphinx-autobuild docs/source docs/build $(SPHINXOPTS) --pre-build 'make gendocs bazel-build doxygen' --watch compiler_gym .PHONY: doxygen doxygen-rst diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 5b7de500e..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -.DEFAULT_GOAL := help - -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -BUILDDIR = build - -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -livehtml: - sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) --pre-build 'make -C .. gendocs bazel-build doxygen' --watch ../compiler_gym $(O) - -# 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) - -.PHONY: help livehtml Makefile diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 264998508..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,39 +0,0 @@ -@ECHO OFF -REM Copyright (c) Facebook, Inc. and its affiliates. -REM -REM This source code is licensed under the MIT license found in the -REM LICENSE file in the root directory of this source tree. - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 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 From 6f2780fca3bff79a8df30302c5efd65d618da3c1 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 8 Nov 2021 17:02:42 +0000 Subject: [PATCH 181/254] [examples] Add a default logsfile to gcc_search.py. --- examples/gcc_search.py | 45 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/examples/gcc_search.py b/examples/gcc_search.py index 5b7e511d1..58d6f031d 100644 --- a/examples/gcc_search.py +++ b/examples/gcc_search.py @@ -4,6 +4,7 @@ # LICENSE file in the root directory of this source tree. import random from itertools import islice +from pathlib import Path from typing import Callable, List, Optional, Tuple from absl import app, flags @@ -11,6 +12,7 @@ import compiler_gym import compiler_gym.util.flags.seed # noqa Flag definition. from compiler_gym.envs.gcc import DEFAULT_GCC, GccEnv +from compiler_gym.util.runfiles_path import create_user_logs_dir FLAGS = flags.FLAGS flags.DEFINE_string( @@ -28,7 +30,12 @@ flags.DEFINE_integer( "timeout", 20, "Timeout for each compilation in seconds", lower_bound=1 ) -flags.DEFINE_string("log", None, "Filename to log progress") +flags.DEFINE_string( + "log", + None, + "Filename to log progress. " + "Defaults to ~/logs/compiler_gym/gcc_autotuning//log.csv", +) flags.DEFINE_integer( "n", 100, "Maximum number of compilations per benchmark", lower_bound=1 ) @@ -74,7 +81,8 @@ def __str__(self) -> str: class ChoicesSearch: """Base class for searches.""" - def __init__(self, benchmark: str): + def __init__(self, logfile: Path, benchmark: str): + self.logfile = logfile self.benchmark = benchmark # We record the best point as we go self.best = ChoicesSearchPoint(None, None) @@ -127,11 +135,8 @@ def log_pt(self, n: int, pt: ChoicesSearchPoint): bname = self.benchmark.replace("benchmark://", "") scale = self.baseline.size / pt.size if pt.size != 0 else "-" - if FLAGS.log: - with open(FLAGS.log, "a") as f: - print( - f"{scale}, {pt.size}, {n}, {','.join(map(str, pt.choices))}", file=f - ) + with open(self.logfile, "a") as f: + print(f"{scale}, {pt.size}, {n}, {','.join(map(str, pt.choices))}", file=f) print( f"{bname} scale={scale}, size={pt.size}, n={n}, choices={','.join(map(lambda c: str(c) if c != -1 else '-', pt.choices))}" @@ -141,9 +146,6 @@ def log_pt(self, n: int, pt: ChoicesSearchPoint): class RandomChoicesSearch(ChoicesSearch): """A simple random search""" - def __init__(self, benchmark: str): - super().__init__(benchmark) - def random_choices(self) -> List: """Get a random set of choices""" return [ @@ -161,9 +163,6 @@ def step(self, env): class RandomWalkActionsSearch(ChoicesSearch): """Randomly select actions""" - def __init__(self, benchmark: str): - super().__init__(benchmark) - def step(self, env): before = env.choices for i in range(FLAGS.actions_per_step): @@ -179,9 +178,6 @@ def step(self, env): class HillClimbActionsSearch(ChoicesSearch): """Randomly select actions and accept if they make things better""" - def __init__(self, benchmark: str): - super().__init__(benchmark) - def step(self, env): best = self.best.choices if self.best.choices is not None else env.choices env.choices = best @@ -201,8 +197,8 @@ class GAChoicesSearch(ChoicesSearch): mutator_fn = Callable[[List[int]], List[int]] replace_fn = Callable[[List[List[int]]], int] - def __init__(self, benchmark: str): - super().__init__(benchmark) + def __init__(self, logfile: Path, benchmark: str): + super().__init__(logfile=logfile, benchmark=benchmark) self.pop = [] # Operators @@ -419,6 +415,8 @@ def step(self, env): def main(argv): + del argv # Unused. + search_map = { "random": RandomChoicesSearch, "action-walk": RandomWalkActionsSearch, @@ -451,7 +449,16 @@ def get_benchmarks(): else: benchmarks = FLAGS.gcc_benchmark - searches = [search_cls(benchmark=benchmark) for benchmark in benchmarks] + logfile = ( + FLAGS.log + if FLAGS.log + else (create_user_logs_dir("gcc_autotuning") / "logs.csv") + ) + print("Logging results to", logfile) + + searches = [ + search_cls(logfile=logfile, benchmark=benchmark) for benchmark in benchmarks + ] for search in searches: search.run() From 199675432f1a4bdc2882c06279d4012f4c71aec1 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 8 Nov 2021 17:05:47 +0000 Subject: [PATCH 182/254] [examples] Test GCC search using docker/system GCC. --- examples/gcc_search_test.py | 77 ++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/examples/gcc_search_test.py b/examples/gcc_search_test.py index ce53609a4..a5a7dfa90 100644 --- a/examples/gcc_search_test.py +++ b/examples/gcc_search_test.py @@ -2,37 +2,76 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +import subprocess import sys +from functools import lru_cache +from pathlib import Path +from typing import Iterable +import docker import gcc_search +import pytest from absl.flags import FLAGS -from compiler_gym.service import EnvironmentNotSupported +def docker_is_available() -> bool: + """Return whether docker is available.""" + try: + docker.from_env() + return True + except docker.errors.DockerException: + return False + + +@lru_cache(maxsize=2) +def system_gcc_is_available() -> bool: + """Return whether there is a system GCC available.""" + try: + stdout = subprocess.check_output( + ["gcc", "--version"], universal_newlines=True, stderr=subprocess.DEVNULL + ) + # On some systems "gcc" may alias to a different compiler, so check for + # the presence of the name "gcc" in the first line of output. + return "gcc" in stdout.split("\n")[0].lower() + except (subprocess.CalledProcessError, FileNotFoundError): + return False + + +def system_gcc_path() -> str: + """Return the path of the system GCC as a string.""" + return subprocess.check_output( + ["which", "gcc"], universal_newlines=True, stderr=subprocess.DEVNULL + ).strip() -def test_gcc_search_smoke_test(capsys): + +def gcc_bins() -> Iterable[str]: + """Return a list of available GCCs.""" + if docker_is_available(): + yield "docker:gcc:11.2.0" + if system_gcc_is_available(): + yield system_gcc_path() + + +@pytest.fixture(scope="module", params=gcc_bins()) +def gcc_bin(request) -> str: + return request.param + + +def test_gcc_search_smoke_test(gcc_bin: str, capsys, tmpdir: Path): + tmpdir = Path(tmpdir) flags = [ "argv0", "--seed=0", - "--episode_len=2", - "--episodes=10", - "--log_interval=5", - "--benchmark=cbench-v1/crc32", + f"--log={tmpdir}/log.csv", + f"--gcc_bin={gcc_bin}", + "--gcc_benchmark=benchmark://chstone-v0/aes", + "--search=random", + "--n=3", ] sys.argv = flags FLAGS.unparse_flags() FLAGS(flags) - try: - gcc_search.main( - [ - "gcc_search", - "--gcc_benchmark=benchmark://chstone-v0/aes", - "--search=random", - "--n=3", - ] - ) - out, _ = capsys.readouterr() - assert "benchmark://chstone-v0/aes" in out - except EnvironmentNotSupported: - pass # GCC environment might not be supported + gcc_search.main([]) + out, _ = capsys.readouterr() + assert "benchmark://chstone-v0/aes" in out From 948e0d2a05b731cf6d6ad755bac71a634ff010af Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 8 Nov 2021 17:24:42 +0000 Subject: [PATCH 183/254] [examples] Add a retry loop around GCC observation. --- examples/gcc_search.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/gcc_search.py b/examples/gcc_search.py index 58d6f031d..231a1d712 100644 --- a/examples/gcc_search.py +++ b/examples/gcc_search.py @@ -12,6 +12,7 @@ import compiler_gym import compiler_gym.util.flags.seed # noqa Flag definition. from compiler_gym.envs.gcc import DEFAULT_GCC, GccEnv +from compiler_gym.service import ServiceError from compiler_gym.util.runfiles_path import create_user_logs_dir FLAGS = flags.FLAGS @@ -108,6 +109,12 @@ def make(self) -> GccEnv: def objective(self, env) -> int: """Get the objective from an environment""" + # Retry loop to defend against flaky environment. + for _ in range(3): + try: + return env.observation[FLAGS.objective] + except ServiceError: + env.reset() return env.observation[FLAGS.objective] def step(self, env) -> ChoicesSearchPoint: From b19112f9a895400ffb0beaf046b10f7f875b314d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 09:38:34 +0000 Subject: [PATCH 184/254] [bazel] Add explicit dependency on util packages. --- BUILD.bazel | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BUILD.bazel b/BUILD.bazel index 7eeec61f5..b7c444185 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -25,6 +25,8 @@ py_library( "//compiler_gym/service", "//compiler_gym/service/runtime", "//compiler_gym/spaces", + "//compiler_gym/util", + "//compiler_gym/util/flags", "//compiler_gym/views", ], ) From b97739006b77385666310da64248f42f5d153511 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 10:08:48 +0000 Subject: [PATCH 185/254] [examples] Improve GCC progress logging. --- examples/gcc_search.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/gcc_search.py b/examples/gcc_search.py index 231a1d712..f104cd851 100644 --- a/examples/gcc_search.py +++ b/examples/gcc_search.py @@ -141,12 +141,15 @@ def log_pt(self, n: int, pt: ChoicesSearchPoint): """Log the current point""" bname = self.benchmark.replace("benchmark://", "") - scale = self.baseline.size / pt.size if pt.size != 0 else "-" + scaled_size = self.baseline.size / pt.size if pt.size != 0 else "-" with open(self.logfile, "a") as f: - print(f"{scale}, {pt.size}, {n}, {','.join(map(str, pt.choices))}", file=f) + print( + f"{self.benchmark}, {scaled_size}, {pt.size}, {n}, {','.join(map(str, pt.choices))}", + file=f, + ) print( - f"{bname} scale={scale}, size={pt.size}, n={n}, choices={','.join(map(lambda c: str(c) if c != -1 else '-', pt.choices))}" + f"{bname} scaled_size={scaled_size}, size={pt.size}, n={n}, choices={','.join(map(lambda c: str(c) if c != -1 else '-', pt.choices))}" ) @@ -461,6 +464,8 @@ def get_benchmarks(): if FLAGS.log else (create_user_logs_dir("gcc_autotuning") / "logs.csv") ) + logfile.parent.mkdir(exist_ok=True, parents=True) + logfile.touch() print("Logging results to", logfile) searches = [ From 28e6afa174a2c699ca4856bea319a17a44e5d2e8 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 10:46:31 +0000 Subject: [PATCH 186/254] [util] Move Executor class into compiler_gym.util. Moving this class into the core compiler_gym library enables it to be reused by other example code and other users. --- compiler_gym/requirements.txt | 1 + compiler_gym/util/BUILD | 1 + .../llvm_autotuning => compiler_gym/util}/executor.py | 4 ++-- examples/llvm_autotuning/experiment.py | 2 +- tests/util/BUILD | 9 +++++++++ .../llvm_autotuning => tests/util}/executor_test.py | 5 +++-- 6 files changed, 17 insertions(+), 5 deletions(-) rename {examples/llvm_autotuning => compiler_gym/util}/executor.py (98%) rename {examples/llvm_autotuning => tests/util}/executor_test.py (91%) diff --git a/compiler_gym/requirements.txt b/compiler_gym/requirements.txt index 721c9590d..1e26aad44 100644 --- a/compiler_gym/requirements.txt +++ b/compiler_gym/requirements.txt @@ -11,4 +11,5 @@ numpy>=1.19.3 protobuf>=3.13.0 pydantic>=1.8.0 requests>=2.24.0 +submitit>=1.2.0 tabulate>=0.8.7 diff --git a/compiler_gym/util/BUILD b/compiler_gym/util/BUILD index 483cee72e..cfdcdb892 100644 --- a/compiler_gym/util/BUILD +++ b/compiler_gym/util/BUILD @@ -14,6 +14,7 @@ py_library( "debug_util.py", "decorators.py", "download.py", + "executor.py", "filesystem.py", "gym_type_hints.py", "logs.py", diff --git a/examples/llvm_autotuning/executor.py b/compiler_gym/util/executor.py similarity index 98% rename from examples/llvm_autotuning/executor.py rename to compiler_gym/util/executor.py index f7feae564..4cf72fb9e 100644 --- a/examples/llvm_autotuning/executor.py +++ b/compiler_gym/util/executor.py @@ -19,7 +19,7 @@ class Executor(BaseModel): - """Defines the execution environment for jobs. + """Defines an execution environment for jobs. E.g. a node on a cluster, the local machine, etc. To create jobs, instantiate this class and submit functions to using the executor API: @@ -76,7 +76,7 @@ class Type(str, Enum): # === Start of public API. === @contextmanager - def get_executor(self, logs_dir: Path, cpus=None): + def get_executor(self, logs_dir: Path, cpus=None) -> "Executor": cpus = cpus or self.cpus if self.type == self.Type.SLURM: executor = AutoExecutor(folder=logs_dir) diff --git a/examples/llvm_autotuning/experiment.py b/examples/llvm_autotuning/experiment.py index 06ce53674..042baf883 100644 --- a/examples/llvm_autotuning/experiment.py +++ b/examples/llvm_autotuning/experiment.py @@ -12,10 +12,10 @@ import yaml from llvm_autotuning.autotuners import Autotuner from llvm_autotuning.benchmarks import Benchmarks -from llvm_autotuning.executor import Executor from pydantic import BaseModel, Field from compiler_gym import CompilerEnvStateWriter +from compiler_gym.util.executor import Executor logger = logging.getLogger(__name__) diff --git a/tests/util/BUILD b/tests/util/BUILD index 1ea676530..808a016cf 100644 --- a/tests/util/BUILD +++ b/tests/util/BUILD @@ -33,6 +33,15 @@ py_test( ], ) +py_test( + name = "executor_test", + srcs = ["executor_test.py"], + deps = [ + "//compiler_gym/util", + "//tests:test_main", + ], +) + cc_test( name = "EnumUtilTest", srcs = ["EnumUtilTest.cc"], diff --git a/examples/llvm_autotuning/executor_test.py b/tests/util/executor_test.py similarity index 91% rename from examples/llvm_autotuning/executor_test.py rename to tests/util/executor_test.py index 61a23d7e1..350173254 100644 --- a/examples/llvm_autotuning/executor_test.py +++ b/tests/util/executor_test.py @@ -2,11 +2,12 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Integration tests for the LLVM autotuners.""" +"""Unit tests for compiler_gym.util.executor.""" import sys import pytest -from llvm_autotuning.executor import Executor + +from compiler_gym.util.executor import Executor def _hello_fn(): From 283ea64be828a1535091a2a93d8245e9674b6c2c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 11:01:29 +0000 Subject: [PATCH 187/254] [util] Make submitit library a soft dependency. Rather than adding submitit to the list of core dependencies, defer module import until it is needed, printing an error message if it is not available. --- compiler_gym/requirements.txt | 1 - compiler_gym/util/executor.py | 8 +++++++- examples/requirements.txt | 1 + tests/util/executor_test.py | 35 +++++++++++++++++++++++++++++------ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/compiler_gym/requirements.txt b/compiler_gym/requirements.txt index 1e26aad44..721c9590d 100644 --- a/compiler_gym/requirements.txt +++ b/compiler_gym/requirements.txt @@ -11,5 +11,4 @@ numpy>=1.19.3 protobuf>=3.13.0 pydantic>=1.8.0 requests>=2.24.0 -submitit>=1.2.0 tabulate>=0.8.7 diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index 4cf72fb9e..0c107d313 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -13,7 +13,6 @@ from pydantic import BaseModel, Field, validator from pydantic.class_validators import root_validator -from submitit import AutoExecutor logger = logging.getLogger(__name__) @@ -79,6 +78,13 @@ class Type(str, Enum): def get_executor(self, logs_dir: Path, cpus=None) -> "Executor": cpus = cpus or self.cpus if self.type == self.Type.SLURM: + try: + from submitit import AutoExecutor + except ImportError as e: + raise OSError( + "Using the slurm executor requires the submitit library. " + "Install submitit using: python -m pip install submitit" + ) from e executor = AutoExecutor(folder=logs_dir) executor.update_parameters( timeout_min=int(round(self.timeout_hours * 60)), diff --git a/examples/requirements.txt b/examples/requirements.txt index c31cde583..3c07da627 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,4 +1,5 @@ nevergrad>=0.4.3 opentuner>=0.8.5 submitit>=1.2.0 +submitit>=1.2.0 torch>=1.6.0 diff --git a/tests/util/executor_test.py b/tests/util/executor_test.py index 350173254..5a3bd9b56 100644 --- a/tests/util/executor_test.py +++ b/tests/util/executor_test.py @@ -4,12 +4,37 @@ # LICENSE file in the root directory of this source tree. """Unit tests for compiler_gym.util.executor.""" import sys +from typing import Iterable import pytest from compiler_gym.util.executor import Executor +def submitit_installed(): + """Determine if submitit library is available.""" + try: + import submitit # noqa + + return True + except ImportError: + return False + + +def executor_types() -> Iterable[str]: + """Yield the types of executor.""" + yield "local" + yield "debug" + if submitit_installed(): + yield "slurm" + + +@pytest.fixture(scope="module", params=list(executor_types())) +def executor_type(request) -> str: + """Test fixture which yields an executor type.""" + return request.param + + def _hello_fn(): return "Hello, world" @@ -18,9 +43,8 @@ def _hello_fn(): sys.platform == "darwin", reason="'ResourceWarning: unclosed ' when type == local", ) -@pytest.mark.parametrize("type", ["local", "debug", "slurm"]) -def test_no_args_call(tmpdir, type: str): - with Executor(type=type, cpus=1).get_executor(logs_dir=tmpdir) as executor: +def test_no_args_call(tmpdir, executor_type: str): + with Executor(type=executor_type, cpus=1).get_executor(logs_dir=tmpdir) as executor: job = executor.submit(_hello_fn) assert job.result() == "Hello, world" @@ -29,8 +53,7 @@ def _add_fn(a, b, *args, **kwargs): return a + b + sum(args) + kwargs["c"] -@pytest.mark.parametrize("type", ["local", "debug", "slurm"]) -def test_call_with_args(tmpdir, type: str): - with Executor(type=type, cpus=1).get_executor(logs_dir=tmpdir) as executor: +def test_call_with_args(tmpdir, executor_type: str): + with Executor(type=executor_type, cpus=1).get_executor(logs_dir=tmpdir) as executor: job = executor.submit(_add_fn, 1, 1, 1, 1, c=1, d=None) assert job.result() == 5 From cabf69ac5b1d436d4f67fe280e567bb92ebb39b7 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 11:11:51 +0000 Subject: [PATCH 188/254] [examples] GCC script updates. --- examples/gcc_autotuning/README.md | 94 +++++++++ examples/gcc_autotuning/info.py | 68 +++++++ .../{gcc_search.py => gcc_autotuning/tune.py} | 186 ++++++++++++------ .../tune_test.py} | 8 +- 4 files changed, 290 insertions(+), 66 deletions(-) create mode 100644 examples/gcc_autotuning/README.md create mode 100644 examples/gcc_autotuning/info.py rename examples/{gcc_search.py => gcc_autotuning/tune.py} (76%) rename examples/{gcc_search_test.py => gcc_autotuning/tune_test.py} (88%) diff --git a/examples/gcc_autotuning/README.md b/examples/gcc_autotuning/README.md new file mode 100644 index 000000000..f752e81e5 --- /dev/null +++ b/examples/gcc_autotuning/README.md @@ -0,0 +1,94 @@ +# Autotuning for GCC command line flags + +This directory contains scripts to autotune the GCC environment using black box +optimization strategies. + +- [Usage](#usage) + - [Running autotuning experiments](#running-autotuning-experiments) + - [Overview of results](#overview-of-results) +- [Reproducing the results from our paper](#reproducing-the-results-from-our-paper) + + +## Usage + +There are two scripts, [tune.py](tune.py) and [info.py](info.py). The tuning +script is used to run the autotuning experiments and record log the results to +CSV files. The info script reads and aggregates results over many multiple CSV +files. + + +### Running autotuning experiments + +Invoke the tuning script using: + +``` +python -m gcc_autotuning.tune +``` + +Where `` is a list of configuration arguments. Key configuration +options are: + +| Argument | Description | +|---------------------------|------------------------------------------------------------------------| +| `--gcc_bin` | Binary to use for GCC. Use `docker:` for docker. | +| `--gcc_benchmark` | List of benchmarks to autotune. Defaults to the 12 CHStone benchmarks. | +| `--search` | Types of autotuning to perform. | +| `--gcc_search_budget` | Maximum number of compilations per benchmark. | +| `--gcc_search_reptitions` | Number of times to repeat each search. | +| `--objective` | Objective function to optimize for. One of {obj_size,asm_size}. | +| `--output_dir` | Base output directory. Default: `~/logs/compiler_gym/gcc_autotuning`. | + +For example, to run a genetic algorithm search with a budget of 100 compilations +on two CHStone benchmarks: + +```sh +python -m gcc_autotuning.tune \ + --gcc_bin=docker:gcc:11.2.0 \ + --seed=204 \ + --search=genetic \ + --gcc_search_budget=100 \ + --gcc_search_repetitions=3 \ + --gcc_benchmark=benchmark://chstone-v0/aes,benchmark://chstone-v0/sha +``` + +See `--helpfull` for a full list of arguments. + + +### Overview of results + +Summarize autotuning results using: + +``` +python -m gcc_autotuning.info +``` + +This aggregates results in the default `~/logs/compiler_gym/gcc_autotuning` +directory. Specify one or more different directories as command line arguments, +e.g.: + +``` +python -m gcc_autotuning.info /path/to/logs/dir/a ~/logs_dir_b +``` + + +## Reproducing the results from our paper + +To reproduce the experiments in Section VII.D of [our +paper](https://arxiv.org/pdf/2109.08267.pdf), run: + +```sh +python -m gcc_autotuning.tune \ + --gcc_bin=docker:gcc:11.2.0 \ + --seed=204 \ + --search=random,hillclimb,genetic \ + --gcc_search_budget=1000 \ + --gcc_search_repetitions=3 \ + --gcc_benchmark=benchmark://chstone-v0/adpcm,benchmark://chstone-v0/aes,benchmark://chstone-v0/blowfish,benchmark://chstone-v0/dfadd,benchmark://chstone-v0/dfdiv,benchmark://chstone-v0/dfmul,benchmark://chstone-v0/dfsin,benchmark://chstone-v0/gsm,benchmark://chstone-v0/jpeg,benchmark://chstone-v0/mips,benchmark://chstone-v0/motion,benchmark://chstone-v0/sha +``` + +Then use the [info.py](info.py) script to print the results and compare against +Table V in the paper: + +```sh +python -m gcc_autouning.info +``` diff --git a/examples/gcc_autotuning/info.py b/examples/gcc_autotuning/info.py new file mode 100644 index 000000000..59787d2f4 --- /dev/null +++ b/examples/gcc_autotuning/info.py @@ -0,0 +1,68 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import os +import sys +from pathlib import Path +from typing import List + +import pandas as pd +from llvm_autotuning.experiment import Experiment +from pydantic import ValidationError +from tabulate import tabulate +from typer import Typer + +from compiler_gym.util.statistics import geometric_mean + +app = Typer() + + +def experiments_from_paths(log_dirs: List[Path]) -> List[Experiment]: + experiments: List[Experiment] = [] + for path in log_dirs: + try: + experiments += Experiment.from_logsdir(Path(path).expanduser()) + except ValidationError as e: + print(e, file=sys.stderr) + sys.exit(1) + return experiments + + +@app.command() +def info( + log_dirs: List[Path] = ["~/logs/compiler_gym/gcc_autotuning"], +): + dfs: List[pd.DataFrame] = [] + + for path in log_dirs: + path = Path(path).expanduser() + for root, _, files in os.walk(path): + if "results.csv" not in files: + continue + + root = Path(root) + + df = pd.read_csv(root / "results.csv") + if not df.size: + continue + + df["timestamp"] = "-".join([root.parent.name, root.name]) + + dfs.append(df) + + if not dfs: + print("No results") + + df = pd.concat(dfs) + df = ( + df.groupby(["timestamp", "search"])[["scaled_size"]] + .agg(geometric_mean) + .reset_index() + ) + df = df.rename(columns={"scaled_size": "geomean_binsize_reduction"}) + print(tabulate(df, showindex=False, headers="keys", tablefmt="grid")) + + +if __name__ == "__main__": + app() diff --git a/examples/gcc_search.py b/examples/gcc_autotuning/tune.py similarity index 76% rename from examples/gcc_search.py rename to examples/gcc_autotuning/tune.py index f104cd851..3940dc2a2 100644 --- a/examples/gcc_search.py +++ b/examples/gcc_autotuning/tune.py @@ -2,17 +2,23 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +"""Autotuning script for GCC command line options. +""" import random from itertools import islice from pathlib import Path -from typing import Callable, List, Optional, Tuple +from typing import Callable, Dict, List, NamedTuple, Optional, Tuple from absl import app, flags +from gcc_autotuning.info import info import compiler_gym +import compiler_gym.util.flags.nproc # noqa Flag definition. +import compiler_gym.util.flags.output_dir # noqa Flag definition. import compiler_gym.util.flags.seed # noqa Flag definition. from compiler_gym.envs.gcc import DEFAULT_GCC, GccEnv from compiler_gym.service import ServiceError +from compiler_gym.util.executor import Executor from compiler_gym.util.runfiles_path import create_user_logs_dir FLAGS = flags.FLAGS @@ -20,25 +26,27 @@ "gcc_bin", DEFAULT_GCC, "Binary to use for gcc. Use docker: for docker" ) flags.DEFINE_list( - "gcc_benchmark", None, "List of benchmarks to search. Use 'all' for all" + "gcc_benchmark", + None, + "List of benchmarks to search. Use 'all' for all. " + "Defaults to the 12 CHStone benchmarks.", ) -flags.DEFINE_enum( +flags.DEFINE_list( "search", - "random", - ["random", "action-walk", "action-climb", "genetic"], - "Type of search to perform", + ["random", "hillclimb", "genetic"], + "Type of search to perform. One of: {random,action-walk,hillclimb,genetic}", ) flags.DEFINE_integer( "timeout", 20, "Timeout for each compilation in seconds", lower_bound=1 ) -flags.DEFINE_string( - "log", - None, - "Filename to log progress. " - "Defaults to ~/logs/compiler_gym/gcc_autotuning//log.csv", +flags.DEFINE_integer( + "gcc_search_budget", + 100, + "Maximum number of compilations per benchmark", + lower_bound=1, ) flags.DEFINE_integer( - "n", 100, "Maximum number of compilations per benchmark", lower_bound=1 + "gcc_search_repetitions", 1, "Number of times to repeat each search", lower_bound=1 ) flags.DEFINE_integer( "actions_per_step", @@ -84,6 +92,7 @@ class ChoicesSearch: def __init__(self, logfile: Path, benchmark: str): self.logfile = logfile + self.logfile.touch() self.benchmark = benchmark # We record the best point as we go self.best = ChoicesSearchPoint(None, None) @@ -98,7 +107,7 @@ def __init__(self, logfile: Path, benchmark: str): env.close() # The number of points to search - self.n = FLAGS.n + self.n = FLAGS.gcc_search_budget def make(self) -> GccEnv: """Make an environment""" @@ -143,10 +152,7 @@ def log_pt(self, n: int, pt: ChoicesSearchPoint): scaled_size = self.baseline.size / pt.size if pt.size != 0 else "-" with open(self.logfile, "a") as f: - print( - f"{self.benchmark}, {scaled_size}, {pt.size}, {n}, {','.join(map(str, pt.choices))}", - file=f, - ) + print(self.benchmark, scaled_size, pt.size, n, *pt.choices, sep=",", file=f) print( f"{bname} scaled_size={scaled_size}, size={pt.size}, n={n}, choices={','.join(map(lambda c: str(c) if c != -1 else '-', pt.choices))}" @@ -175,8 +181,7 @@ class RandomWalkActionsSearch(ChoicesSearch): def step(self, env): before = env.choices - for i in range(FLAGS.actions_per_step): - env.step(env.action_space.sample()) + env.step([env.action_space.sample() for _ in range(FLAGS.actions_per_step)]) after = env.choices size = self.objective(env) pt = ChoicesSearchPoint(after, size) @@ -191,8 +196,7 @@ class HillClimbActionsSearch(ChoicesSearch): def step(self, env): best = self.best.choices if self.best.choices is not None else env.choices env.choices = best - for i in range(FLAGS.actions_per_step): - env.step(env.action_space.sample()) + env.step([env.action_space.sample() for _ in range(FLAGS.actions_per_step)]) after = env.choices size = self.objective(env) return ChoicesSearchPoint(after, size) @@ -424,66 +428,122 @@ def step(self, env): return pt +_SEARCH_CLASS_MAP: Dict[str, ChoicesSearch] = { + "random": RandomChoicesSearch, + "action-walk": RandomWalkActionsSearch, + "hillclimb": HillClimbActionsSearch, + "genetic": GAChoicesSearch, +} + + +class SearchResult(NamedTuple): + search: str + benchmark: str + best_size: int + baseline_size: int + + @property + def scaled_best(self) -> float: + return self.baseline_size / self.best_size + + +def run_search(search: str, logfile: Path, benchmark: str) -> SearchResult: + """Run a search and return the search class instance.""" + search_class = _SEARCH_CLASS_MAP[search] + job: ChoicesSearch = search_class(logfile=logfile, benchmark=benchmark) + job.run() + return SearchResult( + search=search, + benchmark=benchmark, + best_size=job.best.size, + baseline_size=job.baseline.size, + ) + + def main(argv): del argv # Unused. - search_map = { - "random": RandomChoicesSearch, - "action-walk": RandomWalkActionsSearch, - "action-climb": HillClimbActionsSearch, - "genetic": GAChoicesSearch, - } - search_cls = search_map[FLAGS.search] + # Validate the --search values now. + for search in FLAGS.search: + if search not in _SEARCH_CLASS_MAP: + raise app.UsageError(f"Invalid --search value: {search}") if FLAGS.seed: random.seed(FLAGS.seed) - def get_benchmarks(): + def get_benchmarks_from_all_datasets(): + """Enumerate first 50 benchmarks from each dataset.""" benchmarks = [] - env = compiler_gym.make("gcc-v0", gcc_bin=FLAGS.gcc_bin) - env.reset() - for dataset in env.datasets: - benchmarks += islice(dataset.benchmark_uris(), 50) - env.close() + with compiler_gym.make("gcc-v0", gcc_bin=FLAGS.gcc_bin) as env: + env.reset() + for dataset in env.datasets: + benchmarks += islice(dataset.benchmark_uris(), 50) benchmarks.sort() return benchmarks - if not FLAGS.gcc_benchmark: - print("Benchmark not given") - print("Select from:") - print("\n".join(get_benchmarks())) - return + def get_chstone_benchmark_uris() -> List: + with compiler_gym.make("gcc-v0", gcc_bin=FLAGS.gcc_bin) as env: + return list(env.datasets["benchmark://chstone-v0"].benchmark_uris()) if FLAGS.gcc_benchmark == ["all"]: - benchmarks = get_benchmarks() - else: + benchmarks = get_benchmarks_from_all_datasets() + elif FLAGS.gcc_benchmark: benchmarks = FLAGS.gcc_benchmark + else: + benchmarks = get_chstone_benchmark_uris() - logfile = ( - FLAGS.log - if FLAGS.log - else (create_user_logs_dir("gcc_autotuning") / "logs.csv") + logdir = ( + Path(FLAGS.output_dir) + if FLAGS.output_dir + else create_user_logs_dir("gcc_autotuning") ) - logfile.parent.mkdir(exist_ok=True, parents=True) - logfile.touch() - print("Logging results to", logfile) - - searches = [ - search_cls(logfile=logfile, benchmark=benchmark) for benchmark in benchmarks - ] - for search in searches: - search.run() - - for search in searches: - print(search.benchmark, search.best) - - for search in searches: + logdir.mkdir(exist_ok=True, parents=True) + with open(logdir / "results.csv", "w") as f: print( - search.benchmark, - search.best.size, - search.baseline.size, - search.baseline.size / search.best.size, + "search", + "benchmark", + "scaled_size", + "size", + "baseline_size", + sep=",", + file=f, ) + print("Logging results to", logdir) + + # Parallel execution environment. Use flag --nproc to control the number of + # worker processes. + executor = Executor(type="local", timeout_hours=12, cpus=FLAGS.nproc, block=True) + with executor.get_executor(logs_dir=logdir) as session: + jobs = [] + # Submit each search instance as a separate job. + for _ in range(FLAGS.gcc_search_repetitions): + for search in FLAGS.search: + for benchmark in benchmarks: + jobs.append( + session.submit( + run_search, + search=search, + logfile=logdir / f"search-job-{len(jobs):04d}-log.csv", + benchmark=benchmark, + ) + ) + + for job in jobs: + result = job.result() + print(result.benchmark, f"{result.scaled_best:.3f}x", sep="\t") + with open(logdir / "results.csv", "a") as f: + print( + result.search, + result.benchmark, + result.scaled_best, + result.best_size, + result.baseline_size, + sep=",", + file=f, + ) + + # Print results aggregates. + info([logdir]) if __name__ == "__main__": diff --git a/examples/gcc_search_test.py b/examples/gcc_autotuning/tune_test.py similarity index 88% rename from examples/gcc_search_test.py rename to examples/gcc_autotuning/tune_test.py index a5a7dfa90..1710d8695 100644 --- a/examples/gcc_search_test.py +++ b/examples/gcc_autotuning/tune_test.py @@ -57,15 +57,16 @@ def gcc_bin(request) -> str: return request.param -def test_gcc_search_smoke_test(gcc_bin: str, capsys, tmpdir: Path): +@pytest.mark.parametrize("search", ["random", "genetic"]) +def test_gcc_search_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): tmpdir = Path(tmpdir) flags = [ "argv0", "--seed=0", - f"--log={tmpdir}/log.csv", + f"--output_dir={tmpdir}", f"--gcc_bin={gcc_bin}", "--gcc_benchmark=benchmark://chstone-v0/aes", - "--search=random", + f"--search={search}", "--n=3", ] sys.argv = flags @@ -75,3 +76,4 @@ def test_gcc_search_smoke_test(gcc_bin: str, capsys, tmpdir: Path): gcc_search.main([]) out, _ = capsys.readouterr() assert "benchmark://chstone-v0/aes" in out + assert (tmpdir / "results.csv").is_file() From ac3cccc4c98bf12bd54a6afe352c7782341cc0f8 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 9 Nov 2021 16:02:43 +0000 Subject: [PATCH 189/254] [examples] Overhaul the loop tool sweep example. --- examples/loop_tool_sweep.py | 106 ++++++++++++++++++++++++++++++++ examples/run_loop_tool_sweep.py | 50 --------------- examples/run_loop_tool_sweep.sh | 34 ---------- 3 files changed, 106 insertions(+), 84 deletions(-) create mode 100644 examples/loop_tool_sweep.py delete mode 100644 examples/run_loop_tool_sweep.py delete mode 100755 examples/run_loop_tool_sweep.sh diff --git a/examples/loop_tool_sweep.py b/examples/loop_tool_sweep.py new file mode 100644 index 000000000..e4be863c2 --- /dev/null +++ b/examples/loop_tool_sweep.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +from itertools import product +from pathlib import Path +from typing import List, Optional + +from typer import Typer + +import compiler_gym +from compiler_gym.util.runfiles_path import create_user_logs_dir + +logger = logging.getLogger(__name__) + +app = Typer() + + +def wrapped_step(env, action): + done = True + while done: + observation, reward, done, info = env.step(action) + if done: + logger.warning("Step failed: %s", info["error_details"]) + env.reset() + return observation, reward, done, info + + +def flops_after_steps(env, num_steps): + wrapped_step(env, [1] * (num_steps - 1)) + env.observation_space = "flops" + observation, _, _, _ = wrapped_step(env, 1) + env.observation_space = None + return observation + + +def run_one_sweep( + device: str, + k: int, + vectorize: int = 4, + linear: bool = False, + logdir: Optional[Path] = None, +): + """Run a single sweep.""" + logdir = logdir or create_user_logs_dir("loop_tool_sweep") + logfile = logdir / f"k{k}-v{vectorize}-{'linear' if linear else 'log'}-{device}.txt" + with open(logfile, "w") as f: + print("device", "k", "inner", "vectorize", "flops", sep=",", file=f) + print("Logging results to", logfile) + + def log(k, inner, vectorize, flops): + print(device.upper(), k, inner, vectorize, flops, sep="\t", flush=True) + with open(logfile, "a") as f: + print(device, k, inner, vectorize, flops, sep=",", file=f) + + actions = [3, 0, 1, 3, 0] + k *= 1024 # raw number of elements + + with compiler_gym.make("loop_tool-v0") as env: + env.reset( + benchmark=env.datasets.benchmark( + uri=f"benchmark://loop_tool-{device}-v0/{k}" + ), + action_space="simple", + ) + if vectorize - 1: + vs = [1] * (vectorize - 1) + actions += vs + [0, 1, 0] + vs + [0, 2, 0] + for a in actions: + wrapped_step(env, a) + + if linear: + for i in range(k // (vectorize * 1024)): + step_count = 1022 if i == 0 else 1023 + flops = flops_after_steps(env, step_count) + log(k, (i + 1) * 1024, vectorize, flops) + else: # linear=False (log) + inner = 1 + step = 512 + wrapped_step(env, [1] * (step - 1)) + inner += step - 1 + while inner * vectorize <= k: + flops = flops_after_steps(env, step) + inner += step + log(k, inner, vectorize, flops) + step *= 2 + + +@app.command() +def sweep( + device: List[str] = ["cuda"], + k: List[int] = [512, 1024, 2048, 4096, 8192], + vectorize: List[int] = [4], + linear: List[bool] = [False], + logdir: Optional[Path] = None, +): + logdir = logdir or create_user_logs_dir("loop_tool_sweep") + for device_, k_, vectorize_, linear_ in product(device, k, vectorize, linear): + run_one_sweep( + device=device_, k=k_, vectorize=vectorize_, linear=linear_, logdir=logdir + ) + + +if __name__ == "__main__": + app() diff --git a/examples/run_loop_tool_sweep.py b/examples/run_loop_tool_sweep.py deleted file mode 100644 index 05bcf9cb5..000000000 --- a/examples/run_loop_tool_sweep.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -# -# This source code is licensed under the MIT license found in the -# LICENSE file in the root directory of this source tree. -import sys - -import compiler_gym - -names = ["toggle_mode", "up", "down", "toggle_thread"] -actions = [3, 0, 1, 3, 0] -base = 1024 * 512 -K = int(sys.argv[1]) * base - -vectorize = int(sys.argv[2]) -run_log = int(sys.argv[3]) -with compiler_gym.make("loop_tool-v0") as env: - env.reset( - benchmark=env.datasets.benchmark(uri="benchmark://loop_tool-v0/{}".format(K)), - action_space="simple", - ) - if vectorize - 1: - vs = [1] * (vectorize - 1) - actions += vs + [0, 1, 0] + vs + [0, 2, 0] - for a in actions: - o = env.step(a) - - if run_log: - env.observation_space = "action_state" - inner = 1 - step = 512 - for i in range(1, step): - o = env.step(1) - inner += 1 - while inner * vectorize < K: - env.observation_space = "loop_tree" - for i in range(step): - if i == step - 1: - env.observation_space = "flops" - o = env.step(1) - inner += 1 - print(f"{K}, {inner}, {vectorize}: {o[0]}", flush=True) - step *= 2 - else: - for i in range(K // (vectorize * 1024)): - env.observation_space = "action_state" - for j in range(1022 if i == 0 else 1023): - o = env.step(1) - env.observation_space = "flops" - o = env.step(1) - print(f"{K}, {(i + 1) * 1024}, {vectorize}: {o[0]}", flush=True) diff --git a/examples/run_loop_tool_sweep.sh b/examples/run_loop_tool_sweep.sh deleted file mode 100755 index 0dad73f5b..000000000 --- a/examples/run_loop_tool_sweep.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# Copyright (c) Facebook, Inc. and its affiliates. -# -# This source code is licensed under the MIT license found in the -# LICENSE file in the root directory of this source tree. -set -ve -mkdir -p results - -python run_loop_tool_sweep.py 1 4 1 | tee results/s1_v4_log.txt -python run_loop_tool_sweep.py 1 1 1 | tee results/s1_v1_log.txt - -python run_loop_tool_sweep.py 2 4 1 | tee results/s2_v4_log.txt -python run_loop_tool_sweep.py 2 1 1 | tee results/s2_v1_log.txt - -python run_loop_tool_sweep.py 4 4 1 | tee results/s4_v4_log.txt -python run_loop_tool_sweep.py 4 1 1 | tee results/s4_v1_log.txt - -python run_loop_tool_sweep.py 8 4 1 | tee results/s8_v4_log.txt -python run_loop_tool_sweep.py 8 1 1 | tee results/s8_v1_log.txt - -python run_loop_tool_sweep.py 16 4 1 | tee results/s16_v4_log.txt -python run_loop_tool_sweep.py 16 1 1 | tee results/s16_v1_log.txt - -python run_loop_tool_sweep.py 1 4 0 | tee results/s1_v4_linear.txt -python run_loop_tool_sweep.py 1 1 0 | tee results/s1_v1_linear.txt - -python run_loop_tool_sweep.py 2 4 0 | tee results/s2_v4_linear.txt -python run_loop_tool_sweep.py 2 1 0 | tee results/s2_v1_linear.txt - -python run_loop_tool_sweep.py 4 4 0 | tee results/s4_v4_linear.txt -python run_loop_tool_sweep.py 4 1 0 | tee results/s4_v1_linear.txt - -python run_loop_tool_sweep.py 8 4 0 | tee results/s8_v4_linear.txt -python run_loop_tool_sweep.py 8 1 0 | tee results/s8_v1_linear.txt From 3b9016041d0da072efe319dadefdf4fb9773960f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 11:13:29 +0000 Subject: [PATCH 190/254] [examples] Improve and simplify GCC autotuning. --- examples/gcc_autotuning/tune.py | 495 ++++++--------------------- examples/gcc_autotuning/tune_test.py | 5 +- examples/requirements.txt | 1 + 3 files changed, 105 insertions(+), 396 deletions(-) diff --git a/examples/gcc_autotuning/tune.py b/examples/gcc_autotuning/tune.py index 3940dc2a2..ce28cc8ec 100644 --- a/examples/gcc_autotuning/tune.py +++ b/examples/gcc_autotuning/tune.py @@ -5,18 +5,21 @@ """Autotuning script for GCC command line options. """ import random -from itertools import islice +from itertools import islice, product from pathlib import Path -from typing import Callable, Dict, List, NamedTuple, Optional, Tuple +from typing import List, NamedTuple +import numpy as np from absl import app, flags from gcc_autotuning.info import info +from geneticalgorithm import geneticalgorithm as ga import compiler_gym import compiler_gym.util.flags.nproc # noqa Flag definition. import compiler_gym.util.flags.output_dir # noqa Flag definition. import compiler_gym.util.flags.seed # noqa Flag definition. -from compiler_gym.envs.gcc import DEFAULT_GCC, GccEnv +from compiler_gym.envs import CompilerEnv +from compiler_gym.envs.gcc import DEFAULT_GCC from compiler_gym.service import ServiceError from compiler_gym.util.executor import Executor from compiler_gym.util.runfiles_path import create_user_logs_dir @@ -34,10 +37,10 @@ flags.DEFINE_list( "search", ["random", "hillclimb", "genetic"], - "Type of search to perform. One of: {random,action-walk,hillclimb,genetic}", + "Type of search to perform. One of: {random,hillclimb,genetic}", ) flags.DEFINE_integer( - "timeout", 20, "Timeout for each compilation in seconds", lower_bound=1 + "timeout", 60, "Timeout for each compilation in seconds", lower_bound=1 ) flags.DEFINE_integer( "gcc_search_budget", @@ -61,378 +64,81 @@ ) -class ChoicesSearchPoint: - """A pair of compilation choices and the resulting object file size.""" - - def __init__(self, choices: List[int], size: Optional[int]): - """If size is None then float.inf will be used to make comparisons easier.""" - self.choices = choices - self.size = size if size is not None and size != -1 else float("inf") - - def better_than(self, other: "ChoicesSearchPoint") -> bool: - """Determine if this result is better than the best so far. - The choices are the list of choices to make. - The size is the size of object file. - Smaller size is better. - If the sizes are the same, then the sums of the choices are used. - """ - if self.size == other.size: - if self.choices is not None and other.choices is not None: - return sum(self.choices) < sum(other.choices) - else: - return self.choices - return self.size < other.size - - def __str__(self) -> str: - return f"{self.size} {self.choices}" - - -class ChoicesSearch: - """Base class for searches.""" - - def __init__(self, logfile: Path, benchmark: str): - self.logfile = logfile - self.logfile.touch() - self.benchmark = benchmark - # We record the best point as we go - self.best = ChoicesSearchPoint(None, None) - - # Create an environment and get the baselin - env = self.make() - env.reset(benchmark=self.benchmark) - self.gcc_spec = env.gcc_spec - env.timeout = FLAGS.timeout - env.step(env.action_space.names.index("-Os")) - self.baseline = ChoicesSearchPoint(env.choices, self.objective(env)) - env.close() - - # The number of points to search - self.n = FLAGS.gcc_search_budget - - def make(self) -> GccEnv: - """Make an environment""" - env = compiler_gym.make("gcc-v0", gcc_bin=FLAGS.gcc_bin) - env.reset(benchmark=self.benchmark) - env.timeout = FLAGS.timeout - return env - - def objective(self, env) -> int: - """Get the objective from an environment""" - # Retry loop to defend against flaky environment. - for _ in range(3): - try: - return env.observation[FLAGS.objective] - except ServiceError: - env.reset() - return env.observation[FLAGS.objective] - - def step(self, env) -> ChoicesSearchPoint: - """Take one search step""" - raise NotImplementedError() - - def run(self): - """Run the search.""" - env = self.make() - - while self.n > 0: - n = self.n - self.n -= 1 - - env.reset(benchmark=self.benchmark) - pt = self.step(env) - self.log_pt(n, pt) - - if pt.better_than(self.best): - self.best = pt - env.close() - - def log_pt(self, n: int, pt: ChoicesSearchPoint): - """Log the current point""" - bname = self.benchmark.replace("benchmark://", "") - - scaled_size = self.baseline.size / pt.size if pt.size != 0 else "-" - with open(self.logfile, "a") as f: - print(self.benchmark, scaled_size, pt.size, n, *pt.choices, sep=",", file=f) - - print( - f"{bname} scaled_size={scaled_size}, size={pt.size}, n={n}, choices={','.join(map(lambda c: str(c) if c != -1 else '-', pt.choices))}" - ) - - -class RandomChoicesSearch(ChoicesSearch): - """A simple random search""" - - def random_choices(self) -> List: - """Get a random set of choices""" - return [ +def random_search(env: CompilerEnv): + best = float("inf") + for _ in range(FLAGS.gcc_search_budget): + env.reset() + env.choices = [ random.randint(-1, min(FLAGS.max_range, len(opt) - 1)) - for opt in self.gcc_spec.options - ] - - def step(self, env): - choices = self.random_choices() - env.choices = choices - size = self.objective(env) - return ChoicesSearchPoint(choices, size) - - -class RandomWalkActionsSearch(ChoicesSearch): - """Randomly select actions""" - - def step(self, env): - before = env.choices - env.step([env.action_space.sample() for _ in range(FLAGS.actions_per_step)]) - after = env.choices - size = self.objective(env) - pt = ChoicesSearchPoint(after, size) - if size != -1: - env.choices = before - return pt - - -class HillClimbActionsSearch(ChoicesSearch): - """Randomly select actions and accept if they make things better""" - - def step(self, env): - best = self.best.choices if self.best.choices is not None else env.choices - env.choices = best - env.step([env.action_space.sample() for _ in range(FLAGS.actions_per_step)]) - after = env.choices - size = self.objective(env) - return ChoicesSearchPoint(after, size) - - -class GAChoicesSearch(ChoicesSearch): - """A simple, continuous genetic algorithm search""" - - init_fn = Callable[[], List[int]] - selector_fn = Callable[[List[ChoicesSearchPoint]], ChoicesSearchPoint] - xover_fn = Callable[[List[int], List[int]], List[int]] - mutator_fn = Callable[[List[int]], List[int]] - replace_fn = Callable[[List[List[int]]], int] - - def __init__(self, logfile: Path, benchmark: str): - super().__init__(logfile=logfile, benchmark=benchmark) - self.pop = [] - - # Operators - # Each is a list of functions that provide some capability, paired with - # a set of weights tha control how likely the operator will be to be - # chosen. - - # Inits are operators to create new choices - self.inits: List[GAChoicesSearch.init_fn] = [self.init()] - self.init_weights = [1] * len(self.inits) - - # Selectors choose individuals from the population - self.selectors: List[GAChoicesSearch.selector_fn] = [self.tournament(7)] - self.selector_weights = [1] * len(self.selectors) - - # Crossover operators, take two parents and produce a new child - self.xovers: List[GAChoicesSearch.xover_fn] = [ - self.xover_npoint(), - self.xover_between(), + for opt in env.gcc_spec.options ] - self.xover_weights = [1] * len(self.xovers) - - # Mutators take a set of choices and mess with them. - # Note that the identity mutator is much more likely than the others - self.mutators: List[GAChoicesSearch.mutator_fn] = [ - self.mutate_empty(1), - self.mutate_empty(10), - self.mutate_rand_elements(1), - self.mutate_rand_elements(10), - self.mutate_bump(1, 1), - self.mutate_bump(1, 5), - self.mutate_bump(5, 1), - self.mutate_bump(5, 5), - self.identity(), - ] - self.mutator_weights = [5, 1, 5, 1, 5, 1, 5, 1, 30] - - # These functions choose which individual gets replaced - self.replacers: List[GAChoicesSearch.replacer_fn] = [ - self.replace_tournament(7), - self.replace_tournament(3), - self.replace_worst(), - ] - self.replacer_weights = [10, 5, 1] - - def init(self) -> "GAChoicesSearch.init_fn": - """Returns a function that creates a random set of choices""" - - def random_choices() -> List[int]: - return [ - random.randint(-1, min(FLAGS.max_range, len(opt) - 1)) - for opt in self.gcc_spec.options - ] - - return random_choices - - def tournament(self, k: int = 7) -> "GAChoicesSearch.selector_fn": - """Returns a function which will performa tournament selection with a - tournament of the given size, k.""" - - def key(pt: ChoicesSearchPoint) -> Tuple[int, int]: - return (pt.size, sum(pt.choices)) - - def select(pop: List[ChoicesSearchPoint]) -> List[int]: - cands = random.sample(pop, k) - return min(cands, key=key) - - return select + best = min(objective(env), best) + return best - def xover_npoint(self) -> "GAChoicesSearch.xover_fn": - """Returns a function which does crossover. Given two lists of - choices, a new list of the same size is produced. Each member is - equally likely to be from either of the two parents.""" - def single(x: int, y: int) -> int: - return x if bool(random.getrandbits(1)) else y - - def change(a: List[int], b: List[int]) -> List[int]: - return [single(x, y) for x, y in zip(a, b)] - - return change - - def xover_between(self) -> "GAChoicesSearch.xover_fn": - """Returns a function which does crossover. Given two lists of - choices, a new list of the same size is produced. Each member is - randomly chosen from the range of the corresponding elements in the two - parents.""" - - def single(x: int, y: int) -> int: - return random.randint(min(x, y), max(x, y)) - - def change(a: List[int], b: List[int]) -> List[int]: - return [single(x, y) for x, y in zip(a, b)] - - return change - - def mutate_rand_elements(self, k: int) -> "GAChoicesSearch.mutator_fn": - """Returns a mutation function. It will replace k elements from the - passed in choices, randomly selecting from the available range.""" - - def change(a: List[int]) -> List[int]: - b = a.copy() - n = len(a) - for _ in range(k): - i = random.randrange(n) - b[i] = random.randrange( - -1, min(FLAGS.max_range, len(self.gcc_spec.options[i]) - 1) +def hill_climb(env: CompilerEnv): + best = float("inf") + for _ in range(FLAGS.gcc_search_budget): + with env.fork() as fkd: + fkd.choices = [ + random.randint( + max(-1, x - 5), min(len(env.gcc_spec.options[i]) - 1, x + 5) ) - return b - - return change - - def mutate_empty(self, k: int) -> "GAChoicesSearch.mutator_fn": - """Returns a mutation function. It will replace k elements from the - passed in choices with the lowest available value (-1).""" - - def change(a: List[int]) -> List[int]: - b = a.copy() - n = len(a) - for _ in range(k): - i = random.randrange(n) - b[i] = -1 - return b - - return change - - def mutate_bump(self, k: int, d: int) -> "GAChoicesSearch.mutator_fn": - """Returns a mutation function. It will increment k elements from the - passed in choices by a random amount from [-d, d]""" - - def change(a: List[int]) -> List[int]: - b = a.copy() - n = len(a) - for _ in range(k): - i = random.randrange(n) - p = random.randint(-d, d) - b[i] = min(-1, max(len(self.gcc_spec.options[i]) - 1, b[i] + p)) - return b - - return change - - def identity(self) -> "GAChoicesSearch.mutator_fn": - """Identity mutator. Does not change the choices.""" - return lambda a: a.copy() - - def replace_worst(self) -> "GAChoicesSearch.replacer_fn": - """Returns a function which, given a population, will return the index - of the worst member""" - - def key(pt: ChoicesSearchPoint) -> Tuple[int, int]: - return (pt.size, sum(pt.choices)) - - def index(pop: List[List[int]]) -> int: - return pop.index(max(pop, key=key)) - - return index - - def replace_tournament(self, k: int = 3) -> "GAChoicesSearch.replacer_fn": - """Returns a function which, given a population, will return the index - of the worst member""" - - def key(i: int) -> Tuple[int, int]: - pt = self.pop[i] - return (pt.size, sum(pt.choices)) - - def index(pop: List[List[int]]) -> int: - cands = random.sample(range(len(pop)), k) - return max(cands, key=key) - - return index - - def step(self, env): - if len(self.pop) < FLAGS.pop_size: - # We need to create a new individual - init = random.choices(self.inits, weights=self.init_weights)[0] - choices = env.choices = init() - size = self.objective(env) - pt = ChoicesSearchPoint(choices, size) - self.pop.append(pt) - else: - # Select two parents - sel_a, sel_b = random.choices( - self.selectors, weights=self.selector_weights, k=2 - ) - a = sel_a(self.pop) - b = sel_b(self.pop) - # Cross over - xover = random.choices(self.xovers, weights=self.xover_weights)[0] - choices = xover(a.choices, b.choices) - # Mutation - until we get something different from a and b - different = False - while not different: - mutate = random.choices(self.mutators, weights=self.mutator_weights)[0] - choices = mutate(choices) - different = choices != a.choices and choices != b.choices - # Evaluate - env.choices = choices - size = self.objective(env) - pt = ChoicesSearchPoint(choices, size) - # Replace - replace = random.choices(self.replacers, weights=self.replacer_weights)[0] - i = replace(self.pop) - self.pop[i] = pt - - # Report on the step - oks = [x.size for x in self.pop if x.size != float("inf")] - chs = [sum(x.choices) for x in self.pop] - size_str = f"size: min={min(oks, default='-')} max={max(oks, default='-')} avg={sum(oks) / len(oks) if oks else '-'}" - choices_str = ( - f"choices: min={min(chs)} max={max(chs)} avg={sum(chs) / len(self.pop)}" - ) - print(f"pop={len(self.pop)} ok={len(oks)} {size_str} {choices_str}") - return pt + for i, x in enumerate(env.choices) + ] + cost = objective(fkd) + if cost < objective(env): + best = cost + env.choices = fkd.choices + return best + + +def genetic_algorithm(env: CompilerEnv): + def f(choices): + env.reset() + env.choices = choices = list(map(int, choices)) + s = objective(env) + return s if s > 0 else float("inf") + + model = ga( + function=f, + dimension=len(env.gcc_spec.options), + variable_type="int", + variable_boundaries=np.array( + [[-1, min(FLAGS.max_range, len(opt) - 1)] for opt in env.gcc_spec.options] + ), + function_timeout=FLAGS.timeout, + algorithm_parameters={ + "population_size": FLAGS.pop_size, + "max_num_iteration": max(1, int(FLAGS.gcc_search_budget / FLAGS.pop_size)), + "mutation_probability": 0.1, + "elit_ratio": 0.01, + "crossover_probability": 0.5, + "parents_portion": 0.3, + "crossover_type": "uniform", + "max_iteration_without_improv": None, + }, + ) + model.run() + return model.best_function + + +def objective(env) -> int: + """Get the objective from an environment""" + # Retry loop to defend against flaky environment. + for _ in range(3): + try: + return env.observation[FLAGS.objective] + except ServiceError as e: + print(f"Objective function failed: {e}") + env.reset() + return env.observation[FLAGS.objective] -_SEARCH_CLASS_MAP: Dict[str, ChoicesSearch] = { - "random": RandomChoicesSearch, - "action-walk": RandomWalkActionsSearch, - "hillclimb": HillClimbActionsSearch, - "genetic": GAChoicesSearch, +_SEARCH_FUNCTIONS = { + "random": random_search, + "hillclimb": hill_climb, + "genetic": genetic_algorithm, } @@ -447,16 +153,23 @@ def scaled_best(self) -> float: return self.baseline_size / self.best_size -def run_search(search: str, logfile: Path, benchmark: str) -> SearchResult: +def run_search(search: str, benchmark: str, seed: int) -> SearchResult: """Run a search and return the search class instance.""" - search_class = _SEARCH_CLASS_MAP[search] - job: ChoicesSearch = search_class(logfile=logfile, benchmark=benchmark) - job.run() + random.seed(seed) + np.random.seed(seed) + + with compiler_gym.make("gcc-v0") as env: + env.reset(benchmark=benchmark) + env.step(env.action_space["-Os"]) + baseline_size = objective(env) + env.reset(benchmark=benchmark) + best_size = _SEARCH_FUNCTIONS[search](env) + return SearchResult( search=search, benchmark=benchmark, - best_size=job.best.size, - baseline_size=job.baseline.size, + best_size=best_size, + baseline_size=baseline_size, ) @@ -465,12 +178,9 @@ def main(argv): # Validate the --search values now. for search in FLAGS.search: - if search not in _SEARCH_CLASS_MAP: + if search not in _SEARCH_FUNCTIONS: raise app.UsageError(f"Invalid --search value: {search}") - if FLAGS.seed: - random.seed(FLAGS.seed) - def get_benchmarks_from_all_datasets(): """Enumerate first 50 benchmarks from each dataset.""" benchmarks = [] @@ -487,10 +197,8 @@ def get_chstone_benchmark_uris() -> List: if FLAGS.gcc_benchmark == ["all"]: benchmarks = get_benchmarks_from_all_datasets() - elif FLAGS.gcc_benchmark: - benchmarks = FLAGS.gcc_benchmark else: - benchmarks = get_chstone_benchmark_uris() + benchmarks = FLAGS.gcc_benchmark or get_chstone_benchmark_uris() logdir = ( Path(FLAGS.output_dir) @@ -516,17 +224,16 @@ def get_chstone_benchmark_uris() -> List: with executor.get_executor(logs_dir=logdir) as session: jobs = [] # Submit each search instance as a separate job. - for _ in range(FLAGS.gcc_search_repetitions): - for search in FLAGS.search: - for benchmark in benchmarks: - jobs.append( - session.submit( - run_search, - search=search, - logfile=logdir / f"search-job-{len(jobs):04d}-log.csv", - benchmark=benchmark, - ) - ) + grid = product(range(FLAGS.gcc_search_repetitions), FLAGS.search, benchmarks) + for _, search, benchmark in grid: + jobs.append( + session.submit( + run_search, + search=search, + benchmark=benchmark, + seed=FLAGS.seed + len(jobs), + ) + ) for job in jobs: result = job.result() diff --git a/examples/gcc_autotuning/tune_test.py b/examples/gcc_autotuning/tune_test.py index 1710d8695..6d7234f59 100644 --- a/examples/gcc_autotuning/tune_test.py +++ b/examples/gcc_autotuning/tune_test.py @@ -57,7 +57,7 @@ def gcc_bin(request) -> str: return request.param -@pytest.mark.parametrize("search", ["random", "genetic"]) +@pytest.mark.parametrize("search", ["random", "hillclimb", "genetic"]) def test_gcc_search_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): tmpdir = Path(tmpdir) flags = [ @@ -67,7 +67,8 @@ def test_gcc_search_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): f"--gcc_bin={gcc_bin}", "--gcc_benchmark=benchmark://chstone-v0/aes", f"--search={search}", - "--n=3", + "--pop_size=3", + "--gcc_search_budget=6", ] sys.argv = flags FLAGS.unparse_flags() diff --git a/examples/requirements.txt b/examples/requirements.txt index 3c07da627..384bfd393 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,3 +1,4 @@ +geneticalgorithm>=1.0.2 nevergrad>=0.4.3 opentuner>=0.8.5 submitit>=1.2.0 From 38a458334b567854b2737cb2dbd5d9710f5964e1 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 15:00:36 +0000 Subject: [PATCH 191/254] [examples] Fix and update LLVM autotuning. --- compiler_gym/util/executor.py | 2 +- examples/llvm_autotuning/README.md | 60 +++++++++++++++++++- examples/llvm_autotuning/config/default.yaml | 2 +- examples/llvm_autotuning/experiment.py | 2 +- examples/llvm_autotuning/info.py | 2 +- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index 0c107d313..eda0fdca7 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -53,7 +53,7 @@ class Type(str, Enum): Only used for :code:`Type.SLURM` executors. """ - cpus: int = Field(default=1, allow_mutation=False, ge=1) + cpus: int = Field(default=1, allow_mutation=False, ge=-1) """The number of CPU threads to provision. If the type of executor is :code:`Type.SLURM`, this is the number of CPU diff --git a/examples/llvm_autotuning/README.md b/examples/llvm_autotuning/README.md index b02c62952..c75cb4116 100644 --- a/examples/llvm_autotuning/README.md +++ b/examples/llvm_autotuning/README.md @@ -9,6 +9,7 @@ search strategies. - [Usage](#usage) - [Running autotuning experiments](#running-autotuning-experiments) - [Overview of results](#overview-of-results) +- [Reproducing the results from our paper](#reproducing-the-results-from-our-paper) ## Autotuners @@ -74,7 +75,7 @@ python -m llvm_autotuning.tune -m \ experiment=my-experiment \ outputs=/tmp/logs \ executor.cpus=32 \ - num_replicas=10 \ + num_replicas=1 \ autotuner=nevergrad \ autotuner.optimization_target=codesize \ autotuner.search_time_seconds=600 @@ -114,3 +115,60 @@ e.g.: ``` python -m llvm_autotuning.info /path/to/logs/dir/a ~/logs_dir_b ``` + + +## Reproducing the results from our paper + +To reproduce the experiments in Section VII.C of [our +paper](https://arxiv.org/pdf/2109.08267.pdf), run: + +```sh +export AUTOTUNER=greedy; export TARGET=codesize; \ +python -m llvm_autotuning.tune -m \ + experiment="$AUTOTUNER-${TARGET}" \ + autotuner="$AUTOTUNER" \ + autotuner.optimization_target="$TARGET" +``` + +where `AUTOTUNER` is one of `greedy`, `random`, `nevergrad`, or `opentuner`; and +`TARGET` is one of `codesize`, `binsize`, or `runtime`. The parameters for each +of the autotuners defaults to those identified by sweeping the hyperparameters +on a holdout set of 50 CSmith benchmarks using codesize reward. + +To reproduce the hyperparameter sweeps for random search: + +```sh +export TARGET=codesize; \ +python -m llvm_autotuning.tune -m \ + experiment=random-"${TARGET}"-tuning \ + autotuner=random \ + autotuner.optimization_target="$TARGET" \ + benchmarks=csmith-50 \ + autotuner.algorithm_config.patience=5,10,25,50,75,100,125,150,175,200,225,250,275,300,325,350 +``` + +To reproduce the hyperparameter sweeps for +[Nevergrad](https://facebookresearch.github.io/nevergrad/): + +```sh +export TARGET=codesize; \ +python -m llvm_autotuning.tune -m \ + experiment=nevergrad-"${TARGET}"-tuning \ + autotuner=nevergrad \ + autotuner.optimization_target="$TARGET" \ + benchmarks=csmith-50 \ + autotuner.algorithm_config.episode_length=50,100,150,200,250,300,350,400 \ + autotuner.algorithm_config.optimizer=DiscreteOnePlusOne,PortfolioDiscreteOnePlusOne,DiscreteLenglerOnePlusOne,AdaptiveDiscreteOnePlusOne,AnisotropicAdaptiveDiscreteOnePlusOne,DiscreteBSOOnePlusOne,DiscreteDoerrOnePlusOne,OptimisticDiscreteOnePlusOne,NoisyDiscreteOnePlusOne,DoubleFastGADiscreteOnePlusOne,RecombiningPortfolioOptimisticNoisyDiscreteOnePlusOne,MultiDiscrete,PSO,DE,NGOpt,TwoPointsDE,CMandAS2 +``` + +To reproduce the hyperparameter sweep for [OpenTuner](https://opentuner.org/): + +```sh +export TARGET=codesize; \ +python -m llvm_autotuning.tune -m \ + experiment=opentuner-"${TARGET}"-tuning \ + autotuner=opentuner \ + autotuner.optimization_target="$TARGET" \ + benchmarks=csmith-50 \ + autotuner.algorithm_config.max_copies_of_pass=1,2,4,8,16,32,64 +``` diff --git a/examples/llvm_autotuning/config/default.yaml b/examples/llvm_autotuning/config/default.yaml index 994317f29..88f281994 100644 --- a/examples/llvm_autotuning/config/default.yaml +++ b/examples/llvm_autotuning/config/default.yaml @@ -5,7 +5,7 @@ defaults: - benchmarks: cbench search_time_seconds: 3600 # The base directory for logs and other runtime artifacts. -outputs: ~/logs/compiler_gym/llvm_autotuning +outputs: ${env:HOME}/logs/compiler_gym/llvm_autotuning # The top subdirectory to arrange files in. Use this to group related runs by # some logical naming. experiment: unnamed_experiment diff --git a/examples/llvm_autotuning/experiment.py b/examples/llvm_autotuning/experiment.py index 042baf883..968ab62cd 100644 --- a/examples/llvm_autotuning/experiment.py +++ b/examples/llvm_autotuning/experiment.py @@ -168,7 +168,7 @@ def _experiment_worker( with autotuner.optimization_target.make_env(benchmark) as env: env.seed(seed) env.action_space.seed(seed) - state = autotuner(benchmark, seed=seed) + state = autotuner(env, seed=seed) logger.info("State %s", state) with CompilerEnvStateWriter(open(results_path, "w")) as writer: diff --git a/examples/llvm_autotuning/info.py b/examples/llvm_autotuning/info.py index c0a576864..7784db7a2 100644 --- a/examples/llvm_autotuning/info.py +++ b/examples/llvm_autotuning/info.py @@ -30,7 +30,7 @@ def experiments_from_paths(log_dirs: List[Path]) -> List[Experiment]: @app.command() def info( - log_dirs: List[Path] = ["~/logs/llvm_autotuning"], + log_dirs: List[Path] = ["~/logs/compiler_gym/llvm_autotuning"], all_runs: bool = False, group_by_working_directory: bool = False, ): From 2a23a91be70d5cfd0e1ca8fed76ac3b866b1d5be Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 16:01:51 +0000 Subject: [PATCH 192/254] [examples] Replace executor config files with inline YAML. --- examples/llvm_autotuning/config/default.yaml | 7 ++++++- examples/llvm_autotuning/config/executor/debug.yaml | 2 -- examples/llvm_autotuning/config/executor/local.yaml | 5 ----- examples/llvm_autotuning/config/executor/noop.yaml | 2 -- examples/llvm_autotuning/config/executor/slurm.yaml | 3 --- 5 files changed, 6 insertions(+), 13 deletions(-) delete mode 100644 examples/llvm_autotuning/config/executor/debug.yaml delete mode 100644 examples/llvm_autotuning/config/executor/local.yaml delete mode 100644 examples/llvm_autotuning/config/executor/noop.yaml delete mode 100644 examples/llvm_autotuning/config/executor/slurm.yaml diff --git a/examples/llvm_autotuning/config/default.yaml b/examples/llvm_autotuning/config/default.yaml index 88f281994..e596dc4db 100644 --- a/examples/llvm_autotuning/config/default.yaml +++ b/examples/llvm_autotuning/config/default.yaml @@ -1,8 +1,13 @@ --- defaults: - - executor: local - autotuner: random - benchmarks: cbench +executor: + # One of: {local, slurm, debug noop, }. + type: local + # Specifies the number of parallel worker processes. If -1, defaults to the + # number of cores on the machine. + cpus: -1 search_time_seconds: 3600 # The base directory for logs and other runtime artifacts. outputs: ${env:HOME}/logs/compiler_gym/llvm_autotuning diff --git a/examples/llvm_autotuning/config/executor/debug.yaml b/examples/llvm_autotuning/config/executor/debug.yaml deleted file mode 100644 index b437d4ffd..000000000 --- a/examples/llvm_autotuning/config/executor/debug.yaml +++ /dev/null @@ -1,2 +0,0 @@ ---- -type: debug diff --git a/examples/llvm_autotuning/config/executor/local.yaml b/examples/llvm_autotuning/config/executor/local.yaml deleted file mode 100644 index 2070c1dd6..000000000 --- a/examples/llvm_autotuning/config/executor/local.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: local -# Specifies the number of parallel worker processes. If -1, defaults to the -# number of cores on the machine. -cpus: -1 diff --git a/examples/llvm_autotuning/config/executor/noop.yaml b/examples/llvm_autotuning/config/executor/noop.yaml deleted file mode 100644 index d498bb4b2..000000000 --- a/examples/llvm_autotuning/config/executor/noop.yaml +++ /dev/null @@ -1,2 +0,0 @@ ---- -type: noop diff --git a/examples/llvm_autotuning/config/executor/slurm.yaml b/examples/llvm_autotuning/config/executor/slurm.yaml deleted file mode 100644 index 63c07a297..000000000 --- a/examples/llvm_autotuning/config/executor/slurm.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -type: slurm -cpus: 1 From c8e6d6cfd08a8d79ed946e2a3df310a331ce3010 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 16:02:16 +0000 Subject: [PATCH 193/254] [util] Add an optimal timeout_hours arg to get_executor(). --- compiler_gym/util/executor.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index eda0fdca7..8b7706378 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -75,8 +75,11 @@ class Type(str, Enum): # === Start of public API. === @contextmanager - def get_executor(self, logs_dir: Path, cpus=None) -> "Executor": + def get_executor( + self, logs_dir: Path, timeout_hours: Optional[int] = None, cpus=None + ) -> "Executor": cpus = cpus or self.cpus + timeout_hours = timeout_hours or self.timeout_hours if self.type == self.Type.SLURM: try: from submitit import AutoExecutor @@ -87,7 +90,7 @@ def get_executor(self, logs_dir: Path, cpus=None) -> "Executor": ) from e executor = AutoExecutor(folder=logs_dir) executor.update_parameters( - timeout_min=int(round(self.timeout_hours * 60)), + timeout_min=int(round(timeout_hours * 60)), nodes=1, cpus_per_task=cpus, slurm_partition=self.slurm_partition, @@ -97,7 +100,7 @@ def get_executor(self, logs_dir: Path, cpus=None) -> "Executor": executor, name = ( LocalParallelExecutor( cpus=multiprocessing.cpu_count() if cpus == -1 else cpus, - timeout_seconds=int(round(self.timeout_hours * 3600)), + timeout_seconds=int(round(timeout_hours * 3600)), ), "local", ) From 03ed5a210909217fe7e4aab6cecc2641b2fc8510 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 16:02:55 +0000 Subject: [PATCH 194/254] [examples] Install examples/requirements.txt on pip install. --- examples/setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/setup.py b/examples/setup.py index 26e342ac9..304dd9f00 100644 --- a/examples/setup.py +++ b/examples/setup.py @@ -4,6 +4,8 @@ with open("../VERSION") as f: version = f.read().strip() +with open("requirements.txt") as f: + requirements = [ln.split("#")[0].rstrip() for ln in f.readlines()] setuptools.setup( name="compiler_gym_examples", @@ -12,6 +14,7 @@ author="Facebook AI Research", url="https://github.com/facebookresearch/CompilerGym", license="MIT", + install_requires=requirements, packages=[ "llvm_autotuning", "llvm_autotuning.autotuners", From 86a737f4fe743404665901a95e2e929b7073f86a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 16:03:12 +0000 Subject: [PATCH 195/254] [examples] Update GCC test. --- examples/gcc_autotuning/tune_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/gcc_autotuning/tune_test.py b/examples/gcc_autotuning/tune_test.py index 6d7234f59..74480b32f 100644 --- a/examples/gcc_autotuning/tune_test.py +++ b/examples/gcc_autotuning/tune_test.py @@ -9,8 +9,8 @@ from typing import Iterable import docker -import gcc_search import pytest +import tune from absl.flags import FLAGS @@ -58,7 +58,7 @@ def gcc_bin(request) -> str: @pytest.mark.parametrize("search", ["random", "hillclimb", "genetic"]) -def test_gcc_search_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): +def test_tune_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): tmpdir = Path(tmpdir) flags = [ "argv0", @@ -74,7 +74,7 @@ def test_gcc_search_smoke_test(search: str, gcc_bin: str, capsys, tmpdir: Path): FLAGS.unparse_flags() FLAGS(flags) - gcc_search.main([]) + tune.main([]) out, _ = capsys.readouterr() assert "benchmark://chstone-v0/aes" in out assert (tmpdir / "results.csv").is_file() From 436f43d7f84d5954835119ec8892622ea156ae6a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 10 Nov 2021 16:03:36 +0000 Subject: [PATCH 196/254] [examples] Update GCC description in README. --- examples/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/README.md b/examples/README.md index dd1c1b2c2..4d17e63ff 100644 --- a/examples/README.md +++ b/examples/README.md @@ -72,11 +72,11 @@ directory for further details. ### GCC Autotuning (genetic algorithms, hill climbing, + more) -The [gcc_search.py](gcc_search.py) script contains implementations of several -autotuning techniques for the GCC environment. It was used to produce the -results for the GCC experiments in the [CompilerGym -whitepaper](https://arxiv.org/pdf/2109.08267.pdf). For further details run: -`python gcc_search.py --help`. +The [gcc_autotuning/tune.py](gcc_autotuning/tune.py) script contains +implementations of several autotuning techniques for the GCC environment. It was +used to produce the results for the GCC experiments in the [CompilerGym +whitepaper](https://arxiv.org/pdf/2109.08267.pdf). See the +[gcc_autotuning](gcc_autotuning/) directory for further details. ### Makefile integration From e91f47b9641ad5b2ec38d4a0bd321ab86cfc0c97 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:08:18 +0000 Subject: [PATCH 197/254] [examples] Slight rewording clarification. --- examples/gcc_autotuning/README.md | 4 ++-- examples/llvm_autotuning/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/gcc_autotuning/README.md b/examples/gcc_autotuning/README.md index f752e81e5..d4bc173b7 100644 --- a/examples/gcc_autotuning/README.md +++ b/examples/gcc_autotuning/README.md @@ -6,7 +6,7 @@ optimization strategies. - [Usage](#usage) - [Running autotuning experiments](#running-autotuning-experiments) - [Overview of results](#overview-of-results) -- [Reproducing the results from our paper](#reproducing-the-results-from-our-paper) +- [Reproducing the experiments from our paper](#reproducing-the-experiments-from-our-paper) ## Usage @@ -71,7 +71,7 @@ python -m gcc_autotuning.info /path/to/logs/dir/a ~/logs_dir_b ``` -## Reproducing the results from our paper +## Reproducing the experiments from our paper To reproduce the experiments in Section VII.D of [our paper](https://arxiv.org/pdf/2109.08267.pdf), run: diff --git a/examples/llvm_autotuning/README.md b/examples/llvm_autotuning/README.md index c75cb4116..df9ef4d33 100644 --- a/examples/llvm_autotuning/README.md +++ b/examples/llvm_autotuning/README.md @@ -9,7 +9,7 @@ search strategies. - [Usage](#usage) - [Running autotuning experiments](#running-autotuning-experiments) - [Overview of results](#overview-of-results) -- [Reproducing the results from our paper](#reproducing-the-results-from-our-paper) +- [Reproducing the experiments from our paper](#reproducing-the-experiments-from-our-paper) ## Autotuners @@ -117,7 +117,7 @@ python -m llvm_autotuning.info /path/to/logs/dir/a ~/logs_dir_b ``` -## Reproducing the results from our paper +## Reproducing the experiments from our paper To reproduce the experiments in Section VII.C of [our paper](https://arxiv.org/pdf/2109.08267.pdf), run: From c0f27c45754628114318dac64b1b6a668557a6b1 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:11:01 +0000 Subject: [PATCH 198/254] [wrappers] Add an iterator-based benchmarks iterator. --- compiler_gym/wrappers/__init__.py | 4 ++- compiler_gym/wrappers/datasets.py | 43 +++++++++++++++++++++++- docs/source/compiler_gym/wrappers.rst | 5 +++ tests/wrappers/datasets_wrappers_test.py | 39 +++++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) diff --git a/compiler_gym/wrappers/__init__.py b/compiler_gym/wrappers/__init__.py index c68f78f01..ce9353cc8 100644 --- a/compiler_gym/wrappers/__init__.py +++ b/compiler_gym/wrappers/__init__.py @@ -16,6 +16,7 @@ ) from compiler_gym.wrappers.datasets import ( CycleOverBenchmarks, + CycleOverBenchmarksIterator, IterateOverBenchmarks, RandomOrderBenchmarks, ) @@ -28,10 +29,11 @@ "CompilerEnvWrapper", "ConstrainedCommandline", "CycleOverBenchmarks", + "CycleOverBenchmarksIterator", "IterateOverBenchmarks", - "RuntimePointEstimateReward", "ObservationWrapper", "RandomOrderBenchmarks", "RewardWrapper", + "RuntimePointEstimateReward", "TimeLimit", ] diff --git a/compiler_gym/wrappers/datasets.py b/compiler_gym/wrappers/datasets.py index 4158c0f51..22a21d73f 100644 --- a/compiler_gym/wrappers/datasets.py +++ b/compiler_gym/wrappers/datasets.py @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. from itertools import cycle -from typing import Iterable, Optional, Union +from typing import Callable, Iterable, Optional, Union import numpy as np @@ -109,6 +109,47 @@ def __init__( ) +class CycleOverBenchmarksIterator(CompilerEnvWrapper): + """Same as :class:`CycleOverBenchmarks + ` except that the user generates + the iterator. + """ + + def __init__( + self, + env: CompilerEnv, + make_benchmark_iterator: Callable[[], Iterable[BenchmarkLike]], + ): + """Constructor. + + :param env: The environment to wrap. + + :param make_benchmark_iterator: A callback that returns an iterator over + a sequence of benchmarks. Once the iterator is exhausted, this + callback is called to produce a new iterator. + """ + super().__init__(env) + self.make_benchmark_iterator = make_benchmark_iterator + self.benchmarks = iter(self.make_benchmark_iterator()) + + def reset(self, benchmark: Optional[BenchmarkLike] = None, **kwargs): + if benchmark is not None: + raise TypeError("Benchmark passed toIterateOverBenchmarks.reset()") + try: + benchmark: BenchmarkLike = next(self.benchmarks) + except StopIteration: + self.benchmarks = iter(self.make_benchmark_iterator()) + benchmark: BenchmarkLike = next(self.benchmarks) + + return self.env.reset(benchmark=benchmark) + + def fork(self) -> "CycleOverBenchmarksIterator": + return CycleOverBenchmarksIterator( + env=self.env.fork(), + make_benchmark_iterator=self.make_benchmark_iterator, + ) + + class RandomOrderBenchmarks(IterateOverBenchmarks): """Select randomly from a list of benchmarks on each call to :meth:`reset() `. diff --git a/docs/source/compiler_gym/wrappers.rst b/docs/source/compiler_gym/wrappers.rst index bdbaad115..b48a62c09 100644 --- a/docs/source/compiler_gym/wrappers.rst +++ b/docs/source/compiler_gym/wrappers.rst @@ -63,6 +63,11 @@ Datasets wrappers .. automethod:: __init__ +.. autoclass:: CycleOverBenchmarksIterator + + .. automethod:: __init__ + + .. autoclass:: RandomOrderBenchmarks .. automethod:: __init__ diff --git a/tests/wrappers/datasets_wrappers_test.py b/tests/wrappers/datasets_wrappers_test.py index 04bcb0d3b..e7c84758a 100644 --- a/tests/wrappers/datasets_wrappers_test.py +++ b/tests/wrappers/datasets_wrappers_test.py @@ -8,6 +8,7 @@ from compiler_gym.envs.llvm import LlvmEnv from compiler_gym.wrappers import ( CycleOverBenchmarks, + CycleOverBenchmarksIterator, IterateOverBenchmarks, RandomOrderBenchmarks, ) @@ -166,6 +167,44 @@ def test_cycle_over_benchmarks_fork_shared_iterator(env: LlvmEnv): fkd.close() +def test_cycle_over_benchmarks_iterator(env): + env = CycleOverBenchmarksIterator( + env, + make_benchmark_iterator=lambda: ( + "benchmark://cbench-v1/dijkstra", + "benchmark://cbench-v1/qsort", + "benchmark://cbench-v1/adpcm", + ), + ) + + env.reset() + assert env.benchmark == "benchmark://cbench-v1/dijkstra" + + env.reset() + assert env.benchmark == "benchmark://cbench-v1/qsort" + + env.reset() + assert env.benchmark == "benchmark://cbench-v1/adpcm" + + env.reset() + assert env.benchmark == "benchmark://cbench-v1/dijkstra" + + env.reset() + assert env.benchmark == "benchmark://cbench-v1/qsort" + + with env.fork() as fkd: + fkd.reset() + assert fkd.benchmark == "benchmark://cbench-v1/dijkstra" + + fkd.reset() + assert fkd.benchmark == "benchmark://cbench-v1/qsort" + assert env.benchmark == "benchmark://cbench-v1/qsort" + + env.reset() + assert fkd.benchmark == "benchmark://cbench-v1/qsort" + assert env.benchmark == "benchmark://cbench-v1/adpcm" + + def test_random_order_benchmarks(env: LlvmEnv): env = RandomOrderBenchmarks( env=env, From 7d984164a42f3ed4a7d8abe8212fcb46378e7b68 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:11:38 +0000 Subject: [PATCH 199/254] [util] Add a global singleton Executor. --- compiler_gym/util/executor.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index 8b7706378..a90e321f2 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -8,7 +8,9 @@ from contextlib import contextmanager from enum import Enum from itertools import islice +from os import cpu_count from pathlib import Path +from threading import Lock from typing import Optional from pydantic import BaseModel, Field, validator @@ -17,6 +19,10 @@ logger = logging.getLogger(__name__) +_executor_lock = Lock() +_executor = None + + class Executor(BaseModel): """Defines an execution environment for jobs. @@ -123,6 +129,18 @@ def get_executor( if hasattr(executor.unwrapped, "close"): executor.unwrapped.close() + @staticmethod + def get_default_local_executor(): + """Return a singleton :code:`Executor`. + + :returns: An executor. + """ + with _executor_lock: + global _executor + if _executor is None: + _executor = Executor(type="local", cpus=cpu_count()) + return _executor + # === Start of implementation details. === @validator("slurm_partition") From 77276f101710176106406fe57933a0179b2b3be4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:12:22 +0000 Subject: [PATCH 200/254] [util] Add an Executor.gpus field. --- compiler_gym/util/executor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index a90e321f2..ca466bb7a 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -70,6 +70,12 @@ class Type(str, Enum): :code:`Type.DEBUG` and :code:`Type.NOOP`. """ + gpus: int = Field(default=0, allow_mutation=False, ge=0) + """The number of GPUs to provision. + + This is used only by the :code:`Type.SLURM` executor. + """ + timeout_hours: float = Field(default=12, allow_mutation=False, gt=0) block: bool = Field(default=False, allow_mutation=False) @@ -99,6 +105,7 @@ def get_executor( timeout_min=int(round(timeout_hours * 60)), nodes=1, cpus_per_task=cpus, + gpus_per_node=self.gpus, slurm_partition=self.slurm_partition, ) name = self.slurm_partition From 3c1f8b602bbf0fc59402ba7881ab13e4f4824eaf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:13:20 +0000 Subject: [PATCH 201/254] [util] Fix parameter type annotation. --- compiler_gym/util/executor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index ca466bb7a..0cb7ea3b1 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -88,7 +88,7 @@ class Type(str, Enum): @contextmanager def get_executor( - self, logs_dir: Path, timeout_hours: Optional[int] = None, cpus=None + self, logs_dir: Path, timeout_hours: Optional[float] = None, cpus=None ) -> "Executor": cpus = cpus or self.cpus timeout_hours = timeout_hours or self.timeout_hours From 5cca5b160c09eccacf5a910c2d611818e4504eb4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:13:52 +0000 Subject: [PATCH 202/254] [util] Set default Executor.cpus at constructor time. --- compiler_gym/util/executor.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler_gym/util/executor.py b/compiler_gym/util/executor.py index 0cb7ea3b1..9d48c6c2d 100644 --- a/compiler_gym/util/executor.py +++ b/compiler_gym/util/executor.py @@ -112,7 +112,7 @@ def get_executor( elif self.type == self.Type.LOCAL: executor, name = ( LocalParallelExecutor( - cpus=multiprocessing.cpu_count() if cpus == -1 else cpus, + cpus=cpus, timeout_seconds=int(round(timeout_hours * 3600)), ), "local", @@ -157,11 +157,18 @@ def validate_slurm_partition(cls, value, *, values, **kwargs): assert value, f"Must specify a partition for executor: {values['executor']}" return value + @validator("cpus", pre=True) + def validate_cpus(cls, value, *, values, **kwargs): + del kwargs + # -1 CPU count defaults to CPU count. + if values["type"] == cls.Type.LOCAL and value == -1: + return cpu_count() + return value + @root_validator def local_always_blocks(cls, values): if values["type"] == cls.Type.LOCAL or values["type"] == cls.Type.NOOP: values["block"] = True - return values class Config: From d01f698807393c9bea4653d05a9b765f3ba5ad24 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:14:23 +0000 Subject: [PATCH 203/254] [third_party] Replace assertion with exception. --- compiler_gym/third_party/inst2vec/inst2vec_preprocess.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler_gym/third_party/inst2vec/inst2vec_preprocess.py b/compiler_gym/third_party/inst2vec/inst2vec_preprocess.py index 7610aa95f..3c75706ac 100644 --- a/compiler_gym/third_party/inst2vec/inst2vec_preprocess.py +++ b/compiler_gym/third_party/inst2vec/inst2vec_preprocess.py @@ -46,7 +46,8 @@ def GetFunctionsDeclaredInFile(bytecode_lines): if "declare" in line and not line.startswith("call void"): # Find the function name func = re.match(r"declare .*(" + rgx.func_name + r")", line) - assert func is not None, "Could not match function name in " + line + if func is None: + raise ValueError(f"Could not match function name in {line}") func = func.group(1) # Add it to the list From fb5e665bf6be14c1923a957fa016084833b5b8c2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:14:58 +0000 Subject: [PATCH 204/254] [Makefile] Add a rule to install examples. --- Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4465e73c1..e1f375f90 100644 --- a/Makefile +++ b/Makefile @@ -317,7 +317,10 @@ endef install-test: | install-test-setup $(call pytest,--no-success-flaky-report --benchmark-disable -n auto -k "not fuzz" --durations=5) -examples-test: +examples-pip-install: + cd examples && python setup.py install + +examples-test: examples-pip-install cd examples && pytest --no-success-flaky-report --benchmark-disable -n auto --durations=5 . --cov=compiler_gym --cov-report=xml:$(COV_REPORT) $(PYTEST_ARGS) # Note we export $CI=1 so that the tests always run as if within the CI @@ -337,7 +340,7 @@ post-install-test: $(MAKE) -C examples/makefile_integration clean SEARCH_TIME=3 $(MAKE) -C examples/makefile_integration test -.PHONY: test post-install-test examples-test +.PHONY: test post-install-test examples-pip-install examples-test ################ From 924182d4ad6ebfaa9f5c9387d2c036d05ca2ccfb Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:15:38 +0000 Subject: [PATCH 205/254] [Makefile] Update `make clean` target. --- Makefile | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e1f375f90..7e27928df 100644 --- a/Makefile +++ b/Makefile @@ -165,7 +165,14 @@ init-runtime-requirements: ############ # Files and directories generated by python disttools. -DISTTOOLS_OUTS := dist build compiler_gym.egg-info +DISTTOOLS_OUTS := \ + build \ + compiler_gym.egg-info \ + dist \ + examples/build \ + examples/compiler_gym_examples.egg-info \ + examples/dist \ + $(NULL) BUILD_TARGET ?= //:package @@ -374,8 +381,9 @@ COMPILER_GYM_DATA_FILE_LOCATIONS = \ .PHONY: clean distclean uninstall purge clean: - $(MAKE) -C docs clean || true rm -rf $(GENERATED_DOCS) $(DISTTOOLS_OUTS) + find . -type d -name __pycache__ -o -name .benchmarks -print0 | xargs -0 -I {} /bin/rm -rf "{}" + find . -type f -name '.coverage*' -delete distclean: clean bazel clean --expunge From dcf65e9e0cf6293b8cfd566fc92668568fbcd2d7 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:15:54 +0000 Subject: [PATCH 206/254] [examples] Exclude '*_test.py' from pip install. --- examples/MANIFEST.in | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/MANIFEST.in diff --git a/examples/MANIFEST.in b/examples/MANIFEST.in new file mode 100644 index 000000000..aa2a5b26e --- /dev/null +++ b/examples/MANIFEST.in @@ -0,0 +1 @@ +global-exclude *_test.py From 1e8be1248ac1e15f1661c8e0a0a9d43a0e7fb8ef Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 13:30:23 +0000 Subject: [PATCH 207/254] [examples] GCC script updates. --- examples/gcc_autotuning/__init__.py | 0 examples/gcc_autotuning/tune.py | 3 ++- examples/gcc_autotuning/tune_test.py | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 examples/gcc_autotuning/__init__.py diff --git a/examples/gcc_autotuning/__init__.py b/examples/gcc_autotuning/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/gcc_autotuning/tune.py b/examples/gcc_autotuning/tune.py index ce28cc8ec..1e8b48e7a 100644 --- a/examples/gcc_autotuning/tune.py +++ b/examples/gcc_autotuning/tune.py @@ -11,7 +11,6 @@ import numpy as np from absl import app, flags -from gcc_autotuning.info import info from geneticalgorithm import geneticalgorithm as ga import compiler_gym @@ -24,6 +23,8 @@ from compiler_gym.util.executor import Executor from compiler_gym.util.runfiles_path import create_user_logs_dir +from .info import info + FLAGS = flags.FLAGS flags.DEFINE_string( "gcc_bin", DEFAULT_GCC, "Binary to use for gcc. Use docker: for docker" diff --git a/examples/gcc_autotuning/tune_test.py b/examples/gcc_autotuning/tune_test.py index 74480b32f..d6a00a480 100644 --- a/examples/gcc_autotuning/tune_test.py +++ b/examples/gcc_autotuning/tune_test.py @@ -10,9 +10,10 @@ import docker import pytest -import tune from absl.flags import FLAGS +from . import tune + def docker_is_available() -> bool: """Return whether docker is available.""" From eedf604aa23aa0bcde1f4c6346bc368f74218d58 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 12:07:59 +0000 Subject: [PATCH 208/254] [examples] Add LLVM reinforcement learning examples. --- examples/.gitignore | 1 + examples/llvm_rl/README.md | 194 +++++++ examples/llvm_rl/__init__.py | 4 + examples/llvm_rl/config/agent/a2c.yaml | 9 + examples/llvm_rl/config/agent/apex.yaml | 11 + examples/llvm_rl/config/agent/impala.yaml | 9 + examples/llvm_rl/config/agent/ppo.yaml | 12 + examples/llvm_rl/config/default.yaml | 28 + .../environment/autophase-with-history.yaml | 13 + .../llvm_rl/config/environment/autophase.yaml | 10 + .../environment/instcount-with-history.yaml | 11 + .../llvm_rl/config/environment/instcount.yaml | 10 + examples/llvm_rl/config/testing/all.yaml | 33 ++ examples/llvm_rl/config/testing/cbench.yaml | 33 ++ .../testing/csmith-github-tensorflow.yaml | 11 + examples/llvm_rl/config/training/csmith.yaml | 12 + examples/llvm_rl/config/training/github.yaml | 12 + .../llvm_rl/config/training/tensorflow.yaml | 12 + examples/llvm_rl/eval.ipynb | 297 ++++++++++ examples/llvm_rl/info.py | 231 ++++++++ examples/llvm_rl/model/__init__.py | 9 + examples/llvm_rl/model/agent.py | 122 ++++ examples/llvm_rl/model/benchmarks.py | 121 ++++ examples/llvm_rl/model/environment.py | 132 +++++ examples/llvm_rl/model/inference_result.py | 118 ++++ examples/llvm_rl/model/model.py | 526 ++++++++++++++++++ examples/llvm_rl/model/testing.py | 84 +++ examples/llvm_rl/model/training.py | 88 +++ examples/llvm_rl/model/validation.py | 55 ++ examples/llvm_rl/test.py | 24 + examples/llvm_rl/tests/benchmarks_test.py | 43 ++ examples/llvm_rl/tests/environment_test.py | 51 ++ examples/llvm_rl/tests/testing_test.py | 25 + .../tests/training_integration_test.py | 86 +++ examples/llvm_rl/tests/training_test.py | 27 + examples/llvm_rl/tests/validation_test.py | 38 ++ .../wrappers_test.py} | 3 +- examples/llvm_rl/train.py | 48 ++ .../{autophase_wrappers.py => wrappers.py} | 45 +- examples/requirements.txt | 4 + examples/setup.py | 2 + 41 files changed, 2597 insertions(+), 7 deletions(-) create mode 100644 examples/llvm_rl/README.md create mode 100644 examples/llvm_rl/config/agent/a2c.yaml create mode 100644 examples/llvm_rl/config/agent/apex.yaml create mode 100644 examples/llvm_rl/config/agent/impala.yaml create mode 100644 examples/llvm_rl/config/agent/ppo.yaml create mode 100644 examples/llvm_rl/config/default.yaml create mode 100644 examples/llvm_rl/config/environment/autophase-with-history.yaml create mode 100644 examples/llvm_rl/config/environment/autophase.yaml create mode 100644 examples/llvm_rl/config/environment/instcount-with-history.yaml create mode 100644 examples/llvm_rl/config/environment/instcount.yaml create mode 100644 examples/llvm_rl/config/testing/all.yaml create mode 100644 examples/llvm_rl/config/testing/cbench.yaml create mode 100644 examples/llvm_rl/config/testing/csmith-github-tensorflow.yaml create mode 100644 examples/llvm_rl/config/training/csmith.yaml create mode 100644 examples/llvm_rl/config/training/github.yaml create mode 100644 examples/llvm_rl/config/training/tensorflow.yaml create mode 100644 examples/llvm_rl/eval.ipynb create mode 100644 examples/llvm_rl/info.py create mode 100644 examples/llvm_rl/model/__init__.py create mode 100644 examples/llvm_rl/model/agent.py create mode 100644 examples/llvm_rl/model/benchmarks.py create mode 100644 examples/llvm_rl/model/environment.py create mode 100644 examples/llvm_rl/model/inference_result.py create mode 100644 examples/llvm_rl/model/model.py create mode 100644 examples/llvm_rl/model/testing.py create mode 100644 examples/llvm_rl/model/training.py create mode 100644 examples/llvm_rl/model/validation.py create mode 100644 examples/llvm_rl/test.py create mode 100644 examples/llvm_rl/tests/benchmarks_test.py create mode 100644 examples/llvm_rl/tests/environment_test.py create mode 100644 examples/llvm_rl/tests/testing_test.py create mode 100644 examples/llvm_rl/tests/training_integration_test.py create mode 100644 examples/llvm_rl/tests/training_test.py create mode 100644 examples/llvm_rl/tests/validation_test.py rename examples/llvm_rl/{autophase_wrappers_test.py => tests/wrappers_test.py} (96%) create mode 100644 examples/llvm_rl/train.py rename examples/llvm_rl/{autophase_wrappers.py => wrappers.py} (82%) diff --git a/examples/.gitignore b/examples/.gitignore index 64e245ad6..a4117efc6 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,3 +1,4 @@ /*.egg-info /build /dist +/platform.info diff --git a/examples/llvm_rl/README.md b/examples/llvm_rl/README.md new file mode 100644 index 000000000..ff2c659ab --- /dev/null +++ b/examples/llvm_rl/README.md @@ -0,0 +1,194 @@ +# Reinforcement Learning experiments using RLlib + +This directory contains code for running reinforcement learning experiments on +CompilerGym using RLlib. + +- [About](#about) +- [Usage](#usage) + - [Training for 1k episodes using the default on the local machine](#training-for-1k-episodes-using-the-default-on-the-local-machine) + - [Sweeping the learning rate of an algorithm](#sweeping-the-learning-rate-of-an-algorithm) + - [Re-running a previous configuration](#re-running-a-previous-configuration) + - [Testing](#testing) + - [Debugging your code/config](#debugging-your-codeconfig) +- [Training Directory Layout](#training-directory-layout) +- [Reproducing the experiments from our paper](#reproducing-the-experiments-from-our-paper) + - [Section VII.G: Effect of algorithm](#section-viig-effect-of-algorithm) + - [Section VII.H: Effect of training set](#section-viih-effect-of-training-set) + - [Section VII.I: Effect of representation space](#section-viii-effect-of-representation-space) + + +## About + +This code is 95% config parsing and wrangling, with the final 5% being the +`tune.run()` invocation to do the actual learning. + +The configuration of experiments is decomposed into five subunits: + + * **Executor**: controls where work gets done (e.g. submitting jobs to a slurm + cluster vs running on local machine). + * **Environment**: describes the gym environment that is interacted with. + * **Agent**: specifies the RLlib agent and its configuration. + * **Training**: describes the training loop, i.e. how long to train for, and + over what benchmarks. + * **Testing**: describes the final testing configuration. + +Each of the five subunits is defined by a +[pydantic](https://pydantic-docs.helpmanual.io/) model which describes the +schema of the config subunit. E.g. [model/environment.py](model/environment.py) +defines the model describing an environment. Each of the "fields" which make up +a config subunit is documented and comes with runtime validation of inputs, so +reading through the files in the models directory is the best way to understand +what is going on. + +[Hydra](https://github.com/facebookresearch/hydra) is used to generate the +inputs to these models from YAML files. The `config` directory contains a set of +YAML files for common subunit configs which can be composed or overriden from +the commandline. E.g. [config/testing/cbench.yaml](config/testing/cbench.yaml) +contains the configuration for a `Testing` model that uses the cBench +benchmarks. + +Once all of this is combined, running the actual RL jobs is pretty +straightforward. Configuration can be done by modifying the YAML config files +and overriding the +[defaults](https://hydra.cc/docs/tutorials/basic/your_first_app/defaults), or by +specifying individual options at the commandline. + + +## Usage + +There are three scripts: [train.py](train.py) which contains the training +script, [test.py](test.py) for testing trained agents, and [info.py](info.py) +for summarizing results. + +Here are some example command line invocations to get started. + + +### Training for 1k episodes using the default on the local machine + +```sh +python -m llvm_rl.train -m training.episodes=1000 +``` + + +### Sweeping the learning rate of an algorithm + +The +[multi-run](https://hydra.cc/docs/tutorials/basic/running_your_app/multi-run) +feature can be used to create parameter sweeps. For example, train three agents +with different learning rates using: + +```sh +python -m llvm_rl.train -m agent.type=ppo agent.args.lr=0.001,0.0005,0.0001 +``` + + +### Re-running a previous configuration + +To re-run a previous experiment configuration, navigate to the generated hydra +subdirectory and set that as the `--config-path`: + +```sh +python -m llvm_rl.train \ + --config-path /path/to/previous/experiment/run/config-0/hydra/ \ + -m +``` + +You can still override individual configuration options as normal. E.g. to +re-run a previous job but using a different number of training benchmarks: + +```sh +python -m llvm_rl.train \ + --config-path /path/to/previous/experiment/run/config-0/hydra/ \ + -m training.episodes=5000 +``` + + +### Testing + +Use the [test.py](test.py) script to test a trained agent: + +```sh +python -m llvm_rl.test /path/to/previous/experiment/run/ +``` + +Test results are cached, so that work is only done on the first run for each +experiment. + +If run with no arguments, every trained agent in the default logging directory +(`~/logs/compiler_gym/llvm_rl`) will be tested: + +```sh +python -m llvm_rl.test +``` + + +### Debugging your code/config + +A "no-op" executor can be used for debugging and validating your config files +without doing any expensive work (it simply discards the jobs that are submitted +to it): + +```sh +python -m llvm_rl.train -m executor.type=noop +``` + + +## Training Directory Layout + +The `outputs` config option sets the base output directory (default: +`~/logs/compiler_gym/llvm_rl`) and `experiment` is an arbitrary string used for +grouping results (if not specified, defaults to `unnamed_experiment`). Jobs +generate files using this layout: + +```sh +# The top level outputs for this run: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/ +# Logs generated by the slurm worker: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/slurm_logs +# Each configuration of a multi-run gets its own directory using an ascending job ID: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/config-${job_id} +# A copy of all logging messages from the training job: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/config-${job_id}/train.log +# This directory contains an exact copy of the configs used: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/config-${job_id}/hydra +# RLlib checkpoints: +${outputs}/${experiment}/${YYY-MM-DD}/${hh-mm-ss}/config-${job_id}/train/${experiment}-0_0_2021-07-23_18-11-04 +``` + + +## Reproducing the experiments from our paper + +This section describes how to reproduce the experiments in [our +paper](https://arxiv.org/pdf/2109.08267.pdf): + + +### Section VII.G: Effect of algorithm + +```sh +python -m llvm_rl.train -m \ + experiment=algo \ + agent=a2c,apex,impala,ppo \ + num_replicas=10 \ + training=csmith +``` + +### Section VII.H: Effect of training set + +```sh +python -m llvm_rl.train -m \ + experiment=training_set \ + agent=ppo \ + num_replicas=10 \ + training=csmith,github,tensorflow +``` + + +### Section VII.I: Effect of representation space + +```sh +python -m llvm_rl.train -m \ + experiment=observation_space \ + agent=ppo \ + num_replicas=10 \ + environment=autophase,autophase-with-history,instcount,instcount-with-history +``` diff --git a/examples/llvm_rl/__init__.py b/examples/llvm_rl/__init__.py index e69de29bb..626423691 100644 --- a/examples/llvm_rl/__init__.py +++ b/examples/llvm_rl/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. diff --git a/examples/llvm_rl/config/agent/a2c.yaml b/examples/llvm_rl/config/agent/a2c.yaml new file mode 100644 index 000000000..0b191b38e --- /dev/null +++ b/examples/llvm_rl/config/agent/a2c.yaml @@ -0,0 +1,9 @@ +--- +type: A2CTrainer +args: + framework: tf + horizon: 45 + evaluation_config: + explore: false +checkpoint_freq: 10 +checkpoint_at_end: true diff --git a/examples/llvm_rl/config/agent/apex.yaml b/examples/llvm_rl/config/agent/apex.yaml new file mode 100644 index 000000000..438f6c7f6 --- /dev/null +++ b/examples/llvm_rl/config/agent/apex.yaml @@ -0,0 +1,11 @@ +--- +type: ApexTrainer +args: + hiddens: [256] + num_workers: 16 # NOTE(cummins): Device specific + framework: tf + horizon: 45 + evaluation_config: + explore: false +checkpoint_freq: 10 +checkpoint_at_end: true diff --git a/examples/llvm_rl/config/agent/impala.yaml b/examples/llvm_rl/config/agent/impala.yaml new file mode 100644 index 000000000..aecb0c18c --- /dev/null +++ b/examples/llvm_rl/config/agent/impala.yaml @@ -0,0 +1,9 @@ +--- +type: ImpalaTrainer +args: + framework: tf + horizon: 45 + evaluation_config: + explore: false +checkpoint_freq: 10 +checkpoint_at_end: true diff --git a/examples/llvm_rl/config/agent/ppo.yaml b/examples/llvm_rl/config/agent/ppo.yaml new file mode 100644 index 000000000..7d3774687 --- /dev/null +++ b/examples/llvm_rl/config/agent/ppo.yaml @@ -0,0 +1,12 @@ +--- +type: PPOTrainer +args: + model: + fcnet_hiddens: [256, 256] + fcnet_activation: relu + framework: tf + horizon: 45 + evaluation_config: + explore: false +checkpoint_freq: 10 +checkpoint_at_end: true diff --git a/examples/llvm_rl/config/default.yaml b/examples/llvm_rl/config/default.yaml new file mode 100644 index 000000000..7ceb5518a --- /dev/null +++ b/examples/llvm_rl/config/default.yaml @@ -0,0 +1,28 @@ +--- +defaults: + - agent: ppo + - environment: autophase-with-history + - training: csmith + - testing: cbench +executor: + # One of: {local, slurm, debug noop, }. + type: local + # Specifies the number of parallel worker processes. If -1, defaults to the + # number of cores on the machine. + cpus: -1 +# The base directory for logs and other runtime artifacts. +outputs: ${env:HOME}/logs/compiler_gym/llvm_rl +# The top subdirectory to arrange files in. Use this to group related runs by +# some logical naming. +experiment: unnamed_experiment +num_replicas: 10 +# Use hydra to manage the output directory layout. Multi-run and single runs +# share the same directory layout (there just won't be a multirun.yaml file for +# the individual runs). +hydra: + run: + dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S}/${experiment}-C0 + sweep: + dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S} + subdir: ${experiment}-C${hydra.job.num} + output_subdir: hydra diff --git a/examples/llvm_rl/config/environment/autophase-with-history.yaml b/examples/llvm_rl/config/environment/autophase-with-history.yaml new file mode 100644 index 000000000..bf72e3603 --- /dev/null +++ b/examples/llvm_rl/config/environment/autophase-with-history.yaml @@ -0,0 +1,13 @@ +--- +id: llvm-v0 +max_episode_steps: 45 +reward_space: IrInstructionCountOz +wrappers: + - wrapper: AutophaseActionSpace + - wrapper: AutophaseNormalizedFeatures + - wrapper: ConcatActionsHistogram + args: + norm_to_episode_len: 45 + - wrapper: ClampedReward + args: + leakiness_factor: 0.001 diff --git a/examples/llvm_rl/config/environment/autophase.yaml b/examples/llvm_rl/config/environment/autophase.yaml new file mode 100644 index 000000000..83140727a --- /dev/null +++ b/examples/llvm_rl/config/environment/autophase.yaml @@ -0,0 +1,10 @@ +--- +id: llvm-v0 +max_episode_steps: 45 +reward_space: IrInstructionCountOz +wrappers: + - wrapper: AutophaseActionSpace + - wrapper: AutophaseNormalizedFeatures + - wrapper: ClampedReward + args: + leakiness_factor: 0.001 diff --git a/examples/llvm_rl/config/environment/instcount-with-history.yaml b/examples/llvm_rl/config/environment/instcount-with-history.yaml new file mode 100644 index 000000000..5b68f8fc7 --- /dev/null +++ b/examples/llvm_rl/config/environment/instcount-with-history.yaml @@ -0,0 +1,11 @@ +--- +id: llvm-v0 +max_episode_steps: 45 +observation_space: InstCount +reward_space: IrInstructionCountOz +wrappers: + - wrapper: AutophaseActionSpace + - wrapper: ConcatActionsHistogram + - wrapper: ClampedReward + args: + leakiness_factor: 0.001 diff --git a/examples/llvm_rl/config/environment/instcount.yaml b/examples/llvm_rl/config/environment/instcount.yaml new file mode 100644 index 000000000..bd2763aae --- /dev/null +++ b/examples/llvm_rl/config/environment/instcount.yaml @@ -0,0 +1,10 @@ +--- +id: llvm-v0 +max_episode_steps: 45 +observation_space: InstCount +reward_space: IrInstructionCountOz +wrappers: + - wrapper: AutophaseActionSpace + - wrapper: ClampedReward + args: + leakiness_factor: 0.001 diff --git a/examples/llvm_rl/config/testing/all.yaml b/examples/llvm_rl/config/testing/all.yaml new file mode 100644 index 000000000..9584fd676 --- /dev/null +++ b/examples/llvm_rl/config/testing/all.yaml @@ -0,0 +1,33 @@ +--- +timeout_hours: 1 +exploration: false +runs_per_benchmark: 1 +benchmarks: + - dataset: benchmark://anghabench-v1 + max_benchmarks: 50 + - dataset: benchmark://blas-v0 + max_benchmarks: 50 + - dataset: benchmark://cbench-v1 + max_benchmarks: 50 + - dataset: benchmark://chstone-v0 + max_benchmarks: 50 + - dataset: benchmark://clgen-v0 + max_benchmarks: 50 + - dataset: generator://csmith-v0 + max_benchmarks: 50 + - dataset: benchmark://github-v0 + max_benchmarks: 50 + - dataset: benchmark://linux-v0 + max_benchmarks: 50 + - dataset: generator://llvm-stress-v0 + max_benchmarks: 50 + - dataset: benchmark://mibench-v0 + max_benchmarks: 50 + - dataset: benchmark://npb-v0 + max_benchmarks: 50 + - dataset: benchmark://opencv-v0 + max_benchmarks: 50 + - dataset: benchmark://poj104-v1 + max_benchmarks: 50 + - dataset: benchmark://tensorflow-v0 + max_benchmarks: 50 diff --git a/examples/llvm_rl/config/testing/cbench.yaml b/examples/llvm_rl/config/testing/cbench.yaml new file mode 100644 index 000000000..910184ddf --- /dev/null +++ b/examples/llvm_rl/config/testing/cbench.yaml @@ -0,0 +1,33 @@ +--- +timeout_hours: 1 +exploration: false +runs_per_benchmark: 1 +# The set of runnable cBench benchmarks. Enumerated using: +# +# >>> import compiler_gym +# >>> env = compiler_gym.make("llvm-v0") +# >>> for benchmark in env.datasets["benchmark://cbench-v1"]: +# ... env.reset(benchmark) +# ... if env.observation.IsRunnable(): +# ... print(benchmark) +# +benchmarks: + - uris: + - benchmark://cbench-v1/bitcount + - benchmark://cbench-v1/blowfish + - benchmark://cbench-v1/bzip2 + - benchmark://cbench-v1/crc32 + - benchmark://cbench-v1/dijkstra + - benchmark://cbench-v1/gsm + - benchmark://cbench-v1/jpeg-c + - benchmark://cbench-v1/jpeg-d + - benchmark://cbench-v1/patricia + - benchmark://cbench-v1/qsort + - benchmark://cbench-v1/sha + - benchmark://cbench-v1/stringsearch + - benchmark://cbench-v1/stringsearch2 + - benchmark://cbench-v1/susan + - benchmark://cbench-v1/tiff2bw + - benchmark://cbench-v1/tiff2rgba + - benchmark://cbench-v1/tiffdither + - benchmark://cbench-v1/tiffmedian diff --git a/examples/llvm_rl/config/testing/csmith-github-tensorflow.yaml b/examples/llvm_rl/config/testing/csmith-github-tensorflow.yaml new file mode 100644 index 000000000..05084a3c7 --- /dev/null +++ b/examples/llvm_rl/config/testing/csmith-github-tensorflow.yaml @@ -0,0 +1,11 @@ +--- +timeout_hours: 1 +exploration: false +runs_per_benchmark: 1 +benchmarks: + - dataset: generator://csmith-v0 + max_benchmarks: 50 + - dataset: benchmark://github-v0 + max_benchmarks: 50 + - dataset: benchmark://tensorflow-v0 + max_benchmarks: 50 diff --git a/examples/llvm_rl/config/training/csmith.yaml b/examples/llvm_rl/config/training/csmith.yaml new file mode 100644 index 000000000..2608fdcc0 --- /dev/null +++ b/examples/llvm_rl/config/training/csmith.yaml @@ -0,0 +1,12 @@ +--- +timeout_hours: 168 +episodes: 100000 +benchmarks: + - dataset: generator://csmith-v0 + max_benchmarks: 100000 + benchmarks_start_at: 100 # offset the test + validation sets +validation: + benchmarks: + - dataset: generator://csmith-v0 + max_benchmarks: 50 + benchmarks_start_at: 50 # offset the test set diff --git a/examples/llvm_rl/config/training/github.yaml b/examples/llvm_rl/config/training/github.yaml new file mode 100644 index 000000000..4bca19e53 --- /dev/null +++ b/examples/llvm_rl/config/training/github.yaml @@ -0,0 +1,12 @@ +--- +timeout_hours: 168 +episodes: 100000 +benchmarks: + - dataset: benchmark://github-v0 + max_benchmarks: 100000 + benchmarks_start_at: 100 # offset the test + validation sets +validation: + benchmarks: + - dataset: benchmark://github-v0 + max_benchmarks: 50 + benchmarks_start_at: 50 # offset the test set diff --git a/examples/llvm_rl/config/training/tensorflow.yaml b/examples/llvm_rl/config/training/tensorflow.yaml new file mode 100644 index 000000000..efa90c88b --- /dev/null +++ b/examples/llvm_rl/config/training/tensorflow.yaml @@ -0,0 +1,12 @@ +--- +timeout_hours: 168 +episodes: 100000 +benchmarks: + - dataset: benchmark://tensorflow-v0 + max_benchmarks: 100000 + benchmarks_start_at: 100 # offset the test + validation sets +validation: + benchmarks: + - dataset: benchmark://tensorflow-v0 + max_benchmarks: 50 + benchmarks_start_at: 50 # offset the test set diff --git a/examples/llvm_rl/eval.ipynb b/examples/llvm_rl/eval.ipynb new file mode 100644 index 000000000..9cb4e6f8c --- /dev/null +++ b/examples/llvm_rl/eval.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "839ae0e6-7920-4f33-920e-0c4f508c4b0d", + "metadata": {}, + "outputs": [], + "source": [ + "from paper.rl.model import Model\n", + "from typing import List\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib import ticker as mtick\n", + "from pathlib import Path\n", + "import scipy\n", + "\n", + "def models_from_paths(log_dirs: List[Path]):\n", + " # Read all the inputs first.\n", + " models: List[Model] = []\n", + " for path in log_dirs:\n", + " models += Model.from_logsdir(Path(path))\n", + " return models" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "836de56d-ffb6-4c7c-9f92-442c5c98209d", + "metadata": {}, + "outputs": [], + "source": [ + "LOGSDIR = Path(\"/home/cec/logs/rl/algo\")\n", + "\n", + "models = models_from_paths([LOGSDIR])\n", + "\n", + "for model in models:\n", + " df = model.dataframe\n", + " if not len(df):\n", + " continue\n", + " for trial_name in set(df.trial_name.values):\n", + " sdf = df[df[\"trial_name\"] == trial_name]\n", + " \n", + " trial_name = {\n", + " \"tss-C0-R0\": \"1e+05\",\n", + " \"tss-C1-R0\": \"1e+04\",\n", + " \"tss-C2-R0\": \"1e+03\",\n", + " \"tss-C3-R0\": \"1e+02\",\n", + " \"algo-impala-R0\": \"IMPALA\",\n", + " \"algo-ppo-R0\": \"PPO\",\n", + " \"algo-a2c-R0\": \"A2C\",\n", + " }.get(trial_name, trial_name)\n", + " \n", + "# Y = sdf[\"episode_reward_mean\"]\n", + "# Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", + "# plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\")\n", + " \n", + " Y = sdf[\"evaluation/episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\")\n", + " \n", + "plt.xlabel(\"#. training episodes\")\n", + "plt.ylabel(\"Mean codesize reduction\")\n", + "plt.gca().legend(loc=\"lower right\")\n", + "\n", + "# Log:\n", + "# plt.gca().set_xscale('log')\n", + "plt.xlim((1000, 100000))\n", + "plt.ylim((None, 1.3))\n", + "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", + "\n", + "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", + "plt.gcf().set_size_inches(5, 3)\n", + "\n", + "plt.savefig('/home/cec/Dropbox/Inbox/rl-algo.pdf', dpi=300, bbox_inches='tight')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f175bd9f-3b39-4c35-abc8-e0320ce39bf5", + "metadata": {}, + "outputs": [], + "source": [ + "LOGSDIR = Path(\"/home/cec/logs/rl/os\")\n", + "\n", + "models = models_from_paths([LOGSDIR])\n", + "\n", + "def plot(model, **linestyle):\n", + " df = model.dataframe\n", + " for trial_name in reversed(sorted(set(df.trial_name.values))):\n", + " sdf = df[df[\"trial_name\"] == trial_name]\n", + " \n", + " trial_name = {\n", + " \"os-instcount_hist-R0\": \"InstCount w. hist\",\n", + " \"os-autophase_hist-R0\": \"Autophase w. hist\",\n", + " \"os-instcount-R0\": \"InstCount\",\n", + " \"os-autophase-R0\": \"Autophase\",\n", + " }.get(trial_name, trial_name)\n", + "\n", + " Y = sdf[\"evaluation/episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=5)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name}\", **linestyle)\n", + " \n", + "plot(models[1], color=\"#b21aff\")\n", + "plot(models[3], color=\"#b21aff\", linestyle=\"--\")\n", + "plot(models[0], color=\"#ffb31a\")\n", + "plot(models[2], color=\"#ffb31a\", linestyle=\"--\")\n", + "\n", + "plt.xlabel(\"#. training episodes (log)\")\n", + "plt.ylabel(\"Mean codesize reduction\")\n", + "plt.gca().legend(loc=\"lower right\", ncol=2)\n", + "\n", + "# Log:\n", + "plt.gca().set_xscale('log')\n", + "plt.xlim((1000, 100000))\n", + "# plt.ylim((0.8, 1.1))\n", + "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", + "\n", + "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", + "plt.gcf().set_size_inches(5, 2.2)\n", + "\n", + "plt.savefig('/home/cec/Dropbox/Inbox/rl-os.pdf', dpi=300, bbox_inches='tight')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2d59df5-4487-456f-8a50-233e41d2e748", + "metadata": {}, + "outputs": [], + "source": [ + "LOGSDIR = Path(\"/home/cec/logs/rl/ts\")\n", + "\n", + "models = models_from_paths([LOGSDIR])\n", + "\n", + "for model in models:\n", + " df = model.dataframe\n", + " for trial_name in set(df.trial_name.values):\n", + " sdf = df[df[\"trial_name\"] == trial_name]\n", + " \n", + " trial_name = {\n", + " \"ts-C0-R0\": \"Github\",\n", + " \"ts-C1-R0\": \"TensorFlow\",\n", + " \"ts-C2-R0\": \"Linux\",\n", + " }.get(trial_name, trial_name)\n", + "\n", + " # Y = sdf[\"evaluation/episode_reward_mean\"]\n", + " Y = sdf[\"episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=5)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name}\")\n", + " \n", + "plt.xlabel(\"#. training episodes\")\n", + "plt.ylabel(\"Mean codesize reduction\")\n", + "plt.gca().legend(loc=\"lower right\", ncol=2)\n", + "\n", + "# Log:\n", + "plt.gca().set_xscale('log')\n", + "plt.xlim((1000, 100000))\n", + "# plt.ylim((0.8, 1.1))\n", + "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", + "\n", + "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", + "plt.gcf().set_size_inches(5, 2.5)\n", + "\n", + "plt.savefig('/home/cec/Dropbox/Inbox/rl-os.pdf', dpi=300, bbox_inches='tight')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0339dbdc-c179-4fc9-b89b-0b31de86de8b", + "metadata": {}, + "outputs": [], + "source": [ + "LOGSDIR = Path(\"/home/cec/logs/rl/tss\")\n", + "models = models_from_paths([LOGSDIR])\n", + "\n", + "for model, color in zip(models, [\"k\", \"green\", \"blue\"]):\n", + " df = model.dataframe\n", + " for trial_name in set(df.trial_name.values):\n", + " sdf = df[df[\"trial_name\"] == trial_name]\n", + " \n", + " trial_name = {\n", + " \"algo-impala-R0\": \"IMPALA\",\n", + " \"algo-ppo-R0\": \"PPO\",\n", + " \"algo-a2c-R0\": \"A2C\",\n", + " }.get(trial_name, trial_name)\n", + " \n", + " sigma=20\n", + " \n", + " Y = sdf[\"episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=sigma)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\", linestyle=\"--\", color=color)\n", + " \n", + " Y = sdf[\"evaluation/episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=sigma)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\", color=color)\n", + " \n", + "plt.xlabel(\"#. training episodes\")\n", + "plt.ylabel(\"Mean codesize reduction\")\n", + "plt.gca().legend(ncol=6, loc=\"lower right\")\n", + "\n", + "# Log:\n", + "# plt.gca().set_xscale('log')\n", + "plt.xlim((5000, 100000))\n", + "plt.ylim((None, 1.2))\n", + "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", + "\n", + "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", + "plt.gcf().set_size_inches(14, 3)\n", + "\n", + "plt.savefig('/home/cec/Dropbox/Inbox/rl-algo.pdf', dpi=300, bbox_inches='tight')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d389cc72-8a28-445f-b2eb-0d3c9a37844e", + "metadata": {}, + "outputs": [], + "source": [ + "LOGSDIR = Path(\"/home/cec/logs/rl/os\")\n", + "\n", + "models = models_from_paths([LOGSDIR])\n", + "\n", + "for model in models:\n", + " df = model.dataframe\n", + " for trial_name in set(df.trial_name.values):\n", + " sdf = df[df[\"trial_name\"] == trial_name]\n", + " \n", + " trial_name = {\n", + " \"tss-C0-R0\": \"1e+05\",\n", + " \"tss-C1-R0\": \"1e+04\",\n", + " \"tss-C2-R0\": \"1e+03\",\n", + " \"tss-C3-R0\": \"1e+02\",\n", + " }.get(trial_name, trial_name)\n", + " \n", + " Y = sdf[\"episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\")\n", + " \n", + " Y = sdf[\"evaluation/episode_reward_mean\"]\n", + " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", + " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\")\n", + " \n", + "plt.xlabel(\"#. training episodes\")\n", + "plt.ylabel(\"Mean codesize reduction\")\n", + "plt.gca().legend(loc=\"lower right\")\n", + "\n", + "# Log:\n", + "plt.gca().set_xscale('log')\n", + "plt.xlim((1000, 100000))\n", + "# plt.ylim((0.8, 1.1))\n", + "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", + "\n", + "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", + "plt.gcf().set_size_inches(5, 3)\n", + "\n", + "plt.savefig('/home/cec/Dropbox/Inbox/rl-training-set-size.pdf', dpi=300, bbox_inches='tight')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91b91b4c-8ebe-42e5-b6ee-73e8e1757872", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/llvm_rl/info.py b/examples/llvm_rl/info.py new file mode 100644 index 000000000..31ae32eed --- /dev/null +++ b/examples/llvm_rl/info.py @@ -0,0 +1,231 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import re +import sys +from pathlib import Path +from typing import List + +import humanize +import pandas as pd +from llvm_rl.model import Model, init_logging +from pydantic import ValidationError +from tabulate import tabulate +from typer import Typer + +from compiler_gym.util.statistics import geometric_mean + +app = Typer() + + +def models_from_paths(log_dirs: List[Path]): + # Read all the inputs first. + models: List[Model] = [] + for path in log_dirs: + try: + models += Model.from_logsdir(Path(path)) + except ValidationError as e: + print(e, file=sys.stderr) + sys.exit(1) + return models + + +@app.command() +def train(log_dirs: List[Path]): + init_logging() + + models = models_from_paths(log_dirs) + + dfs = [] + for model in models: + df = model.dataframe + if not len(df): + continue + + # Select only the rows with a checkpoint. + df = df[df["checkpoint"].values] + + df = df[ + [ + "trial_name", + "experiment_timestamp", + "episodes_total", + "episode_reward_geomean", + "episode_reward_mean", + "evaluation/episode_reward_mean", + "evaluation/episode_reward_geomean", + "time_total_s", + "complete", + "cpus", + "gpus", + ] + ] + + sdf = df.groupby( + ["experiment", "config", "replica", "experiment_timestamp"] + ).max() + + test_results = model.test_dataframes + sdf["test_results"] = [ + test_results.get(d, pd.DataFrame()) for d in sdf["trial_name"] + ] + + sdf["test_ic_mean"] = [ + sum(d["instruction_count_reduction"]) / len(d) + if not d.empty + else float("nan") + for d in sdf["test_results"] + ] + sdf["test_ic_geomean"] = [ + geometric_mean(d["instruction_count_reduction"]) + if not d.empty + else float("nan") + for d in sdf["test_results"] + ] + sdf["test_os_mean"] = [ + sum(d["object_size_reduction"]) / len(d) if not d.empty else float("nan") + for d in sdf["test_results"] + ] + sdf["test_os_geomean"] = [ + geometric_mean(d["object_size_reduction"]) if not d.empty else float("nan") + for d in sdf["test_results"] + ] + sdf["test_checkpoint"] = [ + int(d["test_checkpoint"].values[0].split("-")[-1]) if not d.empty else "" + for d in sdf["test_results"] + ] + + dfs.append(sdf.reset_index()) + + df = pd.concat(dfs) + + # Print everything. + pd.set_option("display.max_columns", None) + pd.set_option("display.max_rows", None) + pd.set_option("display.width", None) + + df = df.rename( + columns={ + "experiment_timestamp": "timestamp", + "episodes_total": "episodes", + "evaluation/episode_reward_geomean": "val_geomean", + "evaluation/episode_reward_mean": "val_mean", + "episode_reward_mean": "train_mean", + "episode_reward_geomean": "train_geomean", + "time_total_s": "training_time", + "test_reward_mean": "test_mean", + "test_reward_geomean": "test_geomean", + } + ) + + # Format for printing. + df["complete"] = [f"{x:.1%}" for x in df["complete"]] + df["episodes"] = [f"{int(x):,d}" for x in df["episodes"]] + df["training_time"] = [humanize.naturaldelta(x) for x in df["training_time"]] + + for reward in [ + "train_mean", + "train_geomean", + "val_mean", + "val_geomean", + "test_ic_geomean", + "test_os_geomean", + "test_ic_mean", + "test_os_mean", + ]: + df[reward] = [f"{x:.4f}" for x in df[reward].values] + + df = df[ + [ + "trial_name", + "timestamp", + "complete", + "episodes", + "training_time", + "test_checkpoint", + "train_geomean", + "val_geomean", + # "test_ic_geomean", + # "test_os_geomean", + ] + ] + + print(tabulate(df, headers="keys", showindex=False, tablefmt="psql")) + + +@app.command() +def test(log_dirs: List[Path]): + models = models_from_paths(log_dirs) + + # Print everything. + pd.set_option("display.max_columns", None) + pd.set_option("display.max_rows", None) + pd.set_option("display.width", None) + + dfs = {} + for model in models: + for trial, df in model.test_dataframes.items(): + df["dataset"] = [ + re.search(r"^((benchmark|generator)://)(.+)-v[012]/", d).group(3) + for d in df["benchmark"] + ] + + # Prune empty test set. + df = df[df["instruction_count_init"] > 0] + + gmean_df = ( + df[ + [ + "dataset", + "instruction_count_reduction", + "object_size_reduction", + ] + ] + .groupby(["dataset"]) + .agg(geometric_mean) + ) + + mean_df = ( + df[ + [ + "dataset", + "inference_walltime_seconds", + ] + ] + .groupby(["dataset"]) + .mean() + ) + + df = pd.concat((mean_df, gmean_df), axis=1) + df = df.reset_index() + df.insert(0, "trial", trial) + + # FIXME: Format for LaTeX + # df["instruction_count_reduction"] = [f"${float(d):.3f}\\times$" for d in df["instruction_count_reduction"]] + # df["object_size_reduction"] = [f"${float(d):.3f}\\times$" for d in df["object_size_reduction"]] + + print() + print(tabulate(df, headers="keys", showindex=False, tablefmt="psql")) + + dfs[trial] = df + + # FIXME: Format for paper: + # + # df = pd.concat(( + # # Instcounts + # dfs["algo-a2c-R0"][["instruction_count_reduction"]], + # dfs["algo-impala-R0"][["instruction_count_reduction"]], + # dfs["algo-ppo-R0"][["instruction_count_reduction"]], + # # Objsize + # dfs["algo-a2c-R0"][["object_size_reduction"]], + # dfs["algo-impala-R0"][["object_size_reduction"]], + # dfs["algo-ppo-R0"][["object_size_reduction"]], + # ), axis=1) + # + # for _, row in df.iterrows(): + # print("&"," & ".join(row), "\\\\") + + +if __name__ == "__main__": + app() diff --git a/examples/llvm_rl/model/__init__.py b/examples/llvm_rl/model/__init__.py new file mode 100644 index 000000000..e049f7dd9 --- /dev/null +++ b/examples/llvm_rl/model/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from .model import Model + +__all__ = [ + "Model", +] diff --git a/examples/llvm_rl/model/agent.py b/examples/llvm_rl/model/agent.py new file mode 100644 index 000000000..7d4f11e61 --- /dev/null +++ b/examples/llvm_rl/model/agent.py @@ -0,0 +1,122 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import warnings +from typing import Any, Dict + +import numpy as np +from omegaconf import DictConfig, ListConfig +from pydantic import BaseModel, Field, validator + +# Ignore import deprecation warnings from ray. +warnings.filterwarnings("ignore", category=DeprecationWarning) + +from ray.rllib.agents.a3c import A2CTrainer # noqa +from ray.rllib.agents.a3c import A3CTrainer # noqa +from ray.rllib.agents.dqn import ApexTrainer, R2D2Trainer # noqa +from ray.rllib.agents.impala import ImpalaTrainer # noqa +from ray.rllib.agents.ppo import PPOTrainer # noqa + +from .environment import Environment # noqa: E402 + + +class Agent(BaseModel): + """Represents the RL algorithm used.""" + + # === Start of fields list. === + + type: str = Field(allow_mutation=False) + """The name of the class used to instantiate the RL algorithm as a string, + e.g. :code:`"PPOTrainer". The class must be imported to this module to be + used. + """ + + args: Dict[str, Any] = Field(default={}, allow_mutation=False) + """A dictionary of arguments that are passed into the + :code:`type` constructor. + """ + + checkpoint_freq: int = Field(default=1, ge=1, allow_mutation=False) + """How frequently to checkpoint the agents progress, in rllib training + iterations. + """ + + checkpoint_at_end: bool = Field(default=True, allow_mutation=False) + """Whether to produce a final checkpoint at the end of training. + """ + + reuse_actors: bool = Field(default=True, allow_mutation=False) + """Whether to reuse workers between training iterations.""" + + # === Start of public API. === + + @property + def actual_type(self): + """Get the trainer class type.""" + return self._to_class(self.type) + + @property + def rllib_trainer_config_dict(self): + """Merge generated arguments with user trainer args dict.""" + config = { + "log_level": "INFO", + } + config.update(self.args) + return config + + def make_agent(self, environment: Environment): + """Construct an agent object.""" + try: + return self.actual_type(config=self.args, env=environment.rllib_id) + except TypeError as e: + raise TypeError( + "Error constructing RLlib trainer class " + f"{self.actual_type.__name__}: {e}" + ) from e + + def trainable_parameters_count(self, agent): + """Given an agent instance (created by :code:`make_agent()`), compute + and return the number of trainable parameters. + """ + framework = self.args.get("framework") + model = agent.get_policy().model + if framework == "torch": + return np.sum([np.prod(var.shape) for var in model.trainable_variables()]) + elif framework == "tf": + return np.sum( + [np.prod(v.get_shape().as_list()) for v in model.trainable_variables()] + ) + raise ValueError(f"Unknown framework: {framework}") + + # === Start of implementation details. === + + @staticmethod + def _to_class(value): + try: + return globals()[value] + except KeyError as e: + raise ValueError( + f"Unknown RLlib trainer class: {value}.\n" + "Make sure it is imported in rl/model/agent.py" + ) from e + + @validator("type") + def validate_type(cls, value): + cls._to_class(value) + return value + + @validator("args", pre=True) + def validate_args(cls, value): + def omegaconf_to_py(x): + if isinstance(x, DictConfig): + return {k: omegaconf_to_py(v) for k, v in x.items()} + elif isinstance(x, ListConfig): + return [omegaconf_to_py(v) for v in x] + else: + return x + + return omegaconf_to_py(value) + + class Config: + validate_assignment = True diff --git a/examples/llvm_rl/model/benchmarks.py b/examples/llvm_rl/model/benchmarks.py new file mode 100644 index 000000000..85c620e0c --- /dev/null +++ b/examples/llvm_rl/model/benchmarks.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from itertools import islice +from typing import Iterable, List, Union + +from pydantic import BaseModel, Field, root_validator, validator + +from compiler_gym.datasets import Benchmark +from compiler_gym.datasets.uri import BENCHMARK_URI_RE, DATASET_NAME_PATTERN +from compiler_gym.envs import CompilerEnv + + +class Benchmarks(BaseModel): + """Represents a set of benchmarks to use for training/validation/testing. + + There are two ways of describing benchmarks, either as a list of benchmark + URIs: + + benchmarks: + uris: + - benchmark://cbench-v1/adpcm + - benchmark://cbench-v1/ghostscript + + Or as a dataset to iterate over: + + benchmarks: + dataset: benchmark://cbench-v1 + max_benchmarks: 20 + """ + + # === Start of fields list. === + + dataset: str = Field(default=None, allow_mutation=False, regex=DATASET_NAME_PATTERN) + """The name of a dataset to iterate over. If set, benchmarks are produced + by iterating over this dataset in order. If not set, the :code:`uris` list + must be provided. + """ + + uris: List[str] = Field(default=[], allow_mutation=False) + """A list of URIs to iterate over.""" + + max_benchmarks: int = Field(default=0, ge=0, allow_mutation=False) + """The maximum number of benchmarks to yield from the given dataset or URIs + list. + """ + + benchmarks_start_at: int = Field(default=0, ge=0, allow_mutation=False) + """An offset into the dataset or URIs list to start iterating from. + + Note that using very large offsets will slow things down as the + implementation still has to iterate over the excluded benchmarks. + """ + + # === Start of public API. === + + def benchmarks_iterator(self, env: CompilerEnv) -> Iterable[Benchmark]: + """Return an iterator over the benchmarks.""" + return self._benchmark_iterator(env) + + def benchmark_uris_iterator(self, env: CompilerEnv) -> Iterable[str]: + """Return an iterator over the URIs of the benchmarks.""" + return self._benchmark_iterator(env, uris=True) + + # === Start of implementation details. === + + @root_validator + def check_that_either_dataset_or_uris_is_set(cls, values): + assert values.get("dataset") or values.get( + "uris" + ), "Neither dataset or uris given" + return values + + @validator("uris", pre=True) + def validate_uris(cls, value, *, values, **kwargs): + del kwargs + for uri in value: + assert BENCHMARK_URI_RE.match(uri), f"Invalid benchmark URI: {uri}" + return list(value) + + def _benchmark_iterator( + self, env: CompilerEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + return ( + self._uris_iterator(env, uris) + if self.uris + else self._dataset_iterator(env, uris) + ) + + def _uris_iterator( + self, env: CompilerEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + """Iterate from a URIs list.""" + start = self.benchmarks_start_at + n = len(self.uris) + if self.max_benchmarks: + n = min(len(self.uris), n) + + if uris: + # Shortcut in case we already have a list of URIs that we can slice + # rather than iterating over. + return iter(self.uris[start:n]) + + return islice((env.datasets.benchmark(u) for u in self.uris), start, start + n) + + def _dataset_iterator( + self, env: CompilerEnv, uris: bool = False + ) -> Union[Iterable[Benchmark], Iterable[str]]: + """Iterate from a dataset name.""" + dataset = env.datasets[self.dataset] + dataset.install() + n = dataset.size or self.max_benchmarks # dataset.size == 0 for inf + if self.max_benchmarks: + n = min(self.max_benchmarks, n) + start = self.benchmarks_start_at + iterator = dataset.benchmark_uris if uris else dataset.benchmarks + return islice(iterator(), start, start + n) + + class Config: + validate_assignment = True diff --git a/examples/llvm_rl/model/environment.py b/examples/llvm_rl/model/environment.py new file mode 100644 index 000000000..4bb8c8129 --- /dev/null +++ b/examples/llvm_rl/model/environment.py @@ -0,0 +1,132 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Any, Dict, List, Optional + +from llvm_autotuning.just_keep_going_env import JustKeepGoingEnv +from llvm_rl.wrappers import * # noqa wrapper definition +from pydantic import BaseModel, Field, validator +from pydantic.class_validators import root_validator + +import compiler_gym +from compiler_gym import CompilerEnv +from compiler_gym.wrappers import * # noqa wrapper definitions +from compiler_gym.wrappers import TimeLimit + + +class EnvironmentWrapperConfig(BaseModel): + """Description of a CompilerEnvWrapper class.""" + + # === Start of fields list. === + + wrapper: str = Field(allow_mutation=False) + """The name of the wrapper class. This class name must be imported into this + module. + """ + + args: Dict[str, Any] = Field(default={}, allow_mutation=False) + """"A dictionary of arguments to pass to the wrapper constructor.""" + + # === Start of public API. === + + @property + def wrapper_class(self): + """Return the wrapper class type.""" + return self._to_class(self.wrapper) + + def wrap(self, env: CompilerEnv) -> CompilerEnv: + """Wrap the given environment.""" + try: + return self.wrapper_class(env=env, **self.args) + except TypeError as e: + raise TypeError( + f"Error constructing CompilerEnv wrapper {self.wrapper_class.__name__}: {e}" + ) from e + + # === Start of implementation details. === + + @validator("wrapper") + def validate_wrapper(cls, value): + # Check that the class can be constructed. + cls._to_class(value) + return value + + @staticmethod + def _to_class(value: str): + try: + return globals()[value] + except KeyError as e: + raise ValueError( + f"Unknown wrapper class: {value}\n" + "Make sure it is imported in rl/model/environment.py" + ) from e + + class Config: + validate_assignment = True + + +class Environment(BaseModel): + """Represents a CompilerEnv environment.""" + + id: str = Field(allow_mutation=False) + """The environment ID, as passed to :code:`gym.make(...)`.""" + + reward_space: Optional[str] = Field(default=None, allow_mutation=False) + """The reward space to use, as a string.""" + + observation_space: Optional[str] = Field(default=None, allow_mutation=False) + """The observation space to use, as a string.""" + + max_episode_steps: int = Field(allow_mutation=False, gt=0) + """The maximum number of steps in an episode of this environment. For the + sake of consistency this *must* be defined. + """ + + wrappers: List[EnvironmentWrapperConfig] = Field(default=[], allow_mutation=False) + """A list of wrapper classes to apply to the environment.""" + + rllib_id: Optional[str] = Field(allow_mutation=False) + """The ID of the custom environment to register with RLlib. This shows up in + the logs but has no effect on behavior. Defaults to the `id` value. + """ + + # === Start of public API. === + + def make_env(self) -> CompilerEnv: + """Construct a compiler environment from the given config.""" + env = compiler_gym.make(self.id) + if self.observation_space: + env.observation_space = self.observation_space + if self.reward_space: + env.reward_space = self.reward_space + env = TimeLimit(env, max_episode_steps=self.max_episode_steps) + for wrapper in self.wrappers: + env = wrapper.wrap(env) + # Wrap the env to ignore errors during search. + env = JustKeepGoingEnv(env) + return env + + # === Start of implementation details. === + + @validator("id") + def validate_id(cls, value): + assert ( + value in compiler_gym.COMPILER_GYM_ENVS + ), f"Not a CompilerGym environment: {value}" + return value + + @validator("wrappers", pre=True) + def validate_wrappers(cls, value) -> List[EnvironmentWrapperConfig]: + # Convert the omegaconf ListConfig into a list of + # EnvironmentWrapperConfig objects. + return [EnvironmentWrapperConfig(**v) for v in value] + + @root_validator + def rllib_id_default_value(cls, values): + values["rllib_id"] = values["rllib_id"] or values["id"] + return values + + class Config: + validate_assignment = True + arbitrary_types_allowed = True diff --git a/examples/llvm_rl/model/inference_result.py b/examples/llvm_rl/model/inference_result.py new file mode 100644 index 000000000..e5443486e --- /dev/null +++ b/examples/llvm_rl/model/inference_result.py @@ -0,0 +1,118 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +from typing import List + +import numpy as np +from pydantic import BaseModel +from ray.rllib.agents.dqn import ApexTrainer, R2D2Trainer # noqa +from ray.rllib.agents.impala import ImpalaTrainer # noqa +from ray.rllib.agents.ppo import PPOTrainer # noqa + +from compiler_gym.envs import CompilerEnv +from compiler_gym.util.timer import Timer + +logger = logging.getLogger(__name__) + + +class InferenceResult(BaseModel): + """Represents the result of running an RL agent on a problem.""" + + # The benchmark URI. + benchmark: str + inference_walltime_seconds: float + commandline: str + episode_len: int + instruction_count_init: int + instruction_count_final: int + instruction_count_oz: int + instruction_count_reduction: float + """The final instruction count, normalized to -Oz.""" + object_size_init: int + object_size_final: int + object_size_oz: int + object_size_reduction: float + """The final object size, normalized to -Oz.""" + runtimes_init: List[float] + runtimes_final: List[float] + runtimes_o3: List[float] + runtime_reduction: float + """The final runtime, normalized to -Oz.""" + + @classmethod + def from_agent(cls, env: CompilerEnv, agent, runtimes_count: int = 30): + # We calculate our own reward at the end using the reward_util + # module, no need for incremental rewards during inference. + env.reward_space = None + + # Run inference on the environment. + observation, done = env.reset(), False + with Timer() as inference_timer: + while not done: + action = agent.compute_action(observation) + observation, _, done, _ = env.step(action) + + instruction_count_init = env.unwrapped.observation["IrInstructionCountO0"] + instruction_count_final = env.unwrapped.observation["IrInstructionCount"] + instruction_count_oz = env.unwrapped.observation["IrInstructionCountOz"] + + object_size_init = env.unwrapped.observation["ObjectTextSizeO0"] + object_size_final = env.unwrapped.observation["ObjectTextSizeBytes"] + object_size_oz = env.unwrapped.observation["ObjectTextSizeOz"] + + runtimes_init = [] + runtimes_o3 = [] + runtimes_final = [] + + try: + if env.unwrapped.observation["IsRunnable"]: + env.send_param( + "llvm.set_runtimes_per_observation_count", str(runtimes_count) + ) + env.unwrapped.observation["Runtime"] # warmup + runtimes_final = env.unwrapped.observation["Runtime"].tolist() + assert ( + len(runtimes_final) == runtimes_count + ), f"{len(runtimes_final)} != {runtimes_count}" + + env.reset() + env.send_param( + "llvm.set_runtimes_per_observation_count", str(runtimes_count) + ) + env.unwrapped.observation["Runtime"] # warmup + runtimes_init = env.unwrapped.observation["Runtime"].tolist() + assert ( + len(runtimes_init) == runtimes_count + ), f"{len(runtimes_init)} != {runtimes_count}" + + env.send_param("llvm.apply_baseline_optimizations", "-O3") + env.unwrapped.observation["Runtime"] # warmup + runtimes_o3 = env.unwrapped.observation["Runtime"].tolist() + assert ( + len(runtimes_o3) == runtimes_count + ), f"{len(runtimes_o3)} != {runtimes_count}" + except Exception as e: # pylint: disable=broad-except + logger.warning("Failed to compute runtime: %s", e) + + return cls( + benchmark=env.benchmark.uri, + inference_walltime_seconds=inference_timer.time, + commandline=env.commandline(), + episode_len=len(env.actions), + instruction_count_init=instruction_count_init, + instruction_count_final=instruction_count_final, + instruction_count_oz=instruction_count_oz, + instruction_count_reduction=instruction_count_oz + / max(instruction_count_final, 1), + object_size_init=object_size_init, + object_size_final=object_size_final, + object_size_oz=object_size_oz, + object_size_reduction=object_size_oz / max(object_size_final, 1), + runtimes_init=runtimes_init, + runtimes_final=runtimes_final, + runtimes_o3=runtimes_o3, + runtime_reduction=np.median(runtimes_o3 or [0]) + / max(np.median(runtimes_final or [0]), 1), + ) diff --git a/examples/llvm_rl/model/model.py b/examples/llvm_rl/model/model.py new file mode 100644 index 000000000..ba95a5e96 --- /dev/null +++ b/examples/llvm_rl/model/model.py @@ -0,0 +1,526 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import json +import logging +import sys +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, Iterable, List, Optional + +import pandas as pd +import ray +import yaml +from fasteners import InterProcessLock +from pydantic import BaseModel, Field +from ray import tune + +from compiler_gym.util.executor import Executor +from compiler_gym.util.shell_format import indent, plural +from compiler_gym.util.statistics import geometric_mean + +from .agent import Agent +from .environment import Environment +from .inference_result import InferenceResult +from .testing import Testing +from .training import Training + +logger = logging.getLogger(__name__) + + +class Model(BaseModel): + """The composition of the full environment, agent, training / testing + regime, and execution environment. Provides the API for training / testing. + """ + + # === Start of fields list. === + + executor: Executor + """The execution environment to use for training / testing jobs.""" + + environment: Environment = Field(allow_mutation=False) + """Description of the environment, which defines the particular optimization + problem, the reward signal for training, and the representation of state + that the agent receives. + """ + + agent: Agent = Field(allow_mutation=False) + """The agent describes the RLlib training algorithm that is used.""" + + training: Training = Field(allow_mutation=False) + """Description of the training regime: the benchmarks to learn over, and how + long to learn for. + """ + + testing: Testing = Field(allow_mutation=False) + """The testing setup.""" + + working_directory: Path = Field(allow_mutation=False) + """The working directory where logs and other artifacts are written to.""" + + experiment: str = Field(default="unnamed_experiment", allow_mutation=False) + """A logical name for this experiment. This is used for naming RLlib + trials. + """ + + num_replicas: int = Field(default=1, ge=1, allow_mutation=False) + """The number of duplicate jobs to run. E.g. for training, this will train + :code:`n` independent models in trials that share the same working + directory. + """ + + job_id: int = Field(default=0, allow_mutation=0) + """An optional numeric job ID.""" + + seed: int = Field(default=0xCC, allow_mutation=False) + """The numeric seed to use""" + + compiler_gym_version: str = Field(default="", allow_mutation=False) + """The compiler_gym.__version__ string.""" + + # === Start of public API. === + + def train(self) -> None: + """Run the training job for this model.""" + logger.info("Model:\n%s", indent(self.yaml(), 4)) + + logger.info("Starting training job in %s", self.working_directory) + # The working directory may already have been created by hydra, so we + # will check for the training-model.json file below to see if this + # directory has already been used for training. + self.working_directory.mkdir(parents=True, exist_ok=True) + + # Dump the parsed config to file. + model_dump_path = self.working_directory / "training-model.json" + assert not model_dump_path.is_file(), ( + f"Refusing to overwrite file: {model_dump_path}. " + "Is the working directory clean?" + ) + with open(model_dump_path, "w") as f: + print(json.dumps(json.loads(self.json()), indent=2), file=f) + + with self.executor.get_executor( + logs_dir=self.working_directory / "slurm", + # Provision an extra hour for RLlib overhead. + timeout_hours=self.training.timeout_hours + 1, + ) as executor: + for i in range(self.num_replicas): + executor.submit(train_job, model=self, seed=self.seed + i, replica_id=i) + + def test_checkpoints( + self, metric: str = "evaluation/episode_reward_mean" + ) -> Iterable[Path]: + df = self.dataframe + if not len(df): + return + + for logsdir in set(df["logsdir"].values): + sdf = df[(df["logsdir"] == logsdir) & df["checkpoint"]] + if not len(sdf): + continue + + sdf = sdf.reset_index() + idx = sdf[metric].idxmax() + best = sdf.iloc[idx] + + logger.info( + "Selected checkpoint %s with %s %f", + best["checkpoint_path"], + metric, + best[metric], + ) + yield Path(best["checkpoint_path"]) + + def test(self) -> None: + """Run the testing job for this model.""" + # Gather all the jobs to run now. We will submit them all in a batch. + jobs = [] + for checkpoint in self.test_checkpoints(): + assert checkpoint.is_file(), f"Checkpoint not found: {checkpoint}" + + # Go up two levels to the main directory + test_dir = checkpoint.parent.parent + assert (test_dir / "progress.csv").is_file() + + # Make sure there aren't any other test jobs. Don't block on error, + # just fail. + lock = InterProcessLock(test_dir / ".test-lock") + lock.acquire(blocking=False) + + # Try not to have to launch a job. + if (test_dir / "test-meta.json").is_file(): + with open(test_dir / "test-meta.json") as f: + meta = json.load(f) + if meta.get("checkpoint") == checkpoint.name: + logger.info( + "Already have test results for %s, nothing to do", + checkpoint.name, + ) + continue + + jobs.append((lock, checkpoint, test_dir)) + + # Submit all the jobs now. + with self.executor.get_executor( + logs_dir=self.working_directory / "slurm", + # Provision an extra hour for RLlib overhead. + timeout_hours=self.testing.timeout_hours + 1, + # Single threaded evaluation loop. + cpus=2, + ) as executor: + for lock, checkpoint, test_dir in jobs: + # Let go of the test lock. This begins the section of code where + # races can occur if someone else comes along and grabs the lock + # before the test job can take it over. + lock.release() + executor.submit( + test_job, model=self, checkpoint=checkpoint, outputs_dir=test_dir + ) + + def yaml(self) -> str: + """Serialize the model configuration to a YAML string.""" + # We can't directly dump the dict() representation because we need to + # simplify the types first, so we go via JSON. + simplified_data = json.loads(self.json()) + return yaml.dump(simplified_data) + + @property + def dataframe(self) -> pd.DataFrame: + if not (self.working_directory / "train").is_dir(): + return pd.DataFrame([]) + + dfs = [] + for subdir in (self.working_directory / "train").iterdir(): + if not subdir.is_dir(): + continue + + df = self._trial_to_dataframe(subdir) + if df is not None: + dfs.append(df) + df.to_csv(subdir / "progress-redux.csv") + + return pd.concat(dfs) if dfs else pd.DataFrame([]) + + def _trial_to_dataframe(self, directory: Path) -> Optional[pd.DataFrame]: + components = directory.name.split("-") + if len(components) < 3: + logger.warning( + "Directory name does not match expected " + "{experiment}-{config}-{replica} format: %s", + directory, + ) + return + + replica = components[-1] + config = components[-2] + experiment = "-".join(components[:-2]) + + if not (directory / "progress.csv").is_file(): + logger.warning("File not found: %s", directory / "progress.csv") + return + + try: + df = pd.read_csv(directory / "progress.csv") + except pd.errors.EmptyDataError: + return None + + df.insert(0, "logsdir", str(directory)) + df.insert( + 0, + "experiment_timestamp", + " ".join( + [ + self.working_directory.parent.parent.name, + self.working_directory.parent.name, + ] + ), + ) + df.insert(0, "trial_name", directory.name) + df.insert(0, "replica", replica) + df.insert(0, "config", config) + df.insert(0, "experiment", experiment) + + df["checkpoint"] = [ + (directory / f"checkpoint_{i:06d}").is_dir() + for i in df["training_iteration"] + ] + df["checkpoint_path"] = [ + str(directory / f"checkpoint_{i:06d}" / f"checkpoint-{i}") + if (directory / f"checkpoint_{i:06d}").is_dir() + else None + for i in df["training_iteration"] + ] + + df["evaluation/episode_reward_geomean"] = [ + geometric_mean(eval(x)) for x in df["evaluation/hist_stats/episode_reward"] + ] + + df["episode_reward_geomean"] = [ + geometric_mean(eval(x)) for x in df["hist_stats/episode_reward"] + ] + + df["complete"] = [ + min(d / self.training.episodes, 1) for d in df["episodes_total"] + ] + + df["cpus"] = self.executor.cpus + df["gpus"] = self.executor.gpus + + df = df.set_index(["experiment", "config", "replica", "training_iteration"]) + + return df + + @property + def test_dataframes(self) -> Dict[str, pd.DataFrame]: + """Get a dictionary of test dataframes, keyed by trial name.""" + results = {} + + if not (self.working_directory / "train").is_dir(): + return results + + for subdir in (self.working_directory / "train").iterdir(): + if not subdir.is_dir(): + continue + + if not (subdir / "test-results.json").is_file(): + continue + if not (subdir / "test-meta.json").is_file(): + continue + + with open(subdir / "test-meta.json") as f: + meta = json.load(f) + + df = pd.read_json(subdir / "test-results.json") + df["test_checkpoint"] = meta["checkpoint"] + df["test_timestamp"] = meta["timestamp"] + results[subdir.name] = df + + return results + + @classmethod + def from_logsdir(cls, working_directory: Path) -> List["Model"]: + """Reconstruct models by recursively reading from logs directories.""" + + def find_models(dir: Path) -> Iterable[Path]: + """Attempt to locate models recursively from logs directories.""" + if (dir / "training-model.json").is_file(): + yield dir / "training-model.json" + return + + for entry in dir.iterdir(): + if entry.is_dir(): + yield from find_models(entry) + + models: List[Model] = [] + for model_file in find_models(working_directory): + with open(model_file) as f: + try: + model = json.load(f) + model["working_directory"] = model_file.parent + models.append(cls(**model)) + except json.decoder.JSONDecodeError as e: + logger.warning( + "Failed to parse JSON for model file %s: %s", model_file, e + ) + continue + return models + + # === Start of implementation details. === + + def make_rllib_trainer_config(self, seed: int) -> Dict[str, Any]: + """Coerce user preferences into a dictionary of arguments for RLlib + trainer class. + """ + with self.environment.make_env() as env: + evaluation_num_episodes = len( + list(self.training.validation.benchmark_uris_iterator(env)) + ) + logger.info( + "Calculated the number of episodes per evaluation to be %d", + evaluation_num_episodes, + ) + if not evaluation_num_episodes: + raise ValueError("#. of validation episodes is 0!") + + derived_args = { + "env": self.environment.rllib_id, + "seed": seed, + "horizon": self.environment.max_episode_steps, + # Reserve one CPU for the trainer, the rest for rollout workers. + "num_workers": self.executor.cpus - 1, + "num_cpus_per_worker": 1, + "num_gpus": self.executor.gpus, + # Set the number of evaluation episodes to the size of the + # validation set. + "evaluation_num_episodes": evaluation_num_episodes, + # 1 checkpoint = 1 evaluation. + "evaluation_interval": self.agent.checkpoint_freq, + # Argument dictionary passed to make_env(). + "env_config": {"type": "training"}, + "evaluation_config": { + "env_config": {"type": "validation"}, + }, + } + # Merge with the user args. In case of conflict, the user's arg value + # overrides the derived arg value. + return merge(derived_args, self.agent.args) + + class Config: + validate_assignment = True + + +def test_job(model: Model, checkpoint: Path, outputs_dir: Path) -> None: + init_logging() + + # Make sure there aren't any other test jobs. Don't block on error, + # just fail. + InterProcessLock(outputs_dir / ".test-lock").acquire(blocking=False) + + logger.info( + "Initializing ray with 2 cpus and %d GPUs", + model.executor.gpus, + ) + ray.init( + num_cpus=2, + num_gpus=model.executor.gpus, + include_dashboard=False, + ) + + tune.register_env( + model.environment.rllib_id, lambda _: model.environment.make_env() + ) + agent = model.agent.make_agent(model.environment) + + logger.info( + "Restoring %s agent with %s trainable params from %s", + model.agent.type, + f"{model.agent.trainable_parameters_count(agent):,}", + checkpoint, + ) + agent.restore(str(checkpoint)) + + # Run inference on all of the test benchmarks. + results: List[InferenceResult] = [] + + with model.environment.make_env() as env: + test_benchmarks = list(model.testing.benchmark_uris_iterator(env)) + for i, benchmark in enumerate(test_benchmarks, start=1): + env.reset(benchmark=benchmark) + result = InferenceResult.from_agent(env, agent) + logger.info( + "Test %s of %s: %s", + f"{i:,d}", + f"{len(test_benchmarks):,d}", + result, + ) + results.append(result) + + # Do this once the actual work has been done so that failed jobs + # don't leave meta files lying around. + with open(outputs_dir / "test-results.json", "w") as f: + json.dump([r.dict() for r in results], f) + with open(outputs_dir / "test-meta.json", "w") as f: + json.dump( + { + "timestamp": datetime.now().isoformat(), + "checkpoint": checkpoint.name, + }, + f, + ) + + # Explicit call to ray shutdown here so that multiple consecutive + # jobs can initialize ray with different resource requirements. + ray.shutdown() + + +def train_job(model: Model, seed: int, replica_id: int) -> None: + init_logging() + + logger.info( + "Initializing ray with %d %s and %d %s", + model.executor.cpus, + plural(model.executor.cpus, "CPU", "CPUs"), + model.executor.gpus, + plural(model.executor.gpus, "GPU", "GPUs"), + ) + ray.init( + num_cpus=model.executor.cpus, + num_gpus=model.executor.gpus, + include_dashboard=True, + ) + + logger.info("Registered RLlib environment %s", model.environment.rllib_id) + + def make_env(env_config: Dict[str, Any]): + """Construct a training or validation environment.""" + env = model.environment.make_env() + if "type" not in env_config: + raise KeyError(f"No type in dict: {env_config}") + if env_config["type"] == "training": + return model.training.wrap_env(env) + elif env_config["type"] == "validation": + return model.training.validation.wrap_env(env) + raise ValueError(f"Unknown environment type: {env_config['type']}") + + tune.register_env( + model.environment.rllib_id, + make_env, + ) + + def trial_name_creator(trial): + del trial # Unused + # NOTE(cummins): Only a single trial per isntance. + return f"{model.experiment}-C{model.job_id}-R{replica_id}" + + def trial_dirname_creator(trial): + del trial # Unused + return f"{model.experiment}-C{model.job_id}-R{replica_id}" + + rllib_opts = { + "config": model.make_rllib_trainer_config(seed), + "time_budget_s": model.training.timeout_hours * 3600, + "stop": { + "episodes_total": model.training.episodes, + }, + "reuse_actors": model.agent.reuse_actors, + "checkpoint_freq": model.agent.checkpoint_freq, + "checkpoint_at_end": model.agent.checkpoint_at_end, + # Write RLlib files to: "/train/-". + "local_dir": str(model.working_directory), + "name": "train", + } + logger.info("RLlib options:\n%s", json.dumps(rllib_opts, indent=2)) + tune.run( + model.agent.actual_type, + trial_name_creator=trial_name_creator, + trial_dirname_creator=trial_dirname_creator, + **rllib_opts, + ) + + # Explicit call to ray shutdown here so that multiple consecutive + # jobs can initialize ray with different resource requirements. + ray.shutdown() + + +def merge(a, b, path=None): + "Update values in `a` with values from `b`. Supported nested dicts." + if path is None: + path = [] + for key in b: + if key in a and isinstance(a[key], dict) and isinstance(b[key], dict): + merge(a[key], b[key], path + [str(key)]) + else: + a[key] = b[key] + return a + + +def init_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.DEBUG) + formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + handler.setFormatter(formatter) + logger.addHandler(handler) diff --git a/examples/llvm_rl/model/testing.py b/examples/llvm_rl/model/testing.py new file mode 100644 index 000000000..a5353ddb2 --- /dev/null +++ b/examples/llvm_rl/model/testing.py @@ -0,0 +1,84 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging +from itertools import islice +from typing import Iterable, List + +import numpy as np +from pydantic import BaseModel, Field, validator + +from compiler_gym.datasets import Benchmark +from compiler_gym.envs import CompilerEnv + +from .benchmarks import Benchmarks + +logger = logging.getLogger(__name__) + + +class Testing(BaseModel): + """The testing regime.""" + + __test__ = False # Prevent pytest from thinking that this class is a test. + + # === Start of fields list. === + + timeout_hours: float = Field(allow_mutation=False, gt=0) + """The timeout for test jobs, in hours.""" + + benchmarks: List[Benchmarks] = Field(allow_mutation=False) + """The set of benchmarks to test on.""" + + runs_per_benchmark: int = Field(default=1, ge=1, allow_mutation=False) + """The number of inference episodes to run on each benchmark. If the + environment and policy are deterministic then running multiple episodes per + benchmark is only useful for producing accurate aggregate measurements of + inference walltime. + """ + + # === Start of public API. === + + def benchmarks_iterator(self, env: CompilerEnv) -> Iterable[Benchmark]: + """Return an iterator over the test benchmarks.""" + for _ in range(self.runs_per_benchmark): + for bm in self.benchmarks: + yield from bm.benchmarks_iterator(env) + + def benchmark_uris_iterator(self, env: CompilerEnv) -> Iterable[str]: + """Return an iterator over the test benchmark URIs.""" + for _ in range(self.runs_per_benchmark): + for bm in self.benchmarks: + yield from bm.benchmark_uris_iterator(env) + + # === Start of implementation details. === + + @validator("benchmarks", pre=True) + def validate_benchmarks(cls, value): + return [Benchmarks(**v) for v in value] + + class Config: + validate_assignment = True + + +def get_testing_benchmarks( + env: CompilerEnv, max_benchmarks: int = 50, seed: int = 0 +) -> List[str]: + rng = np.random.default_rng(seed=seed) + for dataset in env.datasets: + if dataset.name == "generator://csmith-v0": + yield from islice(dataset.benchmarks(), 50) + elif not dataset.size or dataset.size > max_benchmarks: + logger.info( + "Selecting random %d benchmarks from dataset %s of size %d", + max_benchmarks, + dataset, + dataset.size, + ) + for _ in range(max_benchmarks): + yield dataset.random_benchmark(rng) + else: + logger.info( + "Selecting all %d benchmarks from dataset %s", dataset.size, dataset + ) + yield from dataset.benchmarks() diff --git a/examples/llvm_rl/model/training.py b/examples/llvm_rl/model/training.py new file mode 100644 index 000000000..6079e1f32 --- /dev/null +++ b/examples/llvm_rl/model/training.py @@ -0,0 +1,88 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Iterable, List + +from pydantic import BaseModel, Field, validator + +from compiler_gym.datasets import Benchmark +from compiler_gym.envs import CompilerEnv +from compiler_gym.wrappers import ( + CycleOverBenchmarks, + CycleOverBenchmarksIterator, + IterateOverBenchmarks, +) + +from .benchmarks import Benchmarks +from .validation import Validation + + +class Training(BaseModel): + """The training regime.""" + + timeout_hours: float = Field(allow_mutation=False, gt=0) + """The maximum runtime of the training job.""" + + episodes: int = Field(ge=1, allow_mutation=False) + """The number of episodes to train for.""" + + benchmarks: List[Benchmarks] = Field(allow_mutation=False) + """The programs to train over.""" + + validation: Validation = Field(allow_mutation=False) + """The validation set.""" + + cycle_over_benchmarks: bool = Field(default=True, allow_mutation=False) + """If :code:`True`, the benchmark iterator repeats itself once an entire + epoch has completed. Set this to :code:`False` to disable benchmarks from + being cached. + """ + + cache_benchmarks: bool = Field(default=False, allow_mutation=False) + """If :code:`True`, construct the actual benchmark objects during iteration. + This will make it faster to cycle over the same set of benchmarks multiple + times, but requires enough resources to hold all of the benchmark objects in + memory. If :code:`False`, just the benchmark URIs are cached in memory. + """ + + # === Start of public API. === + + def benchmarks_iterator(self, env: CompilerEnv) -> Iterable[Benchmark]: + """Return an iterator over the training benchmarks.""" + for bm in self.benchmarks: + yield from bm.benchmarks_iterator(env) + + def benchmark_uris_iterator(self, env: CompilerEnv) -> Iterable[str]: + """Return an iterator over the training benchmark URIs.""" + for bm in self.benchmarks: + yield from bm.benchmark_uris_iterator(env) + + def wrap_env(self, env: CompilerEnv) -> CompilerEnv: + """Wrap an environment for use in the training loop that is configured + to iterate over the training benchmarks on each call to :code:`reset()`. + """ + if self.cycle_over_benchmarks and self.cache_benchmarks: + wrapper = CycleOverBenchmarks + elif self.cycle_over_benchmarks: + return CycleOverBenchmarksIterator( + env=env, + make_benchmark_iterator=lambda: self.benchmark_uris_iterator(env), + ) + else: + wrapper = IterateOverBenchmarks + iterator = ( + self.benchmarks_iterator + if self.cache_benchmarks + else self.benchmark_uris_iterator + ) + return wrapper(env=env, benchmarks=iterator(env)) + + # === Start of implementation details. === + + @validator("benchmarks", pre=True) + def validate_benchmarks(cls, value): + return [Benchmarks(**v) for v in value] + + class Config: + validate_assignment = True diff --git a/examples/llvm_rl/model/validation.py b/examples/llvm_rl/model/validation.py new file mode 100644 index 000000000..72c08103f --- /dev/null +++ b/examples/llvm_rl/model/validation.py @@ -0,0 +1,55 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from typing import Iterable, List + +from pydantic import BaseModel, Field, validator + +from compiler_gym.datasets import Benchmark +from compiler_gym.envs import CompilerEnv +from compiler_gym.wrappers import CycleOverBenchmarks + +from .benchmarks import Benchmarks + + +class Validation(BaseModel): + """The validation set which is used for periodically evaluating agent + performance during training. + """ + + # === Start of fields list. === + + benchmarks: List[Benchmarks] = Field(allow_mutation=False) + """The benchmarks to evaluate agent performance on. These must be distinct + from the training and testing sets (this requirement is not enforced by the + API, you have to do it yourself). + """ + + # === Start of public API. === + + def benchmarks_iterator(self, env: CompilerEnv) -> Iterable[Benchmark]: + """Return an iterator over the validation benchmarks.""" + for bm in self.benchmarks: + yield from bm.benchmarks_iterator(env) + + def benchmark_uris_iterator(self, env: CompilerEnv) -> Iterable[str]: + """Return an iterator over the training benchmark URIs.""" + for bm in self.benchmarks: + yield from bm.benchmark_uris_iterator(env) + + def wrap_env(self, env: CompilerEnv) -> CompilerEnv: + """Wrap an environment for use in the training loop that is configured + to iterate over the validation benchmarks on each call to + :code:`reset()`. + """ + return CycleOverBenchmarks(env=env, benchmarks=self.benchmarks_iterator(env)) + + # === Start of implementation details. === + + @validator("benchmarks", pre=True) + def validate_benchmarks(cls, value): + return [Benchmarks(**v) for v in value] + + class Config: + validate_assignment = True diff --git a/examples/llvm_rl/test.py b/examples/llvm_rl/test.py new file mode 100644 index 000000000..835e361f3 --- /dev/null +++ b/examples/llvm_rl/test.py @@ -0,0 +1,24 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import sys +from pathlib import Path +from typing import List + +from paper.rl.model import Model + + +def main(argv): + paths = argv[1:] or ["~/logs/compiler_gym/llvm_rl"] + + models: List[Model] = [] + for path in paths: + models += Model.from_logsdir(Path(path).expanduser()) + + for model in models: + model.test() + + +if __name__ == "__main__": + main(sys.argv) diff --git a/examples/llvm_rl/tests/benchmarks_test.py b/examples/llvm_rl/tests/benchmarks_test.py new file mode 100644 index 000000000..8d90a68e4 --- /dev/null +++ b/examples/llvm_rl/tests/benchmarks_test.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import pytest +from llvm_rl.model.training import Benchmarks +from omegaconf import OmegaConf +from pydantic import ValidationError + +import compiler_gym +from compiler_gym.datasets import Benchmark + + +def test_benchmarks_missing_dataset_and_uris(): + with pytest.raises(ValidationError): + Benchmarks() + + +def test_benchmarks_uris_list(): + cfg = Benchmarks(uris=["benchmark://cbench-v1/qsort"]) + assert cfg.uris == ["benchmark://cbench-v1/qsort"] + + with compiler_gym.make("llvm-v0") as env: + assert list(cfg.benchmarks_iterator(env)) == ["benchmark://cbench-v1/qsort"] + assert isinstance(list(cfg.benchmarks_iterator(env))[0], Benchmark) + assert list(cfg.benchmark_uris_iterator(env)) == ["benchmark://cbench-v1/qsort"] + + +def test_validation_benchmarks_uris_list_yaml(): + cfg = Benchmarks( + **OmegaConf.create( + """\ +uris: + - benchmark://cbench-v1/qsort +""" + ) + ) + assert len(cfg.uris) == 1 + + +def test_benchmarks_uris_invalid_regex(): + with pytest.raises(ValidationError): + Benchmarks(uris=["bad-uri"]) diff --git a/examples/llvm_rl/tests/environment_test.py b/examples/llvm_rl/tests/environment_test.py new file mode 100644 index 000000000..d5a15c37a --- /dev/null +++ b/examples/llvm_rl/tests/environment_test.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from llvm_rl.model.environment import Environment + + +def test_basic_environment_config(): + model = Environment(id="llvm-ic-v0", max_episode_steps=3) + with model.make_env() as env: + assert env.spec.id == "llvm-ic-v0" + assert env.reward_space == "IrInstructionCountOz" + + # Test max episode steps: + env.reset() + _, _, done, _ = env.step(env.action_space.sample()) # step 1 + assert not done + + _, _, done, _ = env.step(env.action_space.sample()) # step 2 + assert not done + + _, _, done, _ = env.step(env.action_space.sample()) # step 3 + assert done + + +def test_reward_and_observation_space(): + model = Environment( + id="llvm-ic-v0", + max_episode_steps=3, + observation_space="Ir", + reward_space="ObjectTextSizeBytes", + ) + with model.make_env() as env: + assert env.reward_space == "ObjectTextSizeBytes" + assert env.observation_space_spec.id == "Ir" + + +def test_wrappers(): + model = Environment( + id="llvm-ic-v0", + max_episode_steps=3, + wrappers=[ + { + "wrapper": "ConstrainedCommandline", + "args": {"flags": ["-mem2reg", "-reg2mem"]}, + } + ], + ) + with model.make_env() as env: + assert env.action_space.flags == ["-mem2reg", "-reg2mem"] + assert env.action_space.n == 2 diff --git a/examples/llvm_rl/tests/testing_test.py b/examples/llvm_rl/tests/testing_test.py new file mode 100644 index 000000000..698201cc6 --- /dev/null +++ b/examples/llvm_rl/tests/testing_test.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from llvm_rl.model.testing import Testing +from omegaconf import OmegaConf + +import compiler_gym + + +def test_testing_config(): + cfg = Testing( + **OmegaConf.create( + """\ +timeout_hours: 12 +runs_per_benchmark: 6 +benchmarks: + - dataset: benchmark://cbench-v1 + max_benchmarks: 5 +""" + ) + ) + assert cfg.timeout_hours == 12 + with compiler_gym.make("llvm-v0") as env: + assert len(list(cfg.benchmark_uris_iterator(env))) == 5 * 6 diff --git a/examples/llvm_rl/tests/training_integration_test.py b/examples/llvm_rl/tests/training_integration_test.py new file mode 100644 index 000000000..67c44b239 --- /dev/null +++ b/examples/llvm_rl/tests/training_integration_test.py @@ -0,0 +1,86 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import json +import sys +import warnings +from pathlib import Path + +from llvm_rl.model.model import Model +from omegaconf import OmegaConf + + +def test_local_train(tmp_path: Path): + model = Model( + **OmegaConf.create( + f"""\ +experiment: tiger +working_directory: {tmp_path}/outputs +executor: + type: local + cpus: 2 +environment: + id: llvm-autophase-ic-v0 + max_episode_steps: 3 +agent: + type: PPOTrainer + args: + lr: 1.e-3 + model: + fcnet_hiddens: [16] + fcnet_activation: relu + framework: torch + rollout_fragment_length: 8 + train_batch_size: 8 + sgd_minibatch_size: 8 +training: + timeout_hours: 0.25 + episodes: 32 + benchmarks: + - dataset: benchmark://cbench-v1 + max_benchmarks: 3 + validation: + benchmarks: + - dataset: benchmark://cbench-v1 + max_benchmarks: 3 +testing: + timeout_hours: 0.25 + benchmarks: + - dataset: benchmark://cbench-v1 + max_benchmarks: 3 +""" + ) + ) + warnings.filterwarnings("ignore", category=DeprecationWarning) + model.train() + + print("Outputs", list((tmp_path / "outputs").iterdir()), file=sys.stderr) + assert (tmp_path / "outputs").is_dir() + with open(tmp_path / "outputs" / "training-model.json") as f: + assert json.load(f) + + assert (tmp_path / "outputs" / "train").is_dir() + print("Outputs", list((tmp_path / "outputs" / "train").iterdir()), file=sys.stderr) + + # Check that a checkpoint was created. + assert ( + tmp_path + / "outputs" + / "train" + / "tiger-C0-R0" + / "checkpoint_000001" + / "checkpoint-1" + ).is_file() + + model.test() + print( + "Trail files", + list((tmp_path / "outputs" / "train" / "tiger-C0-R0").iterdir()), + file=sys.stderr, + flush=True, + ) + assert (tmp_path / "outputs" / "train" / "tiger-C0-R0" / "test-meta.json").is_file() + assert ( + tmp_path / "outputs" / "train" / "tiger-C0-R0" / "test-results.json" + ).is_file() diff --git a/examples/llvm_rl/tests/training_test.py b/examples/llvm_rl/tests/training_test.py new file mode 100644 index 000000000..3b3316a1c --- /dev/null +++ b/examples/llvm_rl/tests/training_test.py @@ -0,0 +1,27 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from llvm_rl.model.training import Training +from omegaconf import OmegaConf + + +def test_parse_yaml(): + cfg = Training( + **OmegaConf.create( + """\ +timeout_hours: 10 +episodes: 1000 +benchmarks: + - uris: + - benchmark://cbench-v1/qsort + - dataset: benchmark://cbench-v1 + max_benchmarks: 2 +validation: + benchmarks: + - uris: + - benchmark://cbench-v1/qsort +""" + ) + ) + assert cfg.timeout_hours == 10 diff --git a/examples/llvm_rl/tests/validation_test.py b/examples/llvm_rl/tests/validation_test.py new file mode 100644 index 000000000..a482a7ca8 --- /dev/null +++ b/examples/llvm_rl/tests/validation_test.py @@ -0,0 +1,38 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +from llvm_rl.model.validation import Validation +from omegaconf import OmegaConf + +import compiler_gym +from compiler_gym.datasets import Benchmark + + +def test_validation_benchmarks_uris_list(): + cfg = Validation( + **OmegaConf.create( + """\ +benchmarks: + - uris: + - benchmark://cbench-v1/qsort + - dataset: benchmark://cbench-v1 + max_benchmarks: 2 +""" + ) + ) + + with compiler_gym.make("llvm-v0") as env: + assert list(cfg.benchmarks_iterator(env)) == [ + "benchmark://cbench-v1/qsort", + "benchmark://cbench-v1/adpcm", + "benchmark://cbench-v1/bitcount", + ] + bm = list(cfg.benchmarks_iterator(env))[0] + print(type(bm).__name__) + assert isinstance(bm, Benchmark) + assert list(cfg.benchmark_uris_iterator(env)) == [ + "benchmark://cbench-v1/qsort", + "benchmark://cbench-v1/adpcm", + "benchmark://cbench-v1/bitcount", + ] diff --git a/examples/llvm_rl/autophase_wrappers_test.py b/examples/llvm_rl/tests/wrappers_test.py similarity index 96% rename from examples/llvm_rl/autophase_wrappers_test.py rename to examples/llvm_rl/tests/wrappers_test.py index 046d16888..349277b72 100644 --- a/examples/llvm_rl/autophase_wrappers_test.py +++ b/examples/llvm_rl/tests/wrappers_test.py @@ -4,11 +4,10 @@ # LICENSE file in the root directory of this source tree. import numpy as np import pytest +from llvm_rl import wrappers import compiler_gym -from . import autophase_wrappers as wrappers - @pytest.fixture(scope="function") def env(): diff --git a/examples/llvm_rl/train.py b/examples/llvm_rl/train.py new file mode 100644 index 000000000..1de85e87f --- /dev/null +++ b/examples/llvm_rl/train.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import os +import sys + +import hydra +from hydra.core.hydra_config import HydraConfig +from llvm_rl.model import Model +from omegaconf import DictConfig, OmegaConf +from omegaconf.errors import MissingMandatoryValue +from pydantic import ValidationError + +import compiler_gym + + +def _get_job_id() -> int: + try: + return HydraConfig.get().job.id + except MissingMandatoryValue: + # The numeric job ID is missing if not in a multirun context. In that + # case, there can only be a single run. + return 0 + + +@hydra.main(config_path="config", config_name="default") +def main(config: DictConfig) -> None: + OmegaConf.set_readonly(config, True) + + # Parse the config to pydantic models. + try: + model: Model = Model( + # Hydra changes the working directory. + working_directory=os.getcwd(), + job_id=_get_job_id(), + compiler_gym_version=compiler_gym.__version__, + **config + ) + except ValidationError as e: + print(e, file=sys.stderr) + sys.exit(1) + + model.train() + + +if __name__ == "__main__": + main() diff --git a/examples/llvm_rl/autophase_wrappers.py b/examples/llvm_rl/wrappers.py similarity index 82% rename from examples/llvm_rl/autophase_wrappers.py rename to examples/llvm_rl/wrappers.py index 39dd48a95..4ee1b0619 100644 --- a/examples/llvm_rl/autophase_wrappers.py +++ b/examples/llvm_rl/wrappers.py @@ -10,7 +10,36 @@ import numpy as np from compiler_gym.envs import CompilerEnv, LlvmEnv -from compiler_gym.wrappers import ConstrainedCommandline, ObservationWrapper +from compiler_gym.wrappers import ( + ConstrainedCommandline, + ObservationWrapper, + RewardWrapper, +) + + +class ClampedReward(RewardWrapper): + """A wrapper class that clamps reward signal within a bounded range, + optionally with some leaking for out-of-range values. + """ + + def __init__( + self, + env: CompilerEnv, + min: float = -1, + max: float = 1, + leakiness_factor: float = 0.001, + ): + super().__init__(env) + self.min = min + self.max = max + self.leakiness_factor = leakiness_factor + + def reward(self, reward: float) -> float: + if reward > self.max: + return self.max + (reward - self.max) * self.leakiness_factor + elif reward < self.min: + return self.min + (reward - self.min) * self.leakiness_factor + return reward class AutophaseNormalizedFeatures(ObservationWrapper): @@ -38,8 +67,10 @@ def __init__(self, env: CompilerEnv): def observation(self, observation): if observation[self.TotalInsts_index] <= 0: - return np.zeros(observation.shape) - return np.clip(observation / observation[self.TotalInsts_index], 0, 1) + return np.zeros(observation.shape, dtype=np.float32) + return np.clip( + observation.astype(np.float32) / observation[self.TotalInsts_index], 0, 1 + ) class ConcatActionsHistogram(ObservationWrapper): @@ -90,7 +121,9 @@ def __init__(self, env: CompilerEnv, norm_to_episode_len: int = 0): ) def reset(self, *args, **kwargs): - self.histogram = np.zeros((self.action_space.n,)) + self.histogram = np.zeros( + (self.action_space.n,), dtype=self.env.observation_space.dtype + ) return super().reset(*args, **kwargs) def step(self, action: Union[int, List[int]], observations=None, **kwargs): @@ -101,7 +134,9 @@ def step(self, action: Union[int, List[int]], observations=None, **kwargs): return super().step(action, **kwargs) def observation(self, observation): - return np.concatenate((observation, self.histogram)) + return np.concatenate((observation, self.histogram)).astype( + self.env.observation_space.dtype + ) class AutophaseActionSpace(ConstrainedCommandline): diff --git a/examples/requirements.txt b/examples/requirements.txt index 384bfd393..304592557 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,6 +1,10 @@ geneticalgorithm>=1.0.2 +hydra-core==1.1.0 +keras==2.6.0 nevergrad>=0.4.3 opentuner>=0.8.5 submitit>=1.2.0 submitit>=1.2.0 +tensorflow==2.6.0 torch>=1.6.0 +typer[all]>=0.3.2 diff --git a/examples/setup.py b/examples/setup.py index 304dd9f00..427485921 100644 --- a/examples/setup.py +++ b/examples/setup.py @@ -18,6 +18,8 @@ packages=[ "llvm_autotuning", "llvm_autotuning.autotuners", + "llvm_rl", + "llvm_rl.model", ], python_requires=">=3.8", platforms=[distutils.util.get_platform()], From 06ba1a78a2337f16bfb9a9de019054e7eefe0e4e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:21:03 +0000 Subject: [PATCH 209/254] [examples] Run the environemnt after install. --- examples/getting-started.ipynb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/getting-started.ipynb b/examples/getting-started.ipynb index ee1fc8d7b..ae2920f05 100644 --- a/examples/getting-started.ipynb +++ b/examples/getting-started.ipynb @@ -62,7 +62,7 @@ "source": [ "## Installation\n", "\n", - "Install the latest CompilerGym release using:" + "Install the latest CompilerGym release using pip:" ] }, { @@ -73,7 +73,20 @@ }, "outputs": [], "source": [ - "!pip install compiler_gym" + "!pip install compiler_gym\n", + "\n", + "# Ignore this code block:\n", + "#\n", + "# Explanation: to keep the size of the CompilerGym package down\n", + "# most environments split out their large data dependencies into\n", + "# separate archives which must be downloaded and cached locally\n", + "# the first time you run an environment. Here we are doing this\n", + "# for the LLVM environment so that the rest of the code cells in\n", + "# this document are nice and snappy.\n", + "import compiler_gym\n", + "with compiler_gym.make(\"llvm-autophase-ic-v0\") as env:\n", + " env.reset()\n", + "# End of ignored code block." ] }, { From 55fad1971dffa3e3c853ff925d3f0dbcb95f410e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:21:47 +0000 Subject: [PATCH 210/254] [examples] Add missing requirements. --- examples/requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/requirements.txt b/examples/requirements.txt index 304592557..ed59c2de7 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,10 +1,13 @@ geneticalgorithm>=1.0.2 hydra-core==1.1.0 keras==2.6.0 +matplotlib>=3.4.3 nevergrad>=0.4.3 opentuner>=0.8.5 +pandas>=1.3.4 submitit>=1.2.0 submitit>=1.2.0 tensorflow==2.6.0 torch>=1.6.0 typer[all]>=0.3.2 +typing-extensions~=3.7.4 # Pin version for tensorflow. From 313e69eff2129e52e22506331146467f0a55ca07 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:28:20 +0000 Subject: [PATCH 211/254] [examples] LLVM autotuning improvements. --- examples/llvm_autotuning/config/default.yaml | 11 +++++++++++ examples/llvm_autotuning/info.py | 7 +++++++ examples/llvm_autotuning/tune.py | 3 --- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/llvm_autotuning/config/default.yaml b/examples/llvm_autotuning/config/default.yaml index e596dc4db..5e8a914c9 100644 --- a/examples/llvm_autotuning/config/default.yaml +++ b/examples/llvm_autotuning/config/default.yaml @@ -26,3 +26,14 @@ hydra: dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S} subdir: ${experiment}-C${hydra.job.num} output_subdir: hydra + job_logging: + version: 1 + formatters: + simple: + format: '%(asctime)s %(name)s] %(message)s' + datefmt: '%M%d %H:%m:%S' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout diff --git a/examples/llvm_autotuning/info.py b/examples/llvm_autotuning/info.py index 7784db7a2..0e9777271 100644 --- a/examples/llvm_autotuning/info.py +++ b/examples/llvm_autotuning/info.py @@ -94,6 +94,13 @@ def info( else: df = df.groupby(["experiment", "timestamp", "config"]).mean() + # Cast float back to int. + df["num_benchmarks"] = [int(x) for x in df["num_benchmarks"]] + df["num_results"] = [int(x) for x in df["num_results"]] + + # Better column names. + df = df.rename(columns={"reward": "geomean_reward", "walltime": "walltime (s)"}) + pd.set_option("display.max_rows", None) print(df) diff --git a/examples/llvm_autotuning/tune.py b/examples/llvm_autotuning/tune.py index 2f51238e4..84a441149 100644 --- a/examples/llvm_autotuning/tune.py +++ b/examples/llvm_autotuning/tune.py @@ -2,7 +2,6 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -import logging import os import sys @@ -16,8 +15,6 @@ @hydra.main(config_path="config", config_name="default") def main(config: DictConfig) -> None: - logging.basicConfig(level=logging.DEBUG) - # Parse the config to pydantic models. OmegaConf.set_readonly(config, True) try: From b4fb15438b55941964474afaedd3df69c2573121 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:28:38 +0000 Subject: [PATCH 212/254] [examples] Better RL logging. --- examples/llvm_rl/config/default.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/examples/llvm_rl/config/default.yaml b/examples/llvm_rl/config/default.yaml index 7ceb5518a..c2e8f8e8e 100644 --- a/examples/llvm_rl/config/default.yaml +++ b/examples/llvm_rl/config/default.yaml @@ -26,3 +26,14 @@ hydra: dir: ${outputs}/${experiment}/${now:%Y-%m-%d}/${now:%H-%M-%S} subdir: ${experiment}-C${hydra.job.num} output_subdir: hydra + job_logging: + version: 1 + formatters: + simple: + format: '%(asctime)s %(name)s] %(message)s' + datefmt: '%M%d %H:%m:%S' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout From a4075145b494898c2770c795f1787b99039f4638 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:29:09 +0000 Subject: [PATCH 213/254] [util] Add a logging utility module. --- compiler_gym/envs/llvm/datasets/clgen.py | 2 +- compiler_gym/util/BUILD | 1 + compiler_gym/util/logging.py | 20 +++++++++++++++++++ .../demo_without_bazel.py | 3 ++- 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 compiler_gym/util/logging.py diff --git a/compiler_gym/envs/llvm/datasets/clgen.py b/compiler_gym/envs/llvm/datasets/clgen.py index 6283c90fe..acb4720e0 100644 --- a/compiler_gym/envs/llvm/datasets/clgen.py +++ b/compiler_gym/envs/llvm/datasets/clgen.py @@ -96,7 +96,7 @@ def install(self): # Download the libclc headers. shutil.rmtree(self.libclc_dir, ignore_errors=True) - logger.info("Downloading OpenCL headers") + logger.info("Downloading OpenCL headers ...") tar_data = io.BytesIO( download( "https://dl.fbaipublicfiles.com/compiler_gym/libclc-v0.tar.bz2", diff --git a/compiler_gym/util/BUILD b/compiler_gym/util/BUILD index cfdcdb892..6c1ecd42c 100644 --- a/compiler_gym/util/BUILD +++ b/compiler_gym/util/BUILD @@ -17,6 +17,7 @@ py_library( "executor.py", "filesystem.py", "gym_type_hints.py", + "logging.py", "logs.py", "minimize_trajectory.py", "parallelization.py", diff --git a/compiler_gym/util/logging.py b/compiler_gym/util/logging.py new file mode 100644 index 000000000..48bbf8050 --- /dev/null +++ b/compiler_gym/util/logging.py @@ -0,0 +1,20 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import logging as logging_ +import sys +from typing import Optional + + +def init_logging(level: int = logging_.INFO, logger: Optional[logging_.Logger] = None): + logger = logger or logging_.getLogger() + + logger.setLevel(level) + handler = logging_.StreamHandler(sys.stdout) + handler.setLevel(level) + formatter = logging_.Formatter( + fmt="%(asctime)s %(name)s] %(message)s", datefmt="%M%d %H:%m:%S" + ) + handler.setFormatter(formatter) + logger.addHandler(handler) diff --git a/examples/example_compiler_gym_service/demo_without_bazel.py b/examples/example_compiler_gym_service/demo_without_bazel.py index 191c26706..24f58c8da 100644 --- a/examples/example_compiler_gym_service/demo_without_bazel.py +++ b/examples/example_compiler_gym_service/demo_without_bazel.py @@ -17,6 +17,7 @@ from compiler_gym.datasets import Benchmark, Dataset from compiler_gym.spaces import Reward +from compiler_gym.util.logging import init_logging from compiler_gym.util.registration import register from compiler_gym.util.runfiles_path import site_data_path @@ -99,7 +100,7 @@ def benchmark(self, uri: str) -> Benchmark: def main(): # Use debug verbosity to print out extra logging information. - logging.basicConfig(level=logging.DEBUG) + init_logging(level=logging.DEBUG) # Create the environment using the regular gym.make(...) interface. with gym.make("example-v0") as env: From e04354584e420c5302c351cd5a4c9f620084a0f8 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 12 Nov 2021 17:29:24 +0000 Subject: [PATCH 214/254] [core] Disable OrderEnforced wrapper class. --- compiler_gym/util/registration.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/compiler_gym/util/registration.py b/compiler_gym/util/registration.py index cf04c5aab..989da51f1 100644 --- a/compiler_gym/util/registration.py +++ b/compiler_gym/util/registration.py @@ -16,6 +16,25 @@ def make(id: str, **kwargs): return gym.make(id, **kwargs) -def register(id: str, **kwargs): +def _parse_version_string(version): + """Quick and dirty .. parser. Very hacky.""" + components = version.split(".") + if len(components) != 3: + return None + try: + return tuple([int(x) for x in components]) + except (TypeError, ValueError): + return None + + +def register(id: str, order_enforce: bool = False, **kwargs): COMPILER_GYM_ENVS.append(id) + + # As of gym==0.21.0 a new OrderEforce wrapper is enabled by default. Turn + # this off as CompilerEnv already enforces this and the wrapper obscures the + # docstrings of the base class. + gym_version = _parse_version_string(gym.__version__) + if gym_version and gym_version >= (0, 21): + kwargs["order_enforce"] = order_enforce + gym_register(id=id, **kwargs) From e2f034b119207ce0b17ff5df79df478a0aef6d2c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:06:34 +0000 Subject: [PATCH 215/254] [examples] Better GCC table formatting. --- examples/gcc_autotuning/info.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/examples/gcc_autotuning/info.py b/examples/gcc_autotuning/info.py index 59787d2f4..9b56b94a4 100644 --- a/examples/gcc_autotuning/info.py +++ b/examples/gcc_autotuning/info.py @@ -10,7 +10,6 @@ import pandas as pd from llvm_autotuning.experiment import Experiment from pydantic import ValidationError -from tabulate import tabulate from typer import Typer from compiler_gym.util.statistics import geometric_mean @@ -55,13 +54,11 @@ def info( print("No results") df = pd.concat(dfs) - df = ( - df.groupby(["timestamp", "search"])[["scaled_size"]] - .agg(geometric_mean) - .reset_index() - ) - df = df.rename(columns={"scaled_size": "geomean_binsize_reduction"}) - print(tabulate(df, showindex=False, headers="keys", tablefmt="grid")) + df = df.groupby(["timestamp", "search"])[["scaled_size"]].agg(geometric_mean) + df = df.rename(columns={"scaled_size": "geomean_reward"}) + + pd.set_option("display.max_rows", None) + print(df) if __name__ == "__main__": From bca7e39043e4fb918e256fb0edcab80ed9f85922 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:06:54 +0000 Subject: [PATCH 216/254] [examples] Fix multiprocessing error during GCC init. --- examples/gcc_autotuning/tune.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/examples/gcc_autotuning/tune.py b/examples/gcc_autotuning/tune.py index 1e8b48e7a..da47cbb3c 100644 --- a/examples/gcc_autotuning/tune.py +++ b/examples/gcc_autotuning/tune.py @@ -6,6 +6,7 @@ """ import random from itertools import islice, product +from multiprocessing import Lock from pathlib import Path from typing import List, NamedTuple @@ -64,6 +65,10 @@ "objective", "obj_size", ["asm_size", "obj_size"], "Which objective to use" ) +# Lock to prevent multiple processes all calling compiler_gym.make("gcc-v0") +# simultaneously as this can cause issues with the docker API. +GCC_ENV_CONSTRUCTOR_LOCK = Lock() + def random_search(env: CompilerEnv): best = float("inf") @@ -156,15 +161,20 @@ def scaled_best(self) -> float: def run_search(search: str, benchmark: str, seed: int) -> SearchResult: """Run a search and return the search class instance.""" - random.seed(seed) - np.random.seed(seed) + with GCC_ENV_CONSTRUCTOR_LOCK: + env = compiler_gym.make("gcc-v0") + + try: + random.seed(seed) + np.random.seed(seed) - with compiler_gym.make("gcc-v0") as env: env.reset(benchmark=benchmark) env.step(env.action_space["-Os"]) baseline_size = objective(env) env.reset(benchmark=benchmark) best_size = _SEARCH_FUNCTIONS[search](env) + finally: + env.close() return SearchResult( search=search, From 3caac0eeac985859712e992198f5387e50503026 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:07:19 +0000 Subject: [PATCH 217/254] [examples] Add benchmarks for CompilerGym environment operations. --- examples/op_benchmarks.py | 512 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 examples/op_benchmarks.py diff --git a/examples/op_benchmarks.py b/examples/op_benchmarks.py new file mode 100644 index 000000000..faa53ca05 --- /dev/null +++ b/examples/op_benchmarks.py @@ -0,0 +1,512 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""This script runs microbenchmarks of CompilerGym environment operations. + +To collect new measurements, run one of the following commands: + + $ python -m op_benchmarks {run,init,reset,step,observations} --env=llvm-v0 --n=100 + +To aggregate results from prior runs: + + $ python -m op_benchmarks info +""" +import logging +import os +import re +from collections import defaultdict +from itertools import islice +from math import ceil +from multiprocessing import cpu_count +from pathlib import Path +from typing import Any, Callable, Dict, List, Optional + +import numpy as np +import pandas as pd +import typer +from tabulate import tabulate + +import compiler_gym +from compiler_gym.datasets import BenchmarkInitError +from compiler_gym.envs.compiler_env import CompilerEnv +from compiler_gym.util.executor import Executor +from compiler_gym.util.logging import init_logging +from compiler_gym.util.runfiles_path import create_user_logs_dir +from compiler_gym.util.timer import Timer + +app = typer.Typer() + +logger = logging.getLogger(__name__) + + +def get_runtimes(op: Callable[[], Any], n: int): + """Run `n` reptitions of function `op`, ignoring any errors.""" + runtimes = [] + for _ in range(n): + try: + with Timer() as timer: + op() + runtimes.append(timer.time) + except Exception as e: # pylint: disable=broad-except + logger.warning("Op failed: %s", e) + return runtimes + + +@app.command() +def init( + n: int = int(1e6), + j: int = cpu_count(), + env: str = "llvm-autophase-ic-v0", + outdir: Optional[Path] = None, +): + """Benchmark the environment startup time.""" + executor = Executor(type="local", cpus=j) + outdir = Path(outdir or create_user_logs_dir("op_benchmarks")) + with executor.get_executor(logs_dir=outdir) as session: + _init(n=n, outdir=outdir, j=j, env_name=env, session=session) + + +def _init(n: int, outdir: Path, j: int, env_name: str, session: Executor): + outdir.mkdir(exist_ok=True, parents=True) + for i in range(1, j + 1): + session.submit( + _init_worker, + env_name=env_name, + n=int(ceil(n / j)), + outfile=outdir / f".op:1:startup-shard-{i:02d}.txt", + ) + + +def _init_worker(env_name: str, n: int, outfile: Path): + with open(outfile, "w") as f: + for _ in range(0, n, min(100, n)): + runtimes = get_runtimes( + lambda: compiler_gym.make(env_name).close(), min(100, n) + ) + print("\n".join(f"{x:.8f}" for x in runtimes), file=f, flush=True) + + +def get_benchmarks(env_name: str, n: int, seed: int, outdir: Path) -> List[str]: + """Get `n` benchmarks from all datasets. + + If the dataset is smaller than `n`, benchmarks are repeated. If the dataset + is larger than `n`, `n` random unique programs are sampled. + """ + benchmarks = [] + with compiler_gym.make(env_name) as env: + datasets = sorted(list(env.datasets)) + benchmarks_per_dataset = int(ceil(n / len(datasets))) + + for ds in datasets: + logger.info( + "Enumerating %s benchmarks from dataset from %s ...", + benchmarks_per_dataset, + ds, + ) + if ds.size == 0 or ds.size > benchmarks_per_dataset: + rng = np.random.default_rng(seed) + uniq_bm_uris = set() + benchmarks_from_dataset = [] + while len(benchmarks_from_dataset) < benchmarks_per_dataset: + bm = ds.random_benchmark(rng) + if bm.uri in uniq_bm_uris: + continue + uniq_bm_uris.add(bm.uri) + # Start an environment to check that the benchmark can be + # initialized. + try: + env.reset(benchmark=bm) + except (BenchmarkInitError, ValueError, TimeoutError): + continue + benchmarks_from_dataset.append(bm.uri) + benchmarks += benchmarks_from_dataset + else: + bms = list(ds.benchmark_uris()) + bms *= int(ceil(benchmarks_per_dataset / len(bms))) + benchmarks += bms[:benchmarks_per_dataset] + + benchmarks = sorted(benchmarks) + with open(outdir / "benchmarks.txt", "w") as f: + for bm in benchmarks: + print(bm, file=f) + return benchmarks + + +def chunkify(iterable, n): + iterable = iter(iterable) + chunk = list(islice(iterable, n)) + while chunk: + yield chunk + chunk = list(islice(iterable, n)) + + +@app.command() +def reset( + n: int = int(1e6), + num_benchmarks: int = int(1e3), + env: str = "llvm-autophase-ic-v0", + j: int = cpu_count(), + seed: int = 0xCC, + outdir: Optional[Path] = None, +): + """Benchmark the env.reset() operator.""" + executor = Executor(type="local", cpus=j) + outdir = Path(outdir or create_user_logs_dir("op_benchmarks")) + benchmarks = get_benchmarks( + env_name=env, n=min(n, num_benchmarks), seed=seed, outdir=outdir + ) + with executor.get_executor(logs_dir=outdir) as session: + _reset( + benchmarks=benchmarks, + n=n, + outdir=outdir, + j=j, + env_name=env, + session=session, + ) + + +def _reset( + benchmarks: List[str], + n: int, + outdir: Path, + env_name: str, + j: int, + session: Executor, +): + outdir.mkdir(exist_ok=True, parents=True) + num_measurements_per_benchmark = int(ceil(n / len(benchmarks))) + for i, benchmarks_chunk in enumerate(chunkify(benchmarks, j), start=1): + session.submit( + _reset_worker, + num_measurements_per_benchmark=num_measurements_per_benchmark, + benchmarks=benchmarks_chunk, + env_name=env_name, + outfile=outdir / f".op:2:reset-shard-{i:02d}.txt", + ) + + +def _reset_worker( + num_measurements_per_benchmark: int, + benchmarks: List[str], + env_name: str, + outfile: Path, +): + with compiler_gym.make(env_name) as env: + with open(outfile, "w") as f: + for benchmark in benchmarks: + env.reset(benchmark=benchmark) + runtimes = get_runtimes( + lambda: env.reset(benchmark=benchmark), + num_measurements_per_benchmark, + ) + print("\n".join(f"{x:.8f} {benchmark}" for x in runtimes), file=f) + + +@app.command() +def step( + n: int = int(1e6), + num_benchmarks: int = int(1e3), + env: str = "llvm-autophase-ic-v0", + j: int = cpu_count(), + seed: int = 0xCC, + outdir: Optional[Path] = None, +): + """Benchmark the env.step() operator.""" + executor = Executor(type="local", cpus=j) + outdir = Path(outdir or create_user_logs_dir("op_benchmarks")) + benchmarks = get_benchmarks( + env_name=env, n=min(n, num_benchmarks), seed=seed, outdir=outdir + ) + with executor.get_executor(logs_dir=outdir) as session: + _step( + session=session, + outdir=outdir, + benchmarks=benchmarks, + n=n, + j=j, + env_name=env, + seed=seed, + ) + + +def _step( + n: int, + benchmarks: List[str], + env_name: str, + seed: int, + j: int, + outdir: Path, + session: Executor, +): + outdir.mkdir(exist_ok=True, parents=True) + num_measurements_per_benchmark = int(ceil(n / len(benchmarks))) + for i, benchmarks_chunk in enumerate(chunkify(benchmarks, j), start=1): + session.submit( + _step_worker, + num_measurements_per_benchmark=num_measurements_per_benchmark, + seed=seed + (i * len(benchmarks_chunk)), + benchmarks=benchmarks_chunk, + env_name=env_name, + step_outfile=outdir / f".op:3:step-shard-{i:02d}.txt", + batched_outfile=outdir / f".op:3:step-batched-shard-{i:02d}.txt", + ) + + +def _step_worker( + num_measurements_per_benchmark: int, + benchmarks: List[str], + env_name: str, + seed: str, + step_outfile: Path, + batched_outfile: Path, +): + def get_step_times(env: CompilerEnv, num_steps: int, batched=False): + while batched: + # Run all actions in a single step(). + steps = [env.action_space.sample() for _ in range(num_steps)] + with Timer() as timer: + _, _, done, _ = env.step(steps) + if not done: + return [timer.time / num_steps] * num_steps + env.reset() + + # Run each action as a step(). + runtimes = [] + while len(runtimes) < num_steps: + with Timer() as timer: + _, _, done, _ = env.step(env.action_space.sample()) + if done: + env.reset() + else: + runtimes.append(timer.time) + return runtimes + + with compiler_gym.make(env_name) as env: + with open(step_outfile, "w") as f: + for i, benchmark in enumerate(benchmarks, start=seed): + env.reset(benchmark=benchmark) + env.seed(i) + runtimes = get_step_times(env, num_measurements_per_benchmark) + print("\n".join(f"{x:.8f} {benchmark}" for x in runtimes), file=f) + + with open(batched_outfile, "w") as f: + for i, benchmark in enumerate(benchmarks, start=seed): + env.reset(benchmark=benchmark) + env.seed(i) + runtimes = get_step_times( + env, num_measurements_per_benchmark, batched=True + ) + print("\n".join(f"{x:.8f} {benchmark}" for x in runtimes), file=f) + + +@app.command() +def observations( + env: str = "llvm-autophase-ic-v0", + observation_spaces: List[str] = [ + "Ir", + "InstCount", + "Autophase", + "Inst2vec", + "Programl", + "IrInstructionCount", + "ObjectTextSizeBytes", + "Runtime", + ], + n: int = int(1e6), + num_benchmarks: int = int(1e3), + j: int = cpu_count(), + seed: int = 0xCC, + outdir: Optional[Path] = None, +) -> List[float]: + """Benchmark the environment observation spaces.""" + executor = Executor(type="local", cpus=j) + outdir = Path(outdir or create_user_logs_dir("op_benchmarks")) + benchmarks = get_benchmarks( + env_name=env, n=min(n, num_benchmarks), seed=seed, outdir=outdir + ) + with executor.get_executor(logs_dir=outdir) as session: + _observations( + session=session, + env_name=env, + benchmarks=benchmarks, + j=j, + outdir=outdir, + observation_spaces=observation_spaces, + n=n, + ) + + +def _observations( + observation_spaces: List[str], + benchmarks: List[str], + n: int, + j: int, + session: Executor, + outdir: Path, + env_name: str, +): + outdir.mkdir(exist_ok=True, parents=True) + num_measurements_per_benchmark = int(ceil(n / len(benchmarks))) + for i, benchmarks_chunk in enumerate(chunkify(benchmarks, j), start=1): + for observation_space in observation_spaces: + session.submit( + _observations_worker, + observation_space=observation_space, + num_measurements_per_benchmark=num_measurements_per_benchmark, + benchmarks=benchmarks_chunk, + env_name=env_name, + outfile=outdir / f".observation:{observation_space}-shard-{i:02d}.txt", + ) + + +def _observations_worker( + observation_space: str, + num_measurements_per_benchmark: int, + benchmarks: List[str], + env_name: str, + outfile: Path, +): + with compiler_gym.make(env_name) as env: + with open(outfile, "w") as f: + for benchmark in benchmarks: + env.reset(benchmark=benchmark) + if "llvm-" in env_name and observation_space == "Runtime": + if not env.observation.IsRunnable(): + return [] + env.runtime_observation_count = 1 + env.runtime_warmups_count = 0 + runtimes = get_runtimes( + lambda: env.observation[observation_space], + num_measurements_per_benchmark, + ) + print("\n".join(f"{x:.8f}" for x in runtimes), file=f, flush=True) + + +@app.command() +def run( + env: str = "llvm-autophase-ic-v0", + observation_spaces: List[str] = [ + "Ir", + "InstCount", + "Autophase", + "Inst2vec", + "Programl", + "IrInstructionCount", + "ObjectTextSizeBytes", + "Runtime", + ], + n: int = int(1e6), + num_benchmarks: int = int(1e3), + j: int = cpu_count(), + outdir: Optional[Path] = None, + seed: int = 0xCC, +): + """Run all of the environment benchmarks.""" + executor = Executor(type="local", cpus=j) + outdir = Path(outdir or create_user_logs_dir("op_benchmarks")) + benchmarks = get_benchmarks( + env_name=env, n=min(n, num_benchmarks), seed=seed, outdir=outdir + ) + + with executor.get_executor(logs_dir=outdir) as session: + _init(env_name=env, session=session, j=j, n=n, outdir=outdir) + _reset( + benchmarks=benchmarks, + n=n, + outdir=outdir, + j=j, + env_name=env, + session=session, + ) + _step( + n=n, + j=j, + benchmarks=benchmarks, + env_name=env, + seed=seed, + outdir=outdir, + session=session, + ) + _observations( + n=n, + j=j, + benchmarks=benchmarks, + env_name=env, + outdir=outdir, + session=session, + observation_spaces=observation_spaces, + ) + + info([outdir]) + + +def _aggregate( + root: Path, files: List[str], outfile: Path +) -> Optional[Dict[str, float]]: + if not files: + return + if not (outfile).is_file(): + runtimes = [] + for file in files: + with open(root / file) as f: + runtimes += [float(x.split()[0]) for x in f if x.strip()] + if not runtimes: + return + runtimes = np.sort(runtimes) + with open(outfile, "w") as f: + print("\n".join(map(str, sorted(runtimes))), file=f) + else: + with open(outfile) as f: + runtimes = np.array(list(map(float, f))) + return { + "n": len(runtimes), + "p50": np.median(runtimes), + "p99": np.percentile(runtimes, 99), + "mean": np.mean(runtimes), + } + + +@app.command() +def info(outdirs: List[Path] = []): + """Aggregate logs from previous runs.""" + outdirs = outdirs or ["~/logs/compiler_gym/op_benchmarks"] + rows = [] + for outdir in outdirs: + for root, _, files in os.walk(Path(outdir).expanduser()): + root = Path(root) + timestamp = "-".join([root.parent.name, root.name]) + + shards = defaultdict(list) + for file in files: + match = re.match(r"\.([:\w-]+)-shard-\d+\.txt", file) + if match: + shards[match.group(1)].append(file) + + for shard, files in shards.items(): + agg = _aggregate(root, files, root / f"{shard}.txt") + if agg: + rows.append( + { + "timestamp": timestamp, + "op": shard, + **agg, + } + ) + + df = pd.DataFrame(rows) + df.sort_values(["op", "timestamp"], inplace=True) + + # Scale to milliseconds. + df["p50"] *= 1000 + df["p99"] *= 1000 + df["mean"] *= 1000 + df = df.rename(columns={"p50": "p50 (ms)", "p99": "p99 (ms)", "mean": "mean (ms)"}) + + print(tabulate(df, headers="keys", showindex=False, tablefmt="psql")) + + +if __name__ == "__main__": + init_logging() + app() From 954bd18b35aba0dcaaab63d10cbaf4449e922297 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:07:37 +0000 Subject: [PATCH 218/254] [examples] Better loop tool formatting. --- examples/loop_tool_sweep.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/loop_tool_sweep.py b/examples/loop_tool_sweep.py index e4be863c2..bd63a40b1 100644 --- a/examples/loop_tool_sweep.py +++ b/examples/loop_tool_sweep.py @@ -38,16 +38,18 @@ def flops_after_steps(env, num_steps): def run_one_sweep( device: str, k: int, - vectorize: int = 4, + vectorize: int = 1, linear: bool = False, logdir: Optional[Path] = None, ): """Run a single sweep.""" logdir = logdir or create_user_logs_dir("loop_tool_sweep") - logfile = logdir / f"k{k}-v{vectorize}-{'linear' if linear else 'log'}-{device}.txt" + logfile = logdir / f"k{k}-v{vectorize}-{device}-{'linear' if linear else 'log'}.txt" + print("Logging results to", logfile) + print() + print("Device", "K", "Inner", "Vec.", "FLOPS", sep="\t") with open(logfile, "w") as f: print("device", "k", "inner", "vectorize", "flops", sep=",", file=f) - print("Logging results to", logfile) def log(k, inner, vectorize, flops): print(device.upper(), k, inner, vectorize, flops, sep="\t", flush=True) @@ -91,7 +93,7 @@ def log(k, inner, vectorize, flops): def sweep( device: List[str] = ["cuda"], k: List[int] = [512, 1024, 2048, 4096, 8192], - vectorize: List[int] = [4], + vectorize: List[int] = [1], linear: List[bool] = [False], logdir: Optional[Path] = None, ): From 8c0cc9abedeeb974263afa01a3574f22013bf096 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:08:49 +0000 Subject: [PATCH 219/254] [examples] LLVM RL tweaks. --- examples/llvm_rl/info.py | 51 +++++++++------------- examples/llvm_rl/model/inference_result.py | 10 +++-- examples/llvm_rl/model/model.py | 21 +++------ examples/llvm_rl/test.py | 2 +- examples/llvm_rl/train.py | 1 + 5 files changed, 35 insertions(+), 50 deletions(-) diff --git a/examples/llvm_rl/info.py b/examples/llvm_rl/info.py index 31ae32eed..220efb1ff 100644 --- a/examples/llvm_rl/info.py +++ b/examples/llvm_rl/info.py @@ -9,11 +9,12 @@ import humanize import pandas as pd -from llvm_rl.model import Model, init_logging +from llvm_rl.model import Model from pydantic import ValidationError from tabulate import tabulate from typer import Typer +from compiler_gym.util.logging import init_logging from compiler_gym.util.statistics import geometric_mean app = Typer() @@ -24,7 +25,7 @@ def models_from_paths(log_dirs: List[Path]): models: List[Model] = [] for path in log_dirs: try: - models += Model.from_logsdir(Path(path)) + models += Model.from_logsdir(Path(path).expanduser()) except ValidationError as e: print(e, file=sys.stderr) sys.exit(1) @@ -32,7 +33,7 @@ def models_from_paths(log_dirs: List[Path]): @app.command() -def train(log_dirs: List[Path]): +def train(log_dirs: List[Path] = ["~/logs/compiler_gym/llvm_rl"]): init_logging() models = models_from_paths(log_dirs) @@ -146,8 +147,6 @@ def train(log_dirs: List[Path]): "test_checkpoint", "train_geomean", "val_geomean", - # "test_ic_geomean", - # "test_os_geomean", ] ] @@ -155,7 +154,10 @@ def train(log_dirs: List[Path]): @app.command() -def test(log_dirs: List[Path]): +def test( + log_dirs: List[Path] = ["~/logs/compiler_gym/llvm_rl"], + format_for_latex: bool = False, +): models = models_from_paths(log_dirs) # Print everything. @@ -166,7 +168,7 @@ def test(log_dirs: List[Path]): dfs = {} for model in models: for trial, df in model.test_dataframes.items(): - df["dataset"] = [ + df["test_set"] = [ re.search(r"^((benchmark|generator)://)(.+)-v[012]/", d).group(3) for d in df["benchmark"] ] @@ -177,23 +179,23 @@ def test(log_dirs: List[Path]): gmean_df = ( df[ [ - "dataset", + "test_set", "instruction_count_reduction", "object_size_reduction", ] ] - .groupby(["dataset"]) + .groupby(["test_set"]) .agg(geometric_mean) ) mean_df = ( df[ [ - "dataset", + "test_set", "inference_walltime_seconds", ] ] - .groupby(["dataset"]) + .groupby(["test_set"]) .mean() ) @@ -201,31 +203,20 @@ def test(log_dirs: List[Path]): df = df.reset_index() df.insert(0, "trial", trial) - # FIXME: Format for LaTeX - # df["instruction_count_reduction"] = [f"${float(d):.3f}\\times$" for d in df["instruction_count_reduction"]] - # df["object_size_reduction"] = [f"${float(d):.3f}\\times$" for d in df["object_size_reduction"]] + if format_for_latex: + df["instruction_count_reduction"] = [ + f"${float(d):.3f}\\times$" + for d in df["instruction_count_reduction"] + ] + df["object_size_reduction"] = [ + f"${float(d):.3f}\\times$" for d in df["object_size_reduction"] + ] print() print(tabulate(df, headers="keys", showindex=False, tablefmt="psql")) dfs[trial] = df - # FIXME: Format for paper: - # - # df = pd.concat(( - # # Instcounts - # dfs["algo-a2c-R0"][["instruction_count_reduction"]], - # dfs["algo-impala-R0"][["instruction_count_reduction"]], - # dfs["algo-ppo-R0"][["instruction_count_reduction"]], - # # Objsize - # dfs["algo-a2c-R0"][["object_size_reduction"]], - # dfs["algo-impala-R0"][["object_size_reduction"]], - # dfs["algo-ppo-R0"][["object_size_reduction"]], - # ), axis=1) - # - # for _, row in df.iterrows(): - # print("&"," & ".join(row), "\\\\") - if __name__ == "__main__": app() diff --git a/examples/llvm_rl/model/inference_result.py b/examples/llvm_rl/model/inference_result.py index e5443486e..1e5bca601 100644 --- a/examples/llvm_rl/model/inference_result.py +++ b/examples/llvm_rl/model/inference_result.py @@ -42,9 +42,11 @@ class InferenceResult(BaseModel): """The final runtime, normalized to -Oz.""" @classmethod - def from_agent(cls, env: CompilerEnv, agent, runtimes_count: int = 30): - # We calculate our own reward at the end using the reward_util - # module, no need for incremental rewards during inference. + def from_agent( + cls, env: CompilerEnv, agent, runtime: bool = True, runtimes_count: int = 30 + ): + # We calculate our own reward at the end, no need for incremental + # rewards during inference. env.reward_space = None # Run inference on the environment. @@ -67,7 +69,7 @@ def from_agent(cls, env: CompilerEnv, agent, runtimes_count: int = 30): runtimes_final = [] try: - if env.unwrapped.observation["IsRunnable"]: + if runtime and env.unwrapped.observation["IsRunnable"]: env.send_param( "llvm.set_runtimes_per_observation_count", str(runtimes_count) ) diff --git a/examples/llvm_rl/model/model.py b/examples/llvm_rl/model/model.py index ba95a5e96..f311c81c1 100644 --- a/examples/llvm_rl/model/model.py +++ b/examples/llvm_rl/model/model.py @@ -4,7 +4,6 @@ # LICENSE file in the root directory of this source tree. import json import logging -import sys from datetime import datetime from pathlib import Path from typing import Any, Dict, Iterable, List, Optional @@ -17,6 +16,7 @@ from ray import tune from compiler_gym.util.executor import Executor +from compiler_gym.util.logging import init_logging from compiler_gym.util.shell_format import indent, plural from compiler_gym.util.statistics import geometric_mean @@ -355,7 +355,7 @@ def make_rllib_trainer_config(self, seed: int) -> Dict[str, Any]: # validation set. "evaluation_num_episodes": evaluation_num_episodes, # 1 checkpoint = 1 evaluation. - "evaluation_interval": self.agent.checkpoint_freq, + "evaluation_interval": 1, # Argument dictionary passed to make_env(). "env_config": {"type": "training"}, "evaluation_config": { @@ -407,7 +407,9 @@ def test_job(model: Model, checkpoint: Path, outputs_dir: Path) -> None: test_benchmarks = list(model.testing.benchmark_uris_iterator(env)) for i, benchmark in enumerate(test_benchmarks, start=1): env.reset(benchmark=benchmark) - result = InferenceResult.from_agent(env, agent) + result = InferenceResult.from_agent( + env, agent, runtime=model.environment.reward_space == "Runtime" + ) logger.info( "Test %s of %s: %s", f"{i:,d}", @@ -447,7 +449,7 @@ def train_job(model: Model, seed: int, replica_id: int) -> None: ray.init( num_cpus=model.executor.cpus, num_gpus=model.executor.gpus, - include_dashboard=True, + include_dashboard=False, ) logger.info("Registered RLlib environment %s", model.environment.rllib_id) @@ -513,14 +515,3 @@ def merge(a, b, path=None): else: a[key] = b[key] return a - - -def init_logging(): - logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler(sys.stdout) - handler.setLevel(logging.DEBUG) - formatter = logging.Formatter( - "%(asctime)s - %(name)s - %(levelname)s - %(message)s" - ) - handler.setFormatter(formatter) - logger.addHandler(handler) diff --git a/examples/llvm_rl/test.py b/examples/llvm_rl/test.py index 835e361f3..ff5b9e290 100644 --- a/examples/llvm_rl/test.py +++ b/examples/llvm_rl/test.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import List -from paper.rl.model import Model +from llvm_rl.model import Model def main(argv): diff --git a/examples/llvm_rl/train.py b/examples/llvm_rl/train.py index 1de85e87f..6797c0474 100644 --- a/examples/llvm_rl/train.py +++ b/examples/llvm_rl/train.py @@ -42,6 +42,7 @@ def main(config: DictConfig) -> None: sys.exit(1) model.train() + model.test() if __name__ == "__main__": From 67b9ec1994cd5e169ac4d6485abf78ba46cca975 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:10:00 +0000 Subject: [PATCH 220/254] [examples] Add missing requirements. --- examples/requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/requirements.txt b/examples/requirements.txt index ed59c2de7..dc6d65496 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,10 +1,14 @@ +aiohttp<3.8.0 # Pin version for ray. +aioredis<2.0.0 # Pin version for ray. geneticalgorithm>=1.0.2 hydra-core==1.1.0 keras==2.6.0 matplotlib>=3.4.3 nevergrad>=0.4.3 +numpy~=1.19.2 # Pin version for tensorflow. opentuner>=0.8.5 pandas>=1.3.4 +ray[default,rllib]==1.4.1 submitit>=1.2.0 submitit>=1.2.0 tensorflow==2.6.0 From 53e52692459da13a0d2d89cc314fd1f372b63e2e Mon Sep 17 00:00:00 2001 From: bcui19 Date: Wed, 10 Nov 2021 20:51:31 -0800 Subject: [PATCH 221/254] Adding GNN Cost Model used in CGO paper --- .../gnn_cost_model/compiler_gym_dataset.py | 132 ++++++++++++++++++ examples/gnn_cost_model/model.py | 114 +++++++++++++++ .../gnn_cost_model/test_train_cost_model.py | 27 ++++ examples/gnn_cost_model/train_cost_model.py | 132 ++++++++++++++++++ examples/gnn_cost_model/utils/db_utils.py | 26 ++++ examples/gnn_cost_model/utils/math_utils.py | 43 ++++++ .../gnn_cost_model/utils/parsing_utils.py | 94 +++++++++++++ 7 files changed, 568 insertions(+) create mode 100644 examples/gnn_cost_model/compiler_gym_dataset.py create mode 100644 examples/gnn_cost_model/model.py create mode 100644 examples/gnn_cost_model/test_train_cost_model.py create mode 100644 examples/gnn_cost_model/train_cost_model.py create mode 100644 examples/gnn_cost_model/utils/db_utils.py create mode 100644 examples/gnn_cost_model/utils/math_utils.py create mode 100644 examples/gnn_cost_model/utils/parsing_utils.py diff --git a/examples/gnn_cost_model/compiler_gym_dataset.py b/examples/gnn_cost_model/compiler_gym_dataset.py new file mode 100644 index 000000000..7717564d9 --- /dev/null +++ b/examples/gnn_cost_model/compiler_gym_dataset.py @@ -0,0 +1,132 @@ +import sqlite3 +import collections +from sqlite3 import Error +import pickle +import zlib +import time +import os +from concurrent.futures import ProcessPoolExecutor + +import dgl +import numpy as np +from dgl.data import DGLDataset +from dgl.data.utils import save_graphs +from dgl.data.utils import load_graphs +import utils.db_utils as db_utils +import utils.parsing_utils as parsing_utils +import torch +from torch.utils.data import DataLoader + + +class CompilerGymDataset(DGLDataset): + def __init__( + self, + filepath, + num_workers=64, + max_len_nodes=50000, + input_key="dgl_graph", + output_key="reward", + table_name="Observations", + train_prop=0.8, + vocab=None, + dataset_size=-1, + ): + self.filepath = filepath + self.num_workers = num_workers + self.max_len_nodes = max_len_nodes + + self.graph_key = input_key + self.output_key = output_key + self.table_name = table_name + + self.train_prop = train_prop + self.vocab = vocab + self.dataset_size = dataset_size + + self.distribution_type = "train" + + print("using filepath: ", self.filepath) + + super().__init__(name="CopmilerGym") + + def process(self): + self.initialize_database() + + def initialize_database(self): + print("using: ", self.filepath, " as dataset") + self.cursor = self.get_cursor() + + self.train_size = int(self.train_prop * self.get_full_db_length()) + self.dev_size = self.get_full_db_length() - self.train_size + + self.select_distribution_indices() + self.get_observation_indices() + + print("intialized database: ", self.filepath) + + def select_distribution_indices(self): + total_size = self.get_full_db_length() + + self.all_indices = set(range(total_size)) + self.train_indices = np.random.choice( + total_size, size=self.train_size, replace=False + ) + self.dev_indices = list(self.all_indices - set(self.train_indices)) + + assert len(self.train_indices) == self.train_size + assert len(self.dev_indices) == self.dev_size + + def get_observation_indices(self): + self.all_state_indices = db_utils.get_all_states(self.cursor, self.dataset_size) + + def get_full_db_length(self): + if self.dataset_size == -1: + return db_utils.get_database_size(self.cursor, self.table_name) + else: + return self.dataset_size + + def __getitem__(self, i): + return self.get_instance(i) + + def get_instance(self, i): + index = None + if self.distribution_type == "train": + index = self.train_indices[i] + elif self.distribution_type == "dev": + index = self.dev_indices[i] + + cursor = self.get_cursor() + + cur_state = self.all_state_indices[index] + s = db_utils.get_observation_from_table(cursor, cur_state[3]) + # TODO: make this a more general reward getting function + reward = s[0][1] + + programl = pickle.loads(zlib.decompress(s[0][3])) + + dgl_graph = parsing_utils.process_networkx_graph(programl, self.vocab) + return {"reward": reward, "dgl_graph": dgl_graph} + + def __len__(self): + if self.distribution_type == "train": + return self.train_size + elif self.distribution_type == "dev": + return self.dev_size + + def collate_fn(self, samples): + samples = [sample for sample in samples if sample is not None] + # Takes a list of graphs and makes it into one big graph that dgl operates on + ret = None + if samples: + dgl_graph = dgl.batch([sample[self.graph_key] for sample in samples]) + reward = [sample[self.output_key] for sample in samples] + ret = (dgl_graph, reward) + return ret + + def set_distribution_type(self, dist_type): + assert dist_type in ["train", "dev"] + self.distribution_type = dist_type + + def get_cursor(self): + connection = sqlite3.connect(self.filepath) + return connection.cursor() diff --git a/examples/gnn_cost_model/model.py b/examples/gnn_cost_model/model.py new file mode 100644 index 000000000..c4c895f42 --- /dev/null +++ b/examples/gnn_cost_model/model.py @@ -0,0 +1,114 @@ +import torch +import torch.nn as nn +import dgl +import utils.math_utils as math_utils + + +class GNNEncoder(nn.Module): + def __init__( + self, + node_vocab_size, + node_hidden_size, + use_node_embedding=True, + n_steps=1, + n_etypes=3, + n_message_passes=0, + reward_dim=1, + gnn_type="GatedGraphConv", + heads=None, + feat_drop=0.0, + concat_intermediate=True, + ): + super(GNNEncoder, self).__init__() + + self.use_node_embedding = use_node_embedding + self.node_hidden_size = node_hidden_size + self.n_steps = n_steps + self.n_etypes = n_etypes + self.n_message_passes = n_message_passes + self.reward_dim = reward_dim + self.gnn_type = gnn_type + self.heads = heads + self.feat_drop = feat_drop + self.concat_intermediate = concat_intermediate + + if self.use_node_embedding: + self.node_embedding = nn.Embedding(node_vocab_size, node_hidden_size) + + embed_dim = self.node_hidden_size + if self.gnn_type == "GatedGraphConv": + self.ggcnn = nn.ModuleList( + [ + dgl.nn.pytorch.conv.GatedGraphConv( + in_feats=self.node_hidden_size, + out_feats=self.node_hidden_size, + n_steps=self.n_steps, + n_etypes=self.n_etypes, + ) + for _ in range(self.n_message_passes) + ] + ) + if self.concat_intermediate: + embed_dim = (self.n_message_passes + 1) * embed_dim + else: + raise NotImplementedError("") + + self.reward_predictor = nn.Sequential( + nn.Linear(embed_dim, self.node_hidden_size), + nn.ReLU(), + nn.Linear(self.node_hidden_size, self.reward_dim), + ) + + self.mse_loss = nn.MSELoss() + + def forward(self, g): + with g.local_scope(): + self.featurize_nodes(g) + + res = g.ndata["feat"] + if self.concat_intermediate: + intermediate = [dgl.mean_nodes(g, "feat")] + if self.gnn_type == "GatedGraphConv": + for i, layer in enumerate(self.ggcnn): + res = layer(g, res, g.edata["flow"]) + if self.concat_intermediate: + g.ndata["feat"] = res + intermediate.append(dgl.mean_nodes(g, "feat")) + g.ndata["feat"] = res + + if self.concat_intermediate and self.gnn_type == "GatedGraphConv": + graph_agg = torch.cat(intermediate, axis=1) + else: + graph_agg = dgl.mean_nodes(g, "feat") + res = self.reward_predictor(graph_agg) + return res, graph_agg + + def get_loss(self, g, labels, eps=0.0): + """ + Loss function, scales the reward to the same loss function from + R2D2 (https://openreview.net/pdf?id=r1lyTjAqYX). It also allows + us to see the difference between the unscaled reward and its + associated prediction + """ + preds, _ = self.forward(g) + preds = preds.squeeze(1) + scaled_labels = math_utils.rescale(labels, eps=eps) + inv_scale_pred = math_utils.inv_rescale(preds, eps=eps) + + return ( + self.mse_loss(preds, scaled_labels), + self.mse_loss(inv_scale_pred, labels), + ((labels - inv_scale_pred).abs() / labels).mean(), + ) + + def featurize_nodes(self, g): + # This is very CompilerGym specific, can be rewritten for other tasks + features = [] + if self.use_node_embedding: + features.append(self.node_embedding(g.ndata["text_idx"])) + + g.ndata["feat"] = torch.cat(features) + + def get_edge_embedding(self, g): + # TODO: this should can be for positional embeddings + pass diff --git a/examples/gnn_cost_model/test_train_cost_model.py b/examples/gnn_cost_model/test_train_cost_model.py new file mode 100644 index 000000000..b9401be9b --- /dev/null +++ b/examples/gnn_cost_model/test_train_cost_model.py @@ -0,0 +1,27 @@ +"""Tests for //compiler_gym/bin:train.py""" + + +import sys + +sys.path.append("./examples/gnn_cost_model") + +from absl import flags +from train_cost_model import main + +from compiler_gym.util.capture_output import capture_output + +FLAGS = flags.FLAGS + + +def test_run_train_smoke_test(): + flags = [ + "argv0", + "--dataset_size=64", + "--num_epoch=2", + ] + sys.argv = flags + FLAGS(flags) + with capture_output() as out: + main(["argv0"]) + + assert "Epoch num 0 training" in out.stdout diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train_cost_model.py new file mode 100644 index 000000000..eb8d3dfca --- /dev/null +++ b/examples/gnn_cost_model/train_cost_model.py @@ -0,0 +1,132 @@ +import os +import time +import collections +import matplotlib.pyplot as plt +import numpy as np + +import dgl +import torch.nn as nn +import torch +from torch.utils.data import DataLoader +from absl import app, flags + +from model import GNNEncoder +from compiler_gym_dataset import CompilerGymDataset +import utils.parsing_utils as parsing_utils + +flags.DEFINE_list( + "flags", + ["-dataset-size", "-num_epoch", "-batch_size",], + "List of possible flags for training", +) +flags.DEFINE_integer( + "dataset_size", -1, "How large should the dataset be, -1 if no constraint" +) +flags.DEFINE_integer("num_epoch", 100, "Number of epochs for training") +flags.DEFINE_integer("batch_size", 4, "Number of epochs for training") + +FLAGS = flags.FLAGS + + +def get_dataset(file_dir, batch_size, vocab, num_workers=16, dataset_size=-1): + dataset = CompilerGymDataset(file_dir, vocab=vocab, dataset_size=dataset_size) + train_data_loader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=True, + num_workers=num_workers, + collate_fn=dataset.collate_fn, + ) + return dataset, train_data_loader + + +def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train=True): + times = collections.defaultdict(float) + losses = [] + unscaled_mse = [] + epoch_grad_clip = [] + t1 = time.time() + for iter, data in enumerate(data_loader): + if data is None: + continue + graph, labels = data + + times["get_data"] += time.time() - t1 + t1 = time.time() + + labels = torch.Tensor(labels).to(device) + graph = graph.to(device) + loss, unscaled, _ = model.get_loss(graph, labels) + losses.append(loss.cpu().data.numpy()) + unscaled_mse.append(unscaled.cpu().data.numpy()) + times["model_forward"] += time.time() - t1 + t1 = time.time() + + if train: + optimizer.zero_grad() + loss.backward() + grad_clip = torch.nn.utils.clip_grad_norm_( + model.parameters(), max_norm=400.0 + ) + epoch_grad_clip.append(grad_clip.cpu().data.numpy()) + optimizer.step() + + times["model_backward"] += time.time() - t1 + t1 = time.time() + avg_loss, avg_unscaled, avg_grad_clip = ( + np.mean(losses), + np.mean(unscaled_mse), + np.mean(epoch_grad_clip), + ) + print( + f"Epoch num {epoch_num} training {train} took: {times}, loss: {avg_loss}, unscaled: {avg_unscaled}, grad_clip {avg_grad_clip}" + ) + + return avg_loss, avg_unscaled, avg_grad_clip + + +def train(dataset, data_loader, model, num_epoch, device): + optimizer = torch.optim.Adam(model.parameters()) + for epoch in range(num_epoch): + start_time = time.time() + + dataset.set_distribution_type("train") + print("Running training with length of: ", len(dataset)) + dataset_looper(epoch, data_loader, model, device, optimizer) + dataset.set_distribution_type("dev") + print("Running dev with length of: ", len(dataset)) + dataset_looper(epoch, data_loader, model, device, train=False) + + print("took: ", time.time() - start_time, "for an epoch") + + +def main(argv): + """Main entry point.""" + del argv # unused + # root_pth = "/checkpoint/bcui/compiler_gym/replay_dataset/cbench/06-23/" + root_pth = ( + "/checkpoint/bcui/compiler_gym/replay_dataset/frozen/2021-06-15-cbench-v1.db" + ) + node_vocab_pth = "/checkpoint/bcui/compiler_gym/replay_dataset/cbench/06-23/2021-06-23-cbench-vocab.pkl" + batch_size = FLAGS.batch_size + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + vocab = parsing_utils.load_vocab(node_vocab_pth) + model = GNNEncoder(len(vocab), 64) + + # This is required to get the vocab into the right state + # as the vocab is over all nodes of the graph + vocab = {"text": vocab} + + model.to(device) + print(model) + + dataset, dataset_loader = get_dataset( + root_pth, batch_size, vocab, dataset_size=FLAGS.dataset_size + ) + + train(dataset, dataset_loader, model, FLAGS.num_epoch, device) + + +if __name__ == "__main__": + app.run(main) diff --git a/examples/gnn_cost_model/utils/db_utils.py b/examples/gnn_cost_model/utils/db_utils.py new file mode 100644 index 000000000..3bb88ce63 --- /dev/null +++ b/examples/gnn_cost_model/utils/db_utils.py @@ -0,0 +1,26 @@ +import sqlite3 +from sqlite3 import Error + + +def get_database_size(cursor, table): + return cursor.execute(f"SELECT COUNT(*) FROM {table}").fetchall()[0][0] + + +def get_all_states(cursor, db_size): + if db_size == -1: + cursor.execute("SELECT * from States") + else: + cursor.execute(f"SELECT * from States LIMIT {db_size}") + + return cursor.fetchall() + + +def get_observation_from_table(cursor, hash): + """ + Gets the observation for a state_id from a given database + Inputs: + - cursor: the db cursor + - state_id: the state_id we want (primary key in the table) + """ + cursor.execute(f"SELECT * from Observations where state_id = '{hash}'") + return cursor.fetchall() diff --git a/examples/gnn_cost_model/utils/math_utils.py b/examples/gnn_cost_model/utils/math_utils.py new file mode 100644 index 000000000..34a2a03c8 --- /dev/null +++ b/examples/gnn_cost_model/utils/math_utils.py @@ -0,0 +1,43 @@ +import numpy as np +import torch + + +def rescale(x, eps=1e-3): + sign = get_sign(x) + x_abs = get_abs(x) + if isinstance(x, np.ndarray): + return sign * (np.sqrt(x_abs + 1) - 1) + eps * x + else: + return sign * ((x_abs + 1).sqrt() - 1) + eps * x + + +def inv_rescale(x, eps=1e-3): + sign = get_sign(x) + x_abs = get_abs(x) + if eps == 0: + return sign * (x * x + 2.0 * x_abs) + else: + return sign * ( + (((1.0 + 4.0 * eps * (x_abs + 1.0 + eps)).sqrt() - 1.0) / (2.0 * eps)).pow( + 2 + ) + - 1.0 + ) + + +def get_sign(x): + if isinstance(x, np.ndarray): + return np.sign(x) + elif isinstance(x, torch.Tensor): + return x.sign() + else: + raise NotImplementedError(f"Data type: {type(x)} is not implemented") + + +def get_abs(x): + if isinstance(x, np.ndarray): + return np.abs(x) + elif isinstance(x, torch.Tensor): + return x.abs() + else: + raise NotImplementedError(f"Data type: {type(x)} is not implemented") diff --git a/examples/gnn_cost_model/utils/parsing_utils.py b/examples/gnn_cost_model/utils/parsing_utils.py new file mode 100644 index 000000000..d3eef4f46 --- /dev/null +++ b/examples/gnn_cost_model/utils/parsing_utils.py @@ -0,0 +1,94 @@ +import pickle +import torch +import dgl + + +def load_vocab(load_pth): + return pickle.load(open(load_pth, "rb")) + + +def process_networkx_graph( + graph, + vocab, + node_feature_list=["text", "type"], + edge_feature_list=["flow", "position"], +): + """ + Handles all of the requirements of taking a networkx graph and converting it into a + dgl graph + Inputs: + - graph: the networkx graph + - vocab: the vocabulary, a mapping from word to index. + - node_feature_list: a list of textual features from the networkx node that we want to make sure + are featurizable into a vector. + - edge_feature_list: a list of textual features from the networkx edges that we want to make sure + are featurizable into a vector. + """ + update_graph_with_vocab(graph.nodes, node_feature_list, vocab) + update_graph_with_vocab(graph.edges, edge_feature_list, vocab) + + dgl_graph = fast_networkx_to_dgl(graph) + return dgl_graph + + +def fast_networkx_to_dgl( + graph, node_attrs=["text_idx", "type"], edge_attrs=["flow", "position"] +): + """ + Takes a networkx graph and its given node attributes and edge attributes + and converts it corresponding dgl graph + Inputs: + - graph: the networkx graph + - node_attrs: node attributes to convert + - edge_attrs: edge attributes to convert + """ + + edges = [edge for edge in graph.edges()] + dgl_graph = dgl.graph(edges, num_nodes=graph.number_of_nodes()) + + for feat in edge_attrs: + edge_assigns = torch.tensor( + [val[-1] for val in graph.edges(data=feat)], dtype=torch.int64 + ) + dgl_graph.edata[feat] = edge_assigns + + for feat in node_attrs: + node_assigns = torch.tensor( + [val[-1] for val in graph.nodes(data=feat)], dtype=torch.int64 + ) + dgl_graph.ndata[feat] = node_assigns + + return dgl_graph + + +def update_graph_with_vocab(graph_fn, features, vocab): + """ + Given a networkx attribute (function) and features update it with a vocab if possible. + If it cannot be updated, the features should already be numerical features. + Inputs: + - graph_fn: a networkx graph function (describing nodes or edges) + - features: the feature from the function that should be updated + - vocab: A dict mapping text to int + """ + + for feature_name in features: + curr_vocab = None + if feature_name in vocab: + curr_vocab = vocab[feature_name] + for graph_item in graph_fn(data=feature_name): + feature = graph_item[-1] + idx = graph_item[0] + + if feature_name in vocab: + assert feature in curr_vocab + update_networkx_feature( + graph_fn, idx, f"{feature_name}_idx", curr_vocab[feature] + ) + else: + assert isinstance( + feature, int + ), f"{(feature_name, feature)} is not an int" + + +def update_networkx_feature(graph_fn, idx, feature_name, feature): + graph_fn[idx][feature_name] = feature From d1bc879fc3fbf338b0f98682f15cd19197359c83 Mon Sep 17 00:00:00 2001 From: bcui19 Date: Thu, 11 Nov 2021 17:38:34 -0800 Subject: [PATCH 222/254] Adding headers, cleaning up some small things --- .../gnn_cost_model/compiler_gym_dataset.py | 156 +++++++++++++++++- examples/gnn_cost_model/model.py | 52 +++++- examples/gnn_cost_model/train_cost_model.py | 25 ++- ...cost_model.py => train_cost_model_test.py} | 10 +- examples/gnn_cost_model/utils/db_utils.py | 26 --- examples/gnn_cost_model/utils/math_utils.py | 43 ----- .../gnn_cost_model/utils/parsing_utils.py | 94 ----------- 7 files changed, 224 insertions(+), 182 deletions(-) rename examples/gnn_cost_model/{test_train_cost_model.py => train_cost_model_test.py} (61%) delete mode 100644 examples/gnn_cost_model/utils/db_utils.py delete mode 100644 examples/gnn_cost_model/utils/math_utils.py delete mode 100644 examples/gnn_cost_model/utils/parsing_utils.py diff --git a/examples/gnn_cost_model/compiler_gym_dataset.py b/examples/gnn_cost_model/compiler_gym_dataset.py index 7717564d9..54d93dbc2 100644 --- a/examples/gnn_cost_model/compiler_gym_dataset.py +++ b/examples/gnn_cost_model/compiler_gym_dataset.py @@ -1,3 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + import sqlite3 import collections from sqlite3 import Error @@ -12,8 +17,6 @@ from dgl.data import DGLDataset from dgl.data.utils import save_graphs from dgl.data.utils import load_graphs -import utils.db_utils as db_utils -import utils.parsing_utils as parsing_utils import torch from torch.utils.data import DataLoader @@ -31,6 +34,23 @@ def __init__( vocab=None, dataset_size=-1, ): + """ + The class loads a CompilerGym Database which contains 'States' and 'Observations' + as tables. The tables contain the necessary information for doing supervised learning. + This class handles all of the underlying structure including differentiating between + training and dev, creating the 'dgl graph', and colating individual graphs into a larger + graph, which is used for training. + Inputs: + - filepath: the path to the dataset + - num_wokers: number of workers used to fetch the instances + - max_len_nodes: maximum number of nodes in the grpah + - input_key: the key that we save to the input observation + - output_key: the key that we want to generate supervised loss off of + - table_name: the table name in the database that has the primary keys + - train_prop: proportion of training instances + - vocab: the vocab mapping text to integer indices of a embedding table + - dataset_size: size of the dataset we want to use, default -1 means use the whole datbase + """ self.filepath = filepath self.num_workers = num_workers self.max_len_nodes = max_len_nodes @@ -50,6 +70,10 @@ def __init__( super().__init__(name="CopmilerGym") def process(self): + """ + Called during initialization of the class and initializes the underlying + functions needed for supervised learning + """ self.initialize_database() def initialize_database(self): @@ -77,11 +101,11 @@ def select_distribution_indices(self): assert len(self.dev_indices) == self.dev_size def get_observation_indices(self): - self.all_state_indices = db_utils.get_all_states(self.cursor, self.dataset_size) + self.all_state_indices = get_all_states(self.cursor, self.dataset_size) def get_full_db_length(self): if self.dataset_size == -1: - return db_utils.get_database_size(self.cursor, self.table_name) + return get_database_size(self.cursor, self.table_name) else: return self.dataset_size @@ -89,6 +113,10 @@ def __getitem__(self, i): return self.get_instance(i) def get_instance(self, i): + """ + Given an index (i), determined by the length of the current dataset ('train', 'dev') + get the desired instance + """ index = None if self.distribution_type == "train": index = self.train_indices[i] @@ -98,14 +126,15 @@ def get_instance(self, i): cursor = self.get_cursor() cur_state = self.all_state_indices[index] - s = db_utils.get_observation_from_table(cursor, cur_state[3]) - # TODO: make this a more general reward getting function + s = get_observation_from_table(cursor, cur_state[3]) + # This reward is hardcoded right now to be the number of instruction + # counts in the given LLVM-IR graph. reward = s[0][1] programl = pickle.loads(zlib.decompress(s[0][3])) - dgl_graph = parsing_utils.process_networkx_graph(programl, self.vocab) - return {"reward": reward, "dgl_graph": dgl_graph} + dgl_graph = process_networkx_graph(programl, self.vocab) + return {self.output_key: reward, self.graph_key: dgl_graph} def __len__(self): if self.distribution_type == "train": @@ -130,3 +159,114 @@ def set_distribution_type(self, dist_type): def get_cursor(self): connection = sqlite3.connect(self.filepath) return connection.cursor() + + +def get_database_size(cursor, table): + return cursor.execute(f"SELECT COUNT(*) FROM {table}").fetchall()[0][0] + + +def get_all_states(cursor, db_size): + if db_size == -1: + cursor.execute("SELECT * from States") + else: + cursor.execute(f"SELECT * from States LIMIT {db_size}") + + return cursor.fetchall() + + +def get_observation_from_table(cursor, hash): + """ + Gets the observation for a state_id from a given database + Inputs: + - cursor: the db cursor + - state_id: the state_id we want (primary key in the table) + """ + cursor.execute(f"SELECT * from Observations where state_id = '{hash}'") + return cursor.fetchall() + + +def process_networkx_graph( + graph, + vocab, + node_feature_list=["text", "type"], + edge_feature_list=["flow", "position"], +): + """ + Handles all of the requirements of taking a networkx graph and converting it into a + dgl graph + Inputs: + - graph: the networkx graph + - vocab: the vocabulary, a mapping from word to index. + - node_feature_list: a list of textual features from the networkx node that we want to make sure + are featurizable into a vector. + - edge_feature_list: a list of textual features from the networkx edges that we want to make sure + are featurizable into a vector. + """ + update_graph_with_vocab(graph.nodes, node_feature_list, vocab) + update_graph_with_vocab(graph.edges, edge_feature_list, vocab) + + dgl_graph = fast_networkx_to_dgl(graph) + return dgl_graph + + +def fast_networkx_to_dgl( + graph, node_attrs=["text_idx", "type"], edge_attrs=["flow", "position"] +): + """ + Takes a networkx graph and its given node attributes and edge attributes + and converts it corresponding dgl graph + Inputs: + - graph: the networkx graph + - node_attrs: node attributes to convert + - edge_attrs: edge attributes to convert + """ + + edges = [edge for edge in graph.edges()] + dgl_graph = dgl.graph(edges, num_nodes=graph.number_of_nodes()) + + for feat in edge_attrs: + edge_assigns = torch.tensor( + [val[-1] for val in graph.edges(data=feat)], dtype=torch.int64 + ) + dgl_graph.edata[feat] = edge_assigns + + for feat in node_attrs: + node_assigns = torch.tensor( + [val[-1] for val in graph.nodes(data=feat)], dtype=torch.int64 + ) + dgl_graph.ndata[feat] = node_assigns + + return dgl_graph + + +def update_graph_with_vocab(graph_fn, features, vocab): + """ + Given a networkx attribute (function) and features update it with a vocab if possible. + If it cannot be updated, the features should already be numerical features. + Inputs: + - graph_fn: a networkx graph function (describing nodes or edges) + - features: the feature from the function that should be updated + - vocab: A dict mapping text to int + """ + + for feature_name in features: + curr_vocab = None + if feature_name in vocab: + curr_vocab = vocab[feature_name] + for graph_item in graph_fn(data=feature_name): + feature = graph_item[-1] + idx = graph_item[0] + + if feature_name in vocab: + assert feature in curr_vocab + update_networkx_feature( + graph_fn, idx, f"{feature_name}_idx", curr_vocab[feature] + ) + else: + assert isinstance( + feature, int + ), f"{(feature_name, feature)} is not an int" + + +def update_networkx_feature(graph_fn, idx, feature_name, feature): + graph_fn[idx][feature_name] = feature diff --git a/examples/gnn_cost_model/model.py b/examples/gnn_cost_model/model.py index c4c895f42..abb246f49 100644 --- a/examples/gnn_cost_model/model.py +++ b/examples/gnn_cost_model/model.py @@ -1,7 +1,12 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + import torch +import numpy as np import torch.nn as nn import dgl -import utils.math_utils as math_utils class GNNEncoder(nn.Module): @@ -92,8 +97,8 @@ def get_loss(self, g, labels, eps=0.0): """ preds, _ = self.forward(g) preds = preds.squeeze(1) - scaled_labels = math_utils.rescale(labels, eps=eps) - inv_scale_pred = math_utils.inv_rescale(preds, eps=eps) + scaled_labels = rescale(labels, eps=eps) + inv_scale_pred = inv_rescale(preds, eps=eps) return ( self.mse_loss(preds, scaled_labels), @@ -112,3 +117,44 @@ def featurize_nodes(self, g): def get_edge_embedding(self, g): # TODO: this should can be for positional embeddings pass + + +def rescale(x, eps=1e-3): + sign = get_sign(x) + x_abs = get_abs(x) + if isinstance(x, np.ndarray): + return sign * (np.sqrt(x_abs + 1) - 1) + eps * x + else: + return sign * ((x_abs + 1).sqrt() - 1) + eps * x + + +def inv_rescale(x, eps=1e-3): + sign = get_sign(x) + x_abs = get_abs(x) + if eps == 0: + return sign * (x * x + 2.0 * x_abs) + else: + return sign * ( + (((1.0 + 4.0 * eps * (x_abs + 1.0 + eps)).sqrt() - 1.0) / (2.0 * eps)).pow( + 2 + ) + - 1.0 + ) + + +def get_sign(x): + if isinstance(x, np.ndarray): + return np.sign(x) + elif isinstance(x, torch.Tensor): + return x.sign() + else: + raise NotImplementedError(f"Data type: {type(x)} is not implemented") + + +def get_abs(x): + if isinstance(x, np.ndarray): + return np.abs(x) + elif isinstance(x, torch.Tensor): + return x.abs() + else: + raise NotImplementedError(f"Data type: {type(x)} is not implemented") diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train_cost_model.py index eb8d3dfca..f59e95454 100644 --- a/examples/gnn_cost_model/train_cost_model.py +++ b/examples/gnn_cost_model/train_cost_model.py @@ -1,3 +1,14 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +This module trains the a cost model with a GNN on a LLVM-IR +transition database predicting some output reward (the default is instruction count). +Example usage: + $ python train_cost_model.py --num_epoch 10 --batch_size 16 --dataset_size 64 +""" + import os import time import collections @@ -9,10 +20,11 @@ import torch from torch.utils.data import DataLoader from absl import app, flags +import pickle from model import GNNEncoder from compiler_gym_dataset import CompilerGymDataset -import utils.parsing_utils as parsing_utils + flags.DEFINE_list( "flags", @@ -73,11 +85,13 @@ def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train= times["model_backward"] += time.time() - t1 t1 = time.time() - avg_loss, avg_unscaled, avg_grad_clip = ( + avg_loss, avg_unscaled = ( np.mean(losses), np.mean(unscaled_mse), - np.mean(epoch_grad_clip), ) + avg_grad_clip = None + if train: + avg_grad_clip = np.mean(epoch_grad_clip) print( f"Epoch num {epoch_num} training {train} took: {times}, loss: {avg_loss}, unscaled: {avg_unscaled}, grad_clip {avg_grad_clip}" ) @@ -103,7 +117,6 @@ def train(dataset, data_loader, model, num_epoch, device): def main(argv): """Main entry point.""" del argv # unused - # root_pth = "/checkpoint/bcui/compiler_gym/replay_dataset/cbench/06-23/" root_pth = ( "/checkpoint/bcui/compiler_gym/replay_dataset/frozen/2021-06-15-cbench-v1.db" ) @@ -111,7 +124,8 @@ def main(argv): batch_size = FLAGS.batch_size device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") - vocab = parsing_utils.load_vocab(node_vocab_pth) + vocab_fp = open(node_vocab_pth, "rb") + vocab = pickle.load(vocab_fp) model = GNNEncoder(len(vocab), 64) # This is required to get the vocab into the right state @@ -126,6 +140,7 @@ def main(argv): ) train(dataset, dataset_loader, model, FLAGS.num_epoch, device) + vocab_fp.close() if __name__ == "__main__": diff --git a/examples/gnn_cost_model/test_train_cost_model.py b/examples/gnn_cost_model/train_cost_model_test.py similarity index 61% rename from examples/gnn_cost_model/test_train_cost_model.py rename to examples/gnn_cost_model/train_cost_model_test.py index b9401be9b..1933e21c2 100644 --- a/examples/gnn_cost_model/test_train_cost_model.py +++ b/examples/gnn_cost_model/train_cost_model_test.py @@ -1,9 +1,12 @@ -"""Tests for //compiler_gym/bin:train.py""" +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""Tests for examples/gnn_cost_model/train_cost_model_test.py""" -import sys -sys.path.append("./examples/gnn_cost_model") +import sys from absl import flags from train_cost_model import main @@ -17,6 +20,7 @@ def test_run_train_smoke_test(): flags = [ "argv0", "--dataset_size=64", + "--batch_size=4", "--num_epoch=2", ] sys.argv = flags diff --git a/examples/gnn_cost_model/utils/db_utils.py b/examples/gnn_cost_model/utils/db_utils.py deleted file mode 100644 index 3bb88ce63..000000000 --- a/examples/gnn_cost_model/utils/db_utils.py +++ /dev/null @@ -1,26 +0,0 @@ -import sqlite3 -from sqlite3 import Error - - -def get_database_size(cursor, table): - return cursor.execute(f"SELECT COUNT(*) FROM {table}").fetchall()[0][0] - - -def get_all_states(cursor, db_size): - if db_size == -1: - cursor.execute("SELECT * from States") - else: - cursor.execute(f"SELECT * from States LIMIT {db_size}") - - return cursor.fetchall() - - -def get_observation_from_table(cursor, hash): - """ - Gets the observation for a state_id from a given database - Inputs: - - cursor: the db cursor - - state_id: the state_id we want (primary key in the table) - """ - cursor.execute(f"SELECT * from Observations where state_id = '{hash}'") - return cursor.fetchall() diff --git a/examples/gnn_cost_model/utils/math_utils.py b/examples/gnn_cost_model/utils/math_utils.py deleted file mode 100644 index 34a2a03c8..000000000 --- a/examples/gnn_cost_model/utils/math_utils.py +++ /dev/null @@ -1,43 +0,0 @@ -import numpy as np -import torch - - -def rescale(x, eps=1e-3): - sign = get_sign(x) - x_abs = get_abs(x) - if isinstance(x, np.ndarray): - return sign * (np.sqrt(x_abs + 1) - 1) + eps * x - else: - return sign * ((x_abs + 1).sqrt() - 1) + eps * x - - -def inv_rescale(x, eps=1e-3): - sign = get_sign(x) - x_abs = get_abs(x) - if eps == 0: - return sign * (x * x + 2.0 * x_abs) - else: - return sign * ( - (((1.0 + 4.0 * eps * (x_abs + 1.0 + eps)).sqrt() - 1.0) / (2.0 * eps)).pow( - 2 - ) - - 1.0 - ) - - -def get_sign(x): - if isinstance(x, np.ndarray): - return np.sign(x) - elif isinstance(x, torch.Tensor): - return x.sign() - else: - raise NotImplementedError(f"Data type: {type(x)} is not implemented") - - -def get_abs(x): - if isinstance(x, np.ndarray): - return np.abs(x) - elif isinstance(x, torch.Tensor): - return x.abs() - else: - raise NotImplementedError(f"Data type: {type(x)} is not implemented") diff --git a/examples/gnn_cost_model/utils/parsing_utils.py b/examples/gnn_cost_model/utils/parsing_utils.py deleted file mode 100644 index d3eef4f46..000000000 --- a/examples/gnn_cost_model/utils/parsing_utils.py +++ /dev/null @@ -1,94 +0,0 @@ -import pickle -import torch -import dgl - - -def load_vocab(load_pth): - return pickle.load(open(load_pth, "rb")) - - -def process_networkx_graph( - graph, - vocab, - node_feature_list=["text", "type"], - edge_feature_list=["flow", "position"], -): - """ - Handles all of the requirements of taking a networkx graph and converting it into a - dgl graph - Inputs: - - graph: the networkx graph - - vocab: the vocabulary, a mapping from word to index. - - node_feature_list: a list of textual features from the networkx node that we want to make sure - are featurizable into a vector. - - edge_feature_list: a list of textual features from the networkx edges that we want to make sure - are featurizable into a vector. - """ - update_graph_with_vocab(graph.nodes, node_feature_list, vocab) - update_graph_with_vocab(graph.edges, edge_feature_list, vocab) - - dgl_graph = fast_networkx_to_dgl(graph) - return dgl_graph - - -def fast_networkx_to_dgl( - graph, node_attrs=["text_idx", "type"], edge_attrs=["flow", "position"] -): - """ - Takes a networkx graph and its given node attributes and edge attributes - and converts it corresponding dgl graph - Inputs: - - graph: the networkx graph - - node_attrs: node attributes to convert - - edge_attrs: edge attributes to convert - """ - - edges = [edge for edge in graph.edges()] - dgl_graph = dgl.graph(edges, num_nodes=graph.number_of_nodes()) - - for feat in edge_attrs: - edge_assigns = torch.tensor( - [val[-1] for val in graph.edges(data=feat)], dtype=torch.int64 - ) - dgl_graph.edata[feat] = edge_assigns - - for feat in node_attrs: - node_assigns = torch.tensor( - [val[-1] for val in graph.nodes(data=feat)], dtype=torch.int64 - ) - dgl_graph.ndata[feat] = node_assigns - - return dgl_graph - - -def update_graph_with_vocab(graph_fn, features, vocab): - """ - Given a networkx attribute (function) and features update it with a vocab if possible. - If it cannot be updated, the features should already be numerical features. - Inputs: - - graph_fn: a networkx graph function (describing nodes or edges) - - features: the feature from the function that should be updated - - vocab: A dict mapping text to int - """ - - for feature_name in features: - curr_vocab = None - if feature_name in vocab: - curr_vocab = vocab[feature_name] - for graph_item in graph_fn(data=feature_name): - feature = graph_item[-1] - idx = graph_item[0] - - if feature_name in vocab: - assert feature in curr_vocab - update_networkx_feature( - graph_fn, idx, f"{feature_name}_idx", curr_vocab[feature] - ) - else: - assert isinstance( - feature, int - ), f"{(feature_name, feature)} is not an int" - - -def update_networkx_feature(graph_fn, idx, feature_name, feature): - graph_fn[idx][feature_name] = feature From b901cccf00efb793abe74113cdb7cad303e6f0f2 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 16:20:40 +0000 Subject: [PATCH 223/254] [examples] Auto-format code. --- examples/gnn_cost_model/train_cost_model.py | 28 +++++++++---------- .../gnn_cost_model/train_cost_model_test.py | 3 -- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train_cost_model.py index f59e95454..8d1ec8ca2 100644 --- a/examples/gnn_cost_model/train_cost_model.py +++ b/examples/gnn_cost_model/train_cost_model.py @@ -3,32 +3,32 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """ -This module trains the a cost model with a GNN on a LLVM-IR -transition database predicting some output reward (the default is instruction count). +This module trains a cost model with a GNN on a LLVM-IR transition database +predicting some output reward (the default is instruction count). + Example usage: + $ python train_cost_model.py --num_epoch 10 --batch_size 16 --dataset_size 64 """ -import os -import time import collections -import matplotlib.pyplot as plt -import numpy as np +import pickle +import time -import dgl -import torch.nn as nn +import numpy as np import torch -from torch.utils.data import DataLoader from absl import app, flags -import pickle - -from model import GNNEncoder from compiler_gym_dataset import CompilerGymDataset - +from model import GNNEncoder +from torch.utils.data import DataLoader flags.DEFINE_list( "flags", - ["-dataset-size", "-num_epoch", "-batch_size",], + [ + "-dataset-size", + "-num_epoch", + "-batch_size", + ], "List of possible flags for training", ) flags.DEFINE_integer( diff --git a/examples/gnn_cost_model/train_cost_model_test.py b/examples/gnn_cost_model/train_cost_model_test.py index 1933e21c2..ff2d0c1d4 100644 --- a/examples/gnn_cost_model/train_cost_model_test.py +++ b/examples/gnn_cost_model/train_cost_model_test.py @@ -2,10 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. - """Tests for examples/gnn_cost_model/train_cost_model_test.py""" - - import sys from absl import flags From 5c3d7fed9a074f982fb9645819aba3d0c9c4b944 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 17:46:10 +0000 Subject: [PATCH 224/254] [examples] Remove unused variable. --- examples/gnn_cost_model/train_cost_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train_cost_model.py index 8d1ec8ca2..61be5b12f 100644 --- a/examples/gnn_cost_model/train_cost_model.py +++ b/examples/gnn_cost_model/train_cost_model.py @@ -58,7 +58,7 @@ def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train= unscaled_mse = [] epoch_grad_clip = [] t1 = time.time() - for iter, data in enumerate(data_loader): + for data in data_loader: if data is None: continue graph, labels = data From 66658d8a9fc775f942d3c52cc1e2dd666bfaa33f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 17:46:23 +0000 Subject: [PATCH 225/254] [examples] Add missing dependency. --- examples/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/requirements.txt b/examples/requirements.txt index dc6d65496..c0e7ad584 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,5 +1,6 @@ aiohttp<3.8.0 # Pin version for ray. aioredis<2.0.0 # Pin version for ray. +dgl==0.6.1 geneticalgorithm>=1.0.2 hydra-core==1.1.0 keras==2.6.0 From fde21f707618a5100bdd63897a8a4df4698ced63 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 17:46:59 +0000 Subject: [PATCH 226/254] [examples] GNN tweaks. --- .../gnn_cost_model/compiler_gym_dataset.py | 19 +-- examples/gnn_cost_model/model.py | 5 +- examples/gnn_cost_model/train_cost_model.py | 124 +++++++++++++----- 3 files changed, 99 insertions(+), 49 deletions(-) diff --git a/examples/gnn_cost_model/compiler_gym_dataset.py b/examples/gnn_cost_model/compiler_gym_dataset.py index 54d93dbc2..0f3b1f3f2 100644 --- a/examples/gnn_cost_model/compiler_gym_dataset.py +++ b/examples/gnn_cost_model/compiler_gym_dataset.py @@ -2,23 +2,14 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. - -import sqlite3 -import collections -from sqlite3 import Error import pickle +import sqlite3 import zlib -import time -import os -from concurrent.futures import ProcessPoolExecutor import dgl import numpy as np -from dgl.data import DGLDataset -from dgl.data.utils import save_graphs -from dgl.data.utils import load_graphs import torch -from torch.utils.data import DataLoader +from dgl.data import DGLDataset class CompilerGymDataset(DGLDataset): @@ -258,9 +249,11 @@ def update_graph_with_vocab(graph_fn, features, vocab): idx = graph_item[0] if feature_name in vocab: - assert feature in curr_vocab + # Lookup vocab item, or map to out-of-vocab index if item is not + # found. + vocab_index = curr_vocab.get(feature, len(curr_vocab)) update_networkx_feature( - graph_fn, idx, f"{feature_name}_idx", curr_vocab[feature] + graph_fn, idx, f"{feature_name}_idx", vocab_index ) else: assert isinstance( diff --git a/examples/gnn_cost_model/model.py b/examples/gnn_cost_model/model.py index abb246f49..ec84345ef 100644 --- a/examples/gnn_cost_model/model.py +++ b/examples/gnn_cost_model/model.py @@ -2,11 +2,10 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. - -import torch +import dgl import numpy as np +import torch import torch.nn as nn -import dgl class GNNEncoder(nn.Module): diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train_cost_model.py index 61be5b12f..d201fd623 100644 --- a/examples/gnn_cost_model/train_cost_model.py +++ b/examples/gnn_cost_model/train_cost_model.py @@ -10,32 +10,61 @@ $ python train_cost_model.py --num_epoch 10 --batch_size 16 --dataset_size 64 """ - import collections +import io +import logging import pickle +import sys +import tarfile import time +from pathlib import Path +from threading import Lock import numpy as np import torch from absl import app, flags -from compiler_gym_dataset import CompilerGymDataset -from model import GNNEncoder +from fasteners import InterProcessLock from torch.utils.data import DataLoader -flags.DEFINE_list( - "flags", - [ - "-dataset-size", - "-num_epoch", - "-batch_size", - ], - "List of possible flags for training", -) +from compiler_gym.util.download import download +from compiler_gym.util.runfiles_path import cache_path, transient_cache_path +from compiler_gym.util.timer import Timer, humanize_duration + +from .compiler_gym_dataset import CompilerGymDataset +from .model import GNNEncoder + +logger = logging.getLogger(__name__) + +_DB_DOWNLOAD_LOCK = Lock() + flags.DEFINE_integer( "dataset_size", -1, "How large should the dataset be, -1 if no constraint" ) flags.DEFINE_integer("num_epoch", 100, "Number of epochs for training") flags.DEFINE_integer("batch_size", 4, "Number of epochs for training") +flags.DEFINE_string( + "db", + "https://dl.fbaipublicfiles.com/compiler_gym/state_transition_dataset/2021-11-15-csmith.tar.bz2", + "URL of the dataset to use.", +) +flags.DEFINE_string( + "db_sha256", + "0b101a17fdbb1851f38ca46cc089b0026eb740e4055a4fe06b4c899ca87256a2", + "SHA256 checksum of the dataset database.", +) +flags.DEFINE_string( + "vocab_db", + "https://dl.fbaipublicfiles.com/compiler_gym/state_transition_dataset/2021-11-15-vocab.tar.bz2", + "URL of the vocabulary database to use.", +) +flags.DEFINE_string( + "vocab_db_sha256", + "af7781f57e6ef430c561afb045fc03693783e668b21826b32234e9c45bd1882c", + "SHA256 checksum of the vocabulary database.", +) +flags.DEFINE_string( + "device", "cuda:0" if torch.cuda.is_available() else "cpu", "The device to run on." +) FLAGS = flags.FLAGS @@ -92,8 +121,11 @@ def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train= avg_grad_clip = None if train: avg_grad_clip = np.mean(epoch_grad_clip) + times = ", ".join(f"{k}: {humanize_duration(v)}" for k, v in times.items()) print( - f"Epoch num {epoch_num} training {train} took: {times}, loss: {avg_loss}, unscaled: {avg_unscaled}, grad_clip {avg_grad_clip}" + f" Epoch {epoch_num + 1} {'training' if train else 'validation'} took: " + f"{{ {times} }}, loss: {avg_loss}, unscaled: {avg_unscaled}, " + f"grad_clip {avg_grad_clip}" ) return avg_loss, avg_unscaled, avg_grad_clip @@ -102,45 +134,71 @@ def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train= def train(dataset, data_loader, model, num_epoch, device): optimizer = torch.optim.Adam(model.parameters()) for epoch in range(num_epoch): - start_time = time.time() + with Timer(f"Epoch {epoch + 1} of {num_epoch} ({(epoch + 1) / num_epoch:.1%})"): + dataset.set_distribution_type("train") + dataset_looper(epoch, data_loader, model, device, optimizer) + dataset.set_distribution_type("dev") + dataset_looper(epoch, data_loader, model, device, train=False) + + +def download_and_unpack_database(db: str, sha256: str) -> Path: + """Download the given database, unpack it to the local filesystem, and + return the path. + """ + local_dir = cache_path(f"state_transition_dataset/{sha256}") + with _DB_DOWNLOAD_LOCK, InterProcessLock( + transient_cache_path(".state_transition_database_download.LOCK") + ): + if not (local_dir / ".installed").is_file(): + tar_data = io.BytesIO(download(db, sha256)) + + local_dir.mkdir(parents=True) + logger.info("Unpacking database to %s ...", local_dir) + with tarfile.open(fileobj=tar_data, mode="r:bz2") as arc: + arc.extractall(str(local_dir)) - dataset.set_distribution_type("train") - print("Running training with length of: ", len(dataset)) - dataset_looper(epoch, data_loader, model, device, optimizer) - dataset.set_distribution_type("dev") - print("Running dev with length of: ", len(dataset)) - dataset_looper(epoch, data_loader, model, device, train=False) + (local_dir / ".installed").touch() - print("took: ", time.time() - start_time, "for an epoch") + unpacked = [f for f in local_dir.iterdir() if f.name != ".installed"] + if len(unpacked) != 1: + print( + f"fatal: Archive {db} expected to contain one file, contains: {len(unpacked)}", + file=sys.stderr, + ) + + return unpacked[0] def main(argv): """Main entry point.""" del argv # unused - root_pth = ( - "/checkpoint/bcui/compiler_gym/replay_dataset/frozen/2021-06-15-cbench-v1.db" + + node_vocab_pth = download_and_unpack_database( + db=FLAGS.vocab_db, sha256=FLAGS.vocab_db_sha256 ) - node_vocab_pth = "/checkpoint/bcui/compiler_gym/replay_dataset/cbench/06-23/2021-06-23-cbench-vocab.pkl" - batch_size = FLAGS.batch_size - device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + root_pth = download_and_unpack_database(db=FLAGS.db, sha256=FLAGS.db_sha256) - vocab_fp = open(node_vocab_pth, "rb") - vocab = pickle.load(vocab_fp) - model = GNNEncoder(len(vocab), 64) + with open(node_vocab_pth, "rb") as f: + vocab = pickle.load(f) + + model = GNNEncoder( + # Add one to the vocab size to accomodate for the out-of-vocab element. + node_vocab_size=len(vocab) + 1, + node_hidden_size=64, + ) # This is required to get the vocab into the right state # as the vocab is over all nodes of the graph vocab = {"text": vocab} - model.to(device) + model.to(FLAGS.device) print(model) dataset, dataset_loader = get_dataset( - root_pth, batch_size, vocab, dataset_size=FLAGS.dataset_size + root_pth, FLAGS.batch_size, vocab, dataset_size=FLAGS.dataset_size ) - train(dataset, dataset_loader, model, FLAGS.num_epoch, device) - vocab_fp.close() + train(dataset, dataset_loader, model, FLAGS.num_epoch, FLAGS.device) if __name__ == "__main__": From aedc5d6fdcc6e646910ad7b7be6b9a9bfdc4892d Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 18:00:34 +0000 Subject: [PATCH 227/254] [examples] Renamed training script for consistency with other examples. --- examples/gnn_cost_model/__init__.py | 0 examples/gnn_cost_model/{train_cost_model.py => train.py} | 0 .../gnn_cost_model/{train_cost_model_test.py => train_test.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/gnn_cost_model/__init__.py rename examples/gnn_cost_model/{train_cost_model.py => train.py} (100%) rename examples/gnn_cost_model/{train_cost_model_test.py => train_test.py} (100%) diff --git a/examples/gnn_cost_model/__init__.py b/examples/gnn_cost_model/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/gnn_cost_model/train_cost_model.py b/examples/gnn_cost_model/train.py similarity index 100% rename from examples/gnn_cost_model/train_cost_model.py rename to examples/gnn_cost_model/train.py diff --git a/examples/gnn_cost_model/train_cost_model_test.py b/examples/gnn_cost_model/train_test.py similarity index 100% rename from examples/gnn_cost_model/train_cost_model_test.py rename to examples/gnn_cost_model/train_test.py From 89fb0f4a6d417545a7e54bb1e6653f0f584acc57 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 11:09:27 +0000 Subject: [PATCH 228/254] [README] Use full URL to image. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3ec14760..21bf0c3c2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![CompilerGym](docs/source/_static/img/logo-padded.png) +![CompilerGym](https://github.com/facebookresearch/CompilerGym/raw/development/docs/source/_static/img/logo-padded.png)

    From a63b2a81bf2ff0e64e45589e0ec56a1d6fed18c8 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 11:11:33 +0000 Subject: [PATCH 229/254] Prevent name conflict on case-insensitive file systems. --- examples/{BUILD => BUILD.bazel} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{BUILD => BUILD.bazel} (100%) diff --git a/examples/BUILD b/examples/BUILD.bazel similarity index 100% rename from examples/BUILD rename to examples/BUILD.bazel From 532b43925037d68dfa4559195f2dd49d6ef1113e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 11:12:50 +0000 Subject: [PATCH 230/254] [docs] Fix link. --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c398ed45..c0cc4519c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,8 +61,8 @@ and file a [Pull Request](#pull-requests). Please include: 2. A CSV file of your results. The [compiler_gym.leaderboard](https://facebookresearch.github.io/CompilerGym/compiler_gym/leaderboard.html) package provides utilities to help generate results using your agent. -3. A write-up of your approach. You may use the [submission - template]([/leaderboard/SUBMISSION_TEMPLATE.md](https://raw.githubusercontent.com/facebookresearch/CompilerGym/development/leaderboard/SUBMISSION_TEMPLATE.md)) +3. A write-up of your approach. You may use the submission template + ([leaderboard/SUBMISSION_TEMPLATE.md](https://raw.githubusercontent.com/facebookresearch/CompilerGym/development/leaderboard/SUBMISSION_TEMPLATE.md)) as a guide. Please make sure to update to the latest CompilerGym release prior to From b18476626e748cc47f32f79193cb4b6f15a85c6a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 13:09:08 +0000 Subject: [PATCH 231/254] [examples] Tweak GNN training. --- examples/gnn_cost_model/train.py | 2 +- examples/gnn_cost_model/train_test.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/gnn_cost_model/train.py b/examples/gnn_cost_model/train.py index d201fd623..6c1327d05 100644 --- a/examples/gnn_cost_model/train.py +++ b/examples/gnn_cost_model/train.py @@ -152,7 +152,7 @@ def download_and_unpack_database(db: str, sha256: str) -> Path: if not (local_dir / ".installed").is_file(): tar_data = io.BytesIO(download(db, sha256)) - local_dir.mkdir(parents=True) + local_dir.mkdir(parents=True, exist_ok=True) logger.info("Unpacking database to %s ...", local_dir) with tarfile.open(fileobj=tar_data, mode="r:bz2") as arc: arc.extractall(str(local_dir)) diff --git a/examples/gnn_cost_model/train_test.py b/examples/gnn_cost_model/train_test.py index ff2d0c1d4..95c8d9231 100644 --- a/examples/gnn_cost_model/train_test.py +++ b/examples/gnn_cost_model/train_test.py @@ -5,20 +5,24 @@ """Tests for examples/gnn_cost_model/train_cost_model_test.py""" import sys +import pytest from absl import flags -from train_cost_model import main from compiler_gym.util.capture_output import capture_output +from .train import main + FLAGS = flags.FLAGS +@pytest.mark.skip(reason="Need to create a small test set") def test_run_train_smoke_test(): flags = [ "argv0", "--dataset_size=64", "--batch_size=4", "--num_epoch=2", + "--device=cpu", ] sys.argv = flags FLAGS(flags) From c47b1d45db67ee422edd12288eddc4a7942a0d4c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 14:44:45 +0000 Subject: [PATCH 232/254] [examples] Relax matplotlib requirement for Py3.6. --- examples/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/requirements.txt b/examples/requirements.txt index c0e7ad584..4549db8d2 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -4,7 +4,7 @@ dgl==0.6.1 geneticalgorithm>=1.0.2 hydra-core==1.1.0 keras==2.6.0 -matplotlib>=3.4.3 +matplotlib>=3.3.0 nevergrad>=0.4.3 numpy~=1.19.2 # Pin version for tensorflow. opentuner>=0.8.5 From 503d8dcee48ea3e8d7f066e1a8789b2a2329da7f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 14:59:19 +0000 Subject: [PATCH 233/254] Relax panda version requirement on py3.6. --- examples/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/requirements.txt b/examples/requirements.txt index 4549db8d2..aa2f450b0 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -8,7 +8,7 @@ matplotlib>=3.3.0 nevergrad>=0.4.3 numpy~=1.19.2 # Pin version for tensorflow. opentuner>=0.8.5 -pandas>=1.3.4 +pandas>=1.1.5 ray[default,rllib]==1.4.1 submitit>=1.2.0 submitit>=1.2.0 From d32a038e0cfdbb42204b8732c421752ccc314272 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 15:04:34 +0000 Subject: [PATCH 234/254] Fix typo in comment. --- compiler_gym/util/registration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/util/registration.py b/compiler_gym/util/registration.py index 989da51f1..b859bd424 100644 --- a/compiler_gym/util/registration.py +++ b/compiler_gym/util/registration.py @@ -30,7 +30,7 @@ def _parse_version_string(version): def register(id: str, order_enforce: bool = False, **kwargs): COMPILER_GYM_ENVS.append(id) - # As of gym==0.21.0 a new OrderEforce wrapper is enabled by default. Turn + # As of gym==0.21.0 a new OrderEnforcing wrapper is enabled by default. Turn # this off as CompilerEnv already enforces this and the wrapper obscures the # docstrings of the base class. gym_version = _parse_version_string(gym.__version__) From 8684962becc5578511bb6cc7bca9ac6d7d1cfca0 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 15:18:22 +0000 Subject: [PATCH 235/254] Small readability improvements. --- examples/gcc_autotuning/tune.py | 5 +- examples/gnn_cost_model/train.py | 27 +- examples/llvm_autotuning/config/default.yaml | 2 +- examples/llvm_rl/README.md | 10 +- examples/llvm_rl/config/default.yaml | 2 +- examples/llvm_rl/eval.ipynb | 297 ------------------- 6 files changed, 22 insertions(+), 321 deletions(-) delete mode 100644 examples/llvm_rl/eval.ipynb diff --git a/examples/gcc_autotuning/tune.py b/examples/gcc_autotuning/tune.py index da47cbb3c..3adaf828d 100644 --- a/examples/gcc_autotuning/tune.py +++ b/examples/gcc_autotuning/tune.py @@ -2,8 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -"""Autotuning script for GCC command line options. -""" +"""Autotuning script for GCC command line options.""" import random from itertools import islice, product from multiprocessing import Lock @@ -132,7 +131,7 @@ def f(choices): def objective(env) -> int: """Get the objective from an environment""" # Retry loop to defend against flaky environment. - for _ in range(3): + for _ in range(5): try: return env.observation[FLAGS.objective] except ServiceError as e: diff --git a/examples/gnn_cost_model/train.py b/examples/gnn_cost_model/train.py index 6c1327d05..5d7d2e0b0 100644 --- a/examples/gnn_cost_model/train.py +++ b/examples/gnn_cost_model/train.py @@ -26,6 +26,7 @@ from fasteners import InterProcessLock from torch.utils.data import DataLoader +import compiler_gym.util.flags.nproc # noqa flag definition from compiler_gym.util.download import download from compiler_gym.util.runfiles_path import cache_path, transient_cache_path from compiler_gym.util.timer import Timer, humanize_duration @@ -33,10 +34,6 @@ from .compiler_gym_dataset import CompilerGymDataset from .model import GNNEncoder -logger = logging.getLogger(__name__) - -_DB_DOWNLOAD_LOCK = Lock() - flags.DEFINE_integer( "dataset_size", -1, "How large should the dataset be, -1 if no constraint" ) @@ -69,16 +66,9 @@ FLAGS = flags.FLAGS -def get_dataset(file_dir, batch_size, vocab, num_workers=16, dataset_size=-1): - dataset = CompilerGymDataset(file_dir, vocab=vocab, dataset_size=dataset_size) - train_data_loader = DataLoader( - dataset, - batch_size=batch_size, - shuffle=True, - num_workers=num_workers, - collate_fn=dataset.collate_fn, - ) - return dataset, train_data_loader +logger = logging.getLogger(__name__) + +_DB_DOWNLOAD_LOCK = Lock() def dataset_looper(epoch_num, data_loader, model, device, optimizer=None, train=True): @@ -194,8 +184,13 @@ def main(argv): model.to(FLAGS.device) print(model) - dataset, dataset_loader = get_dataset( - root_pth, FLAGS.batch_size, vocab, dataset_size=FLAGS.dataset_size + dataset = CompilerGymDataset(root_pth, vocab=vocab, dataset_size=FLAGS.dataset_size) + dataset_loader = DataLoader( + dataset, + batch_size=FLAGS.batch_size, + shuffle=True, + num_workers=FLAGS.nproc, + collate_fn=dataset.collate_fn, ) train(dataset, dataset_loader, model, FLAGS.num_epoch, FLAGS.device) diff --git a/examples/llvm_autotuning/config/default.yaml b/examples/llvm_autotuning/config/default.yaml index 5e8a914c9..94f6df117 100644 --- a/examples/llvm_autotuning/config/default.yaml +++ b/examples/llvm_autotuning/config/default.yaml @@ -3,7 +3,7 @@ defaults: - autotuner: random - benchmarks: cbench executor: - # One of: {local, slurm, debug noop, }. + # One of: {local, slurm, debug, noop}. type: local # Specifies the number of parallel worker processes. If -1, defaults to the # number of cores on the machine. diff --git a/examples/llvm_rl/README.md b/examples/llvm_rl/README.md index ff2c659ab..eba5fe20c 100644 --- a/examples/llvm_rl/README.md +++ b/examples/llvm_rl/README.md @@ -169,7 +169,8 @@ python -m llvm_rl.train -m \ experiment=algo \ agent=a2c,apex,impala,ppo \ num_replicas=10 \ - training=csmith + training=csmith \ + testing=all ``` ### Section VII.H: Effect of training set @@ -179,7 +180,8 @@ python -m llvm_rl.train -m \ experiment=training_set \ agent=ppo \ num_replicas=10 \ - training=csmith,github,tensorflow + training=csmith,github,tensorflow \ + testing=csmith,github,tensorflow ``` @@ -190,5 +192,7 @@ python -m llvm_rl.train -m \ experiment=observation_space \ agent=ppo \ num_replicas=10 \ - environment=autophase,autophase-with-history,instcount,instcount-with-history + environment=autophase,autophase-with-history,instcount,instcount-with-history \ + training=csmith \ + testing=cbench ``` diff --git a/examples/llvm_rl/config/default.yaml b/examples/llvm_rl/config/default.yaml index c2e8f8e8e..4a8add50f 100644 --- a/examples/llvm_rl/config/default.yaml +++ b/examples/llvm_rl/config/default.yaml @@ -5,7 +5,7 @@ defaults: - training: csmith - testing: cbench executor: - # One of: {local, slurm, debug noop, }. + # One of: {local, slurm, debug, noop}. type: local # Specifies the number of parallel worker processes. If -1, defaults to the # number of cores on the machine. diff --git a/examples/llvm_rl/eval.ipynb b/examples/llvm_rl/eval.ipynb deleted file mode 100644 index 9cb4e6f8c..000000000 --- a/examples/llvm_rl/eval.ipynb +++ /dev/null @@ -1,297 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "839ae0e6-7920-4f33-920e-0c4f508c4b0d", - "metadata": {}, - "outputs": [], - "source": [ - "from paper.rl.model import Model\n", - "from typing import List\n", - "from matplotlib import pyplot as plt\n", - "from matplotlib import ticker as mtick\n", - "from pathlib import Path\n", - "import scipy\n", - "\n", - "def models_from_paths(log_dirs: List[Path]):\n", - " # Read all the inputs first.\n", - " models: List[Model] = []\n", - " for path in log_dirs:\n", - " models += Model.from_logsdir(Path(path))\n", - " return models" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "836de56d-ffb6-4c7c-9f92-442c5c98209d", - "metadata": {}, - "outputs": [], - "source": [ - "LOGSDIR = Path(\"/home/cec/logs/rl/algo\")\n", - "\n", - "models = models_from_paths([LOGSDIR])\n", - "\n", - "for model in models:\n", - " df = model.dataframe\n", - " if not len(df):\n", - " continue\n", - " for trial_name in set(df.trial_name.values):\n", - " sdf = df[df[\"trial_name\"] == trial_name]\n", - " \n", - " trial_name = {\n", - " \"tss-C0-R0\": \"1e+05\",\n", - " \"tss-C1-R0\": \"1e+04\",\n", - " \"tss-C2-R0\": \"1e+03\",\n", - " \"tss-C3-R0\": \"1e+02\",\n", - " \"algo-impala-R0\": \"IMPALA\",\n", - " \"algo-ppo-R0\": \"PPO\",\n", - " \"algo-a2c-R0\": \"A2C\",\n", - " }.get(trial_name, trial_name)\n", - " \n", - "# Y = sdf[\"episode_reward_mean\"]\n", - "# Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", - "# plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\")\n", - " \n", - " Y = sdf[\"evaluation/episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\")\n", - " \n", - "plt.xlabel(\"#. training episodes\")\n", - "plt.ylabel(\"Mean codesize reduction\")\n", - "plt.gca().legend(loc=\"lower right\")\n", - "\n", - "# Log:\n", - "# plt.gca().set_xscale('log')\n", - "plt.xlim((1000, 100000))\n", - "plt.ylim((None, 1.3))\n", - "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", - "\n", - "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", - "plt.gcf().set_size_inches(5, 3)\n", - "\n", - "plt.savefig('/home/cec/Dropbox/Inbox/rl-algo.pdf', dpi=300, bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f175bd9f-3b39-4c35-abc8-e0320ce39bf5", - "metadata": {}, - "outputs": [], - "source": [ - "LOGSDIR = Path(\"/home/cec/logs/rl/os\")\n", - "\n", - "models = models_from_paths([LOGSDIR])\n", - "\n", - "def plot(model, **linestyle):\n", - " df = model.dataframe\n", - " for trial_name in reversed(sorted(set(df.trial_name.values))):\n", - " sdf = df[df[\"trial_name\"] == trial_name]\n", - " \n", - " trial_name = {\n", - " \"os-instcount_hist-R0\": \"InstCount w. hist\",\n", - " \"os-autophase_hist-R0\": \"Autophase w. hist\",\n", - " \"os-instcount-R0\": \"InstCount\",\n", - " \"os-autophase-R0\": \"Autophase\",\n", - " }.get(trial_name, trial_name)\n", - "\n", - " Y = sdf[\"evaluation/episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=5)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name}\", **linestyle)\n", - " \n", - "plot(models[1], color=\"#b21aff\")\n", - "plot(models[3], color=\"#b21aff\", linestyle=\"--\")\n", - "plot(models[0], color=\"#ffb31a\")\n", - "plot(models[2], color=\"#ffb31a\", linestyle=\"--\")\n", - "\n", - "plt.xlabel(\"#. training episodes (log)\")\n", - "plt.ylabel(\"Mean codesize reduction\")\n", - "plt.gca().legend(loc=\"lower right\", ncol=2)\n", - "\n", - "# Log:\n", - "plt.gca().set_xscale('log')\n", - "plt.xlim((1000, 100000))\n", - "# plt.ylim((0.8, 1.1))\n", - "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", - "\n", - "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", - "plt.gcf().set_size_inches(5, 2.2)\n", - "\n", - "plt.savefig('/home/cec/Dropbox/Inbox/rl-os.pdf', dpi=300, bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2d59df5-4487-456f-8a50-233e41d2e748", - "metadata": {}, - "outputs": [], - "source": [ - "LOGSDIR = Path(\"/home/cec/logs/rl/ts\")\n", - "\n", - "models = models_from_paths([LOGSDIR])\n", - "\n", - "for model in models:\n", - " df = model.dataframe\n", - " for trial_name in set(df.trial_name.values):\n", - " sdf = df[df[\"trial_name\"] == trial_name]\n", - " \n", - " trial_name = {\n", - " \"ts-C0-R0\": \"Github\",\n", - " \"ts-C1-R0\": \"TensorFlow\",\n", - " \"ts-C2-R0\": \"Linux\",\n", - " }.get(trial_name, trial_name)\n", - "\n", - " # Y = sdf[\"evaluation/episode_reward_mean\"]\n", - " Y = sdf[\"episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=5)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name}\")\n", - " \n", - "plt.xlabel(\"#. training episodes\")\n", - "plt.ylabel(\"Mean codesize reduction\")\n", - "plt.gca().legend(loc=\"lower right\", ncol=2)\n", - "\n", - "# Log:\n", - "plt.gca().set_xscale('log')\n", - "plt.xlim((1000, 100000))\n", - "# plt.ylim((0.8, 1.1))\n", - "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", - "\n", - "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", - "plt.gcf().set_size_inches(5, 2.5)\n", - "\n", - "plt.savefig('/home/cec/Dropbox/Inbox/rl-os.pdf', dpi=300, bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0339dbdc-c179-4fc9-b89b-0b31de86de8b", - "metadata": {}, - "outputs": [], - "source": [ - "LOGSDIR = Path(\"/home/cec/logs/rl/tss\")\n", - "models = models_from_paths([LOGSDIR])\n", - "\n", - "for model, color in zip(models, [\"k\", \"green\", \"blue\"]):\n", - " df = model.dataframe\n", - " for trial_name in set(df.trial_name.values):\n", - " sdf = df[df[\"trial_name\"] == trial_name]\n", - " \n", - " trial_name = {\n", - " \"algo-impala-R0\": \"IMPALA\",\n", - " \"algo-ppo-R0\": \"PPO\",\n", - " \"algo-a2c-R0\": \"A2C\",\n", - " }.get(trial_name, trial_name)\n", - " \n", - " sigma=20\n", - " \n", - " Y = sdf[\"episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=sigma)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\", linestyle=\"--\", color=color)\n", - " \n", - " Y = sdf[\"evaluation/episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=sigma)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\", color=color)\n", - " \n", - "plt.xlabel(\"#. training episodes\")\n", - "plt.ylabel(\"Mean codesize reduction\")\n", - "plt.gca().legend(ncol=6, loc=\"lower right\")\n", - "\n", - "# Log:\n", - "# plt.gca().set_xscale('log')\n", - "plt.xlim((5000, 100000))\n", - "plt.ylim((None, 1.2))\n", - "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", - "\n", - "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", - "plt.gcf().set_size_inches(14, 3)\n", - "\n", - "plt.savefig('/home/cec/Dropbox/Inbox/rl-algo.pdf', dpi=300, bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d389cc72-8a28-445f-b2eb-0d3c9a37844e", - "metadata": {}, - "outputs": [], - "source": [ - "LOGSDIR = Path(\"/home/cec/logs/rl/os\")\n", - "\n", - "models = models_from_paths([LOGSDIR])\n", - "\n", - "for model in models:\n", - " df = model.dataframe\n", - " for trial_name in set(df.trial_name.values):\n", - " sdf = df[df[\"trial_name\"] == trial_name]\n", - " \n", - " trial_name = {\n", - " \"tss-C0-R0\": \"1e+05\",\n", - " \"tss-C1-R0\": \"1e+04\",\n", - " \"tss-C2-R0\": \"1e+03\",\n", - " \"tss-C3-R0\": \"1e+02\",\n", - " }.get(trial_name, trial_name)\n", - " \n", - " Y = sdf[\"episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Train\")\n", - " \n", - " Y = sdf[\"evaluation/episode_reward_mean\"]\n", - " Y = scipy.ndimage.gaussian_filter(Y, sigma=2)\n", - " plt.plot(sdf[\"episodes_total\"], Y, label=f\"{trial_name} Val\")\n", - " \n", - "plt.xlabel(\"#. training episodes\")\n", - "plt.ylabel(\"Mean codesize reduction\")\n", - "plt.gca().legend(loc=\"lower right\")\n", - "\n", - "# Log:\n", - "plt.gca().set_xscale('log')\n", - "plt.xlim((1000, 100000))\n", - "# plt.ylim((0.8, 1.1))\n", - "plt.hlines(y=1, xmin=0, xmax=100000, linestyle=\"--\", color=\"k\", linewidth=.7)\n", - "\n", - "plt.gca().xaxis.set_major_formatter(mtick.FormatStrFormatter('%.0e'))\n", - "plt.gcf().set_size_inches(5, 3)\n", - "\n", - "plt.savefig('/home/cec/Dropbox/Inbox/rl-training-set-size.pdf', dpi=300, bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "91b91b4c-8ebe-42e5-b6ee-73e8e1757872", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From fdd227ef97c49e5236f6bcb7a46949aecd6eeee3 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Tue, 16 Nov 2021 17:55:14 +0000 Subject: [PATCH 236/254] [ci] Workaround error on first DGL import. --- .../actions/install-runtime-dependencies/action.yaml | 7 +++++++ .github/workflows/ci.yaml | 12 ++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/actions/install-runtime-dependencies/action.yaml b/.github/actions/install-runtime-dependencies/action.yaml index a6fd4cc77..4382cc6f0 100644 --- a/.github/actions/install-runtime-dependencies/action.yaml +++ b/.github/actions/install-runtime-dependencies/action.yaml @@ -10,3 +10,10 @@ runs: brew install zlib fi shell: bash + + # DGL creates ~/.dgl on first run and I have found that this will fail + # if run from pytest / bazel. Suppress errors if DGL is not installed. + - name: Initialize DGL + run: | + python -c 'import dgl; print(dgl.__version__)' || true + shell: bash diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bb10ba6af..305527009 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -449,12 +449,12 @@ jobs: - name: Install wheel run: python -m pip install *.whl - - name: Install runtime dependencies - uses: ./.github/actions/install-runtime-dependencies - - name: Install test dependencies run: python -m pip install -r examples/requirements.txt -r tests/requirements.txt + - name: Install runtime dependencies + uses: ./.github/actions/install-runtime-dependencies + - name: Run the test suite run: make examples-test @@ -484,12 +484,12 @@ jobs: - name: Install wheel run: python -m pip install *.whl - - name: Install runtime dependencies - uses: ./.github/actions/install-runtime-dependencies - - name: Install test dependencies run: python -m pip install -r examples/requirements.txt -r tests/requirements.txt + - name: Install runtime dependencies + uses: ./.github/actions/install-runtime-dependencies + - name: Run the test suite run: make examples-test From 269b498f000edfaf758011abf69fdf4ce3bee016 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 01:37:10 +0000 Subject: [PATCH 237/254] [examples] Remove locks from test routine. --- examples/llvm_rl/model/model.py | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/examples/llvm_rl/model/model.py b/examples/llvm_rl/model/model.py index f311c81c1..68526d50e 100644 --- a/examples/llvm_rl/model/model.py +++ b/examples/llvm_rl/model/model.py @@ -11,12 +11,10 @@ import pandas as pd import ray import yaml -from fasteners import InterProcessLock from pydantic import BaseModel, Field from ray import tune from compiler_gym.util.executor import Executor -from compiler_gym.util.logging import init_logging from compiler_gym.util.shell_format import indent, plural from compiler_gym.util.statistics import geometric_mean @@ -143,11 +141,6 @@ def test(self) -> None: test_dir = checkpoint.parent.parent assert (test_dir / "progress.csv").is_file() - # Make sure there aren't any other test jobs. Don't block on error, - # just fail. - lock = InterProcessLock(test_dir / ".test-lock") - lock.acquire(blocking=False) - # Try not to have to launch a job. if (test_dir / "test-meta.json").is_file(): with open(test_dir / "test-meta.json") as f: @@ -159,7 +152,7 @@ def test(self) -> None: ) continue - jobs.append((lock, checkpoint, test_dir)) + jobs.append((checkpoint, test_dir)) # Submit all the jobs now. with self.executor.get_executor( @@ -169,11 +162,7 @@ def test(self) -> None: # Single threaded evaluation loop. cpus=2, ) as executor: - for lock, checkpoint, test_dir in jobs: - # Let go of the test lock. This begins the section of code where - # races can occur if someone else comes along and grabs the lock - # before the test job can take it over. - lock.release() + for checkpoint, test_dir in jobs: executor.submit( test_job, model=self, checkpoint=checkpoint, outputs_dir=test_dir ) @@ -371,12 +360,6 @@ class Config: def test_job(model: Model, checkpoint: Path, outputs_dir: Path) -> None: - init_logging() - - # Make sure there aren't any other test jobs. Don't block on error, - # just fail. - InterProcessLock(outputs_dir / ".test-lock").acquire(blocking=False) - logger.info( "Initializing ray with 2 cpus and %d GPUs", model.executor.gpus, @@ -437,8 +420,6 @@ def test_job(model: Model, checkpoint: Path, outputs_dir: Path) -> None: def train_job(model: Model, seed: int, replica_id: int) -> None: - init_logging() - logger.info( "Initializing ray with %d %s and %d %s", model.executor.cpus, From cbbb57b682bc223b48d55d9b067b546c443886d4 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Mon, 15 Nov 2021 13:12:26 +0000 Subject: [PATCH 238/254] [Makefile] Run `pip uninstall` before `pip install`. This is to reduce the risk of a pip-installed version of CompilerGym from co-existing with the version installed by `make install`. This can lead to the incorrect version being used and cryptic errors, for example see #483. --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7e27928df..8672909e7 100644 --- a/Makefile +++ b/Makefile @@ -354,7 +354,10 @@ post-install-test: # Installation # ################ -pip-install: +# We run uninstall as a dependency of install to prevent conflicting +# CompilerGym versions co-existing in the same Python environment. + +pip-install: uninstall $(PYTHON) setup.py install install: | init-runtime-requirements bazel-build pip-install From b7416a4c25f721e407fe1388c7dfed8ad74e13ea Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 11:56:06 +0000 Subject: [PATCH 239/254] [tests] Mark flaky loop_tool tests. --- tests/loop_tool/actions_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/loop_tool/actions_test.py b/tests/loop_tool/actions_test.py index 103c71924..a852d84d7 100644 --- a/tests/loop_tool/actions_test.py +++ b/tests/loop_tool/actions_test.py @@ -6,11 +6,13 @@ import loop_tool_py as lt import pytest +from flaky import flaky import compiler_gym from tests.test_main import main +@flaky @pytest.mark.parametrize("backend", lt.backends()) def test_basic(backend): with compiler_gym.make("loop_tool-v0") as env: @@ -33,6 +35,7 @@ def test_basic(backend): print(o) +@flaky @pytest.mark.parametrize("backend", lt.backends()) def test_rand(backend): with compiler_gym.make("loop_tool-v0") as env: @@ -53,6 +56,7 @@ def test_rand(backend): print(best) +@flaky @pytest.mark.parametrize("backend", lt.backends()) def test_induced_remainder(backend): with compiler_gym.make("loop_tool-v0") as env: @@ -91,6 +95,7 @@ def test_induced_remainder(backend): assert out == expected.strip(), f"{out} \n vs \n {expected.strip()}" +@flaky @pytest.mark.parametrize("backend", lt.backends()) def test_thread_removal(backend): with compiler_gym.make("loop_tool-v0") as env: @@ -121,6 +126,7 @@ def test_thread_removal(backend): assert out == expected.strip(), f"{out} \n vs \n {expected.strip()}" +@flaky @pytest.mark.parametrize("backend", lt.backends()) def test_thread_addition(backend): with compiler_gym.make("loop_tool-v0") as env: From a200ec3a68b6caa33165a686ea37ad73ce571a9e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 12:22:36 +0000 Subject: [PATCH 240/254] [examples] Don't adjust timeout for tests. --- examples/llvm_rl/model/model.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/llvm_rl/model/model.py b/examples/llvm_rl/model/model.py index 68526d50e..d77f3b3f2 100644 --- a/examples/llvm_rl/model/model.py +++ b/examples/llvm_rl/model/model.py @@ -157,8 +157,7 @@ def test(self) -> None: # Submit all the jobs now. with self.executor.get_executor( logs_dir=self.working_directory / "slurm", - # Provision an extra hour for RLlib overhead. - timeout_hours=self.testing.timeout_hours + 1, + timeout_hours=self.testing.timeout_hours, # Single threaded evaluation loop. cpus=2, ) as executor: From 59821e7ee6650759741073e4693e28c6f92449cf Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 12:28:24 +0000 Subject: [PATCH 241/254] [llvm] Default to a single observation for runtime. --- compiler_gym/envs/llvm/service/Benchmark.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler_gym/envs/llvm/service/Benchmark.h b/compiler_gym/envs/llvm/service/Benchmark.h index eb1dc34d5..83ab25b36 100644 --- a/compiler_gym/envs/llvm/service/Benchmark.h +++ b/compiler_gym/envs/llvm/service/Benchmark.h @@ -33,13 +33,13 @@ using Bitcode = llvm::SmallString<0>; /** The number of times a benchmark is executed. This can be overriden using * the "llvm.set_runtimes_per_observation_count" session parameter. */ -constexpr int kDefaultRuntimesPerObservationCount = 30; +constexpr int kDefaultRuntimesPerObservationCount = 1; /** The default number of warmup runs that a benchmark is executed before measuring the runtimes. * This can be overriden using the "llvm.set_warmup_runs_count_per_runtime_observation" session * parameter. */ -constexpr int kDefaultWarmupRunsPerRuntimeObservationCount = 5; +constexpr int kDefaultWarmupRunsPerRuntimeObservationCount = 0; /** The number of times a benchmark is built. This can be overriden using * the "llvm.set_buildtimes_per_observation_count" session parameter. From 62d6a8007d0d1abcdadb08aca28986ab8e34e59b Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 12:45:41 +0000 Subject: [PATCH 242/254] [examples] Quieter OpenTuner environment. --- examples/llvm_autotuning/autotuners/opentuner_.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/llvm_autotuning/autotuners/opentuner_.py b/examples/llvm_autotuning/autotuners/opentuner_.py index e579e62b1..2e9fed922 100644 --- a/examples/llvm_autotuning/autotuners/opentuner_.py +++ b/examples/llvm_autotuning/autotuners/opentuner_.py @@ -186,7 +186,9 @@ def run(self, desired_result, input, limit): str(self.tmp_optimized_path), ] cmd += self.serialize_flags(desired_result.configuration.data) - subprocess.check_call(cmd, timeout=300) + subprocess.check_call( + cmd, timeout=300, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL + ) except (subprocess.CalledProcessError, subprocess.TimeoutExpired): return Result(time=float("inf")) From 2394c723ec0631f32a3c5094c7e2cafc487a5d02 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 12:45:59 +0000 Subject: [PATCH 243/254] [llvm] Preserve stack trace on unicode error. --- compiler_gym/envs/llvm/compute_observation.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler_gym/envs/llvm/compute_observation.py b/compiler_gym/envs/llvm/compute_observation.py index ba4a820f4..c73998356 100644 --- a/compiler_gym/envs/llvm/compute_observation.py +++ b/compiler_gym/envs/llvm/compute_observation.py @@ -108,7 +108,9 @@ def compute_observation( try: stdout = stdout.decode("utf-8") except UnicodeDecodeError as e: - raise ValueError(f"Failed to parse {observation_space.id} observation: {e}") + raise ValueError( + f"Failed to parse {observation_space.id} observation: {e}" + ) from e observation = Observation() try: From 47b94d2b461007b94608a31d097ce3a3f8c81893 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 13:00:24 +0000 Subject: [PATCH 244/254] [examples] OpenTuner search tweaks. --- .../llvm_autotuning/autotuners/opentuner_.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/examples/llvm_autotuning/autotuners/opentuner_.py b/examples/llvm_autotuning/autotuners/opentuner_.py index 2e9fed922..3850de8aa 100644 --- a/examples/llvm_autotuning/autotuners/opentuner_.py +++ b/examples/llvm_autotuning/autotuners/opentuner_.py @@ -6,15 +6,21 @@ import subprocess import tempfile import warnings +from pathlib import Path +import numpy as np +from llvm_autotuning.optimization_target import OptimizationTarget + +from compiler_gym.envs import CompilerEnv +from compiler_gym.envs.llvm import compute_observation from compiler_gym.service.connection import ServiceError +from compiler_gym.third_party.llvm import opt_path +from compiler_gym.util.runfiles_path import transient_cache_path # Ignore import deprecation warnings from opentuner. warnings.filterwarnings("ignore", category=DeprecationWarning) -import numpy as np # noqa: E402 -import opentuner as os # noqa: E402 -from llvm_autotuning.optimization_target import OptimizationTarget # noqa: E402 +import opentuner as ot # noqa: E402 from opentuner import ( # noqa: E402 ConfigurationManipulator, MeasurementInterface, @@ -25,11 +31,6 @@ from opentuner.search.manipulator import BooleanParameter # noqa: E402 from opentuner.tuningrunmain import TuningRunMain # noqa: E402 -from compiler_gym.envs import CompilerEnv # noqa: E402 -from compiler_gym.envs.llvm import compute_observation # noqa: E402 -from compiler_gym.third_party.llvm import opt_path # noqa: E402 -from compiler_gym.util.runfiles_path import transient_cache_path # noqa: E402 - def opentuner_ga( env: CompilerEnv, @@ -52,7 +53,7 @@ def opentuner_ga( cache_dir = transient_cache_path("llvm_autotuning") cache_dir.mkdir(exist_ok=True, parents=True) with tempfile.TemporaryDirectory(dir=cache_dir, prefix="opentuner-") as tmpdir: - argparser = os.default_argparser() + argparser = ot.default_argparser() args = argparser.parse_args( args=[ f"--stop-after={search_time_seconds}", @@ -63,7 +64,7 @@ def opentuner_ga( "--parallelism=1", ] ) - os.search.technique.register( + ot.search.technique.register( BinaryGA( population=population, tournament=tournament, @@ -181,14 +182,16 @@ def run(self, desired_result, input, limit): # Run opt to produce an optimized bitcode file. cmd = [ self.opt, - str(self.unoptimized_path), + self.unoptimized_path, "-o", - str(self.tmp_optimized_path), + self.tmp_optimized_path, ] cmd += self.serialize_flags(desired_result.configuration.data) subprocess.check_call( cmd, timeout=300, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) + if not Path(self.tmp_optimized_path).is_file(): + return Result(time=float("inf")) except (subprocess.CalledProcessError, subprocess.TimeoutExpired): return Result(time=float("inf")) From bf2629d2cb461a262f574c25db16306e3278bc9c Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 13:07:04 +0000 Subject: [PATCH 245/254] [examples] Don't loop infinitely on reset() error. --- examples/llvm_autotuning/experiment.py | 19 ++++++++++-------- .../llvm_autotuning/just_keep_going_env.py | 20 +++++++++++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/examples/llvm_autotuning/experiment.py b/examples/llvm_autotuning/experiment.py index 968ab62cd..0f37d499f 100644 --- a/examples/llvm_autotuning/experiment.py +++ b/examples/llvm_autotuning/experiment.py @@ -165,11 +165,14 @@ class Config: def _experiment_worker( autotuner: Autotuner, benchmark: str, results_path: Path, seed: int ) -> None: - with autotuner.optimization_target.make_env(benchmark) as env: - env.seed(seed) - env.action_space.seed(seed) - state = autotuner(env, seed=seed) - - logger.info("State %s", state) - with CompilerEnvStateWriter(open(results_path, "w")) as writer: - writer.write_state(state, flush=True) + try: + with autotuner.optimization_target.make_env(benchmark) as env: + env.seed(seed) + env.action_space.seed(seed) + state = autotuner(env, seed=seed) + + logger.info("State %s", state) + with CompilerEnvStateWriter(open(results_path, "w")) as writer: + writer.write_state(state, flush=True) + except Exception as e: # pylint: disable=broad-except + logger.warning("Autotuner failed on benchmark %s: %s", benchmark, e) diff --git a/examples/llvm_autotuning/just_keep_going_env.py b/examples/llvm_autotuning/just_keep_going_env.py index c7da6952f..8756949d7 100644 --- a/examples/llvm_autotuning/just_keep_going_env.py +++ b/examples/llvm_autotuning/just_keep_going_env.py @@ -12,8 +12,8 @@ # TODO(github.com/facebookresearch/CompilerGym/issues/469): Once step() and # reset() no longer raise exceptions than this wrapper class can be removed. class JustKeepGoingEnv(CompilerEnvWrapper): - """This wrapper class prevents the step(), reset(), or close() methods from - raising an exception. + """This wrapper class prevents the step() and close() methods from raising + an exception. Just keep swimming ... |\\ o @@ -56,12 +56,16 @@ def step(self, *args, **kwargs): return default_observation, default_reward, True, {"error_details": str(e)} def reset(self, *args, **kwargs): - try: - return super().reset(*args, **kwargs) - except Exception as e: # pylint: disable=broad-except - logger.warning("reset() error, retrying: %s", e) - self.close() - return self.reset(*args, **kwargs) + for _ in range(5): + try: + return super().reset(*args, **kwargs) + except Exception as e: # pylint: disable=broad-except + logger.warning("reset() error, retrying: %s", e) + self.close() + return self.reset(*args, **kwargs) + + # No more retries. + return super().reset(*args, **kwargs) def close(self): try: From c81c9da32dd36bcb4aaaee28acb161d2dc5b7744 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 13:16:53 +0000 Subject: [PATCH 246/254] [util] Fix datetime format string. --- compiler_gym/util/logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler_gym/util/logging.py b/compiler_gym/util/logging.py index 48bbf8050..79cb5eef8 100644 --- a/compiler_gym/util/logging.py +++ b/compiler_gym/util/logging.py @@ -14,7 +14,7 @@ def init_logging(level: int = logging_.INFO, logger: Optional[logging_.Logger] = handler = logging_.StreamHandler(sys.stdout) handler.setLevel(level) formatter = logging_.Formatter( - fmt="%(asctime)s %(name)s] %(message)s", datefmt="%M%d %H:%m:%S" + fmt="%(asctime)s %(name)s] %(message)s", datefmt="%m%d %H:%M:%S" ) handler.setFormatter(formatter) logger.addHandler(handler) From 5b3e0bca32b45ee1e5526c7c50c33826fdd7317e Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 13:27:34 +0000 Subject: [PATCH 247/254] [examples] Temporarily skip failing test on CI. Issue #487. --- examples/llvm_rl/tests/training_integration_test.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/llvm_rl/tests/training_integration_test.py b/examples/llvm_rl/tests/training_integration_test.py index 67c44b239..d45ad509c 100644 --- a/examples/llvm_rl/tests/training_integration_test.py +++ b/examples/llvm_rl/tests/training_integration_test.py @@ -3,6 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import json +import os import sys import warnings from pathlib import Path @@ -73,6 +74,10 @@ def test_local_train(tmp_path: Path): / "checkpoint-1" ).is_file() + # TODO(github.com/facebookresearch/CompilerGym/issues/487): Fix test on CI. + if os.environ.get("CI", "") != "": + return + model.test() print( "Trail files", From 896374696b04bc11cfa6c56ec2669f237b184270 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 14:39:07 +0000 Subject: [PATCH 248/254] [tests] Update runtime observation space test. --- tests/llvm/observation_spaces_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 449698911..555be3f4b 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -1218,8 +1218,8 @@ def test_runtime_observation_space(env: LlvmEnv): value: np.ndarray = env.observation[key] print(value.tolist()) # For debugging in case of error. assert isinstance(value, np.ndarray) - assert env.runtime_observation_count == 30 - assert value.shape == (30,) + assert env.runtime_observation_count == 1 + assert value.shape == (1,) assert not space.deterministic assert space.platform_dependent From d7379a16900b6af34f2940fb9ed7d26c54830f7a Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 15:28:17 +0000 Subject: [PATCH 249/254] [examples] Update README. --- examples/README.md | 44 +++++++++++++++++++++++++++++++++++++ examples/loop_tool_sweep.py | 1 + 2 files changed, 45 insertions(+) diff --git a/examples/README.md b/examples/README.md index 4d17e63ff..12457f46a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -23,6 +23,9 @@ you think is missing? If so, please [contribute](/CONTRIBUTING.md)! - [Miscellaneous](#miscellaneous) - [Exhaustive search of bounded action spaces](#exhaustive-search-of-bounded-action-spaces) - [Estimating the immediate and cumulative reward of actions and benchmarks](#estimating-the-immediate-and-cumulative-reward-of-actions-and-benchmarks) + - [Sweeping the inner loop size of CUDA loop nests](#sweeping-the-inner-loop-size-of-cuda-loop-nests) + - [Micro-benchmarking environment operation times](#micro-benchmarking-environment-operation-times) + - [Supervised graph learning to estimate LLVM IR instruction count](#supervised-graph-learning-to-estimate-llvm-ir-instruction-count) ## Autotuning @@ -233,3 +236,44 @@ environment parameters: This script estimates the cumulative reward for a random episode on a benchmark by running trials. A trial is an episode in which a random number of random actions are performed and the total cumulative reward is recorded. + + +### Sweeping the inner loop size of CUDA loop nests + +The script [loop_tool_sweep.py](loop_tool_sweep.py) demonstrates using the +`loop_tool-v0` environment to sweep the inner loop size of a loop nest. For +details run `python loop_tool_sweep.py --help`. + + +### Micro-benchmarking environment operation times + +The script [op_benchmarks.py](op_benchmarks.py) is used to benchmark the various +operation types of CompilerGym environments. To collect new measurements, run +one of the following commands: + +``` +python -m op_benchmarks {run,init,reset,step,observations} --env= --n= +``` + +where `--env` is the environment to benchmark and `--n` is the number of +measurements of each operation to gather. For example: + +``` +python -m op_benchmarks run --env=llvm-v0 --n=100 +``` + +Aggregate and print measurements using: + +``` +python -m op_benchmarks info +``` + +See `python op_benchmarks.py --help` for more details. + + +### Supervised graph learning to estimate LLVM IR instruction count + +The script [gnn_cost_model/train.py](gnn_cost_model/train.py) demonstrates how +to train a cost model with a GNN on a LLVM-IR transition database predicting +some output reward (the default is instruction count). See `python +gnn_cost_model/train.py --help` for more details. diff --git a/examples/loop_tool_sweep.py b/examples/loop_tool_sweep.py index bd63a40b1..eb2e78ba5 100644 --- a/examples/loop_tool_sweep.py +++ b/examples/loop_tool_sweep.py @@ -2,6 +2,7 @@ # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +"""Sweep the inner loop size of CUDA loop nests.""" import logging from itertools import product from pathlib import Path From 7d18d6999913d1b93a0517932171314df5267fef Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 15:34:45 +0000 Subject: [PATCH 250/254] [ci] Force python3 for DGL import. --- .github/actions/install-runtime-dependencies/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/install-runtime-dependencies/action.yaml b/.github/actions/install-runtime-dependencies/action.yaml index 4382cc6f0..7b2fad2cf 100644 --- a/.github/actions/install-runtime-dependencies/action.yaml +++ b/.github/actions/install-runtime-dependencies/action.yaml @@ -15,5 +15,5 @@ runs: # if run from pytest / bazel. Suppress errors if DGL is not installed. - name: Initialize DGL run: | - python -c 'import dgl; print(dgl.__version__)' || true + python3 -c 'import dgl; print(dgl.__version__)' || true shell: bash From 5954873f0e9a68cc7dd9153fc3673ae3c87f3895 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 16:02:02 +0000 Subject: [PATCH 251/254] Release v0.2.1 Highlights of this release include: - [Complex and composite action spaces] Added a new schema for describing action spaces. This complete overhaul enables a much richer set of actions to be exposed, such as composite actions spaces, dictionaries, and continuous actions. - [State Transition Dataset] We have released the first iteration of the state transition dataset, a large collection of (state,action,reward) tuples for the LLVM environments, suitable for large-scale supervised learning. We have added an example learned cost model using a graph neural network in examples/gnn_cost_model, (thanks @bcui19!). - [New examples] We have added several new examples to the examples/ directory, including a new loop unrolling demo based on LLVM, (thanks @mostafaelhoushi!), a loop tool demo (thanks @bwasti!), micro-benchmarks for operations, and example reinforcement learning scripts. See `examples/README.md` for details. We also overhauled the example compiler gym service. - [New logo] Thanks Christy for designing a great new logo for CompilerGym! - [llvm] Added a new Bitcode observation space. - Numerous bug fixes and improvements. Deprecations and breaking changes: - [Backend API change] Out-of-tree compiler services will require updating to the new action space API. - The env.observation.add_derived_space() method has been deprecated and will be removed in a future release. Please use the new derived_observation_spaces argument to the CompilerEnv constructor. - The compiler_gym.utils.logs module has been deprecated. Use compiler_gym.utils.runfiles_path instead. - The compiler_gym.replay_search module has been deprecated and merged into the compiler_gym.random_search. --- CHANGELOG.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ CITATION.cff | 4 ++-- VERSION | 2 +- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acafa886c..fcfd70b6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,52 @@ +## Release 0.2.1 (2021-11-17) + +Highlights of this release include: + +- **[Complex and composite action spaces]** Added a new schema for describing + action spaces + ([#369](https://github.com/facebookresearch/CompilerGym/pull/369)). This + complete overhaul enables a much richer set of actions to be exposed, such as + composite actions spaces, dictionaries, and continuous actions. +- **[State Transition Dataset]** We have released the first iteration of the + state transition dataset, a large collection of (state,action,reward) tuples + for the LLVM environments, suitable for large-scale supervised learning. We + have added an example learned cost model using a graph neural network in + `examples/gnn_cost_model` + ([#484](https://github.com/facebookresearch/CompilerGym/pull/484), thanks + @bcui19!). +- **[New examples]** We have added several new examples to the `examples/` + directory, including a new loop unrolling demo based on LLVM + ([#477](https://github.com/facebookresearch/CompilerGym/pull/477), thanks + @mostafaelhoushi!), a loop tool demo + ([#457](https://github.com/facebookresearch/CompilerGym/pull/457), thanks + @bwasti!), micro-benchmarks for operations, and example reinforcement learning + scripts ([#484](https://github.com/facebookresearch/CompilerGym/pull/484)). + See `examples/README.md` for details. We also overhauled the example compiler + gym service + ([#467](https://github.com/facebookresearch/CompilerGym/pull/467)). +- **[New logo]** Thanks Christy for designing a great new logo for CompilerGym! + ([#471](https://github.com/facebookresearch/CompilerGym/pull/471)) +- **[llvm]** Added a new `Bitcode` observation space + ([#442](https://github.com/facebookresearch/CompilerGym/pull/442)). +- Numerous bug fixes and improvements. + +Deprecations and breaking changes: + +- **[Backend API change]** Out-of-tree compiler services will require updating + to the new action space API + ([#369](https://github.com/facebookresearch/CompilerGym/pull/369)). +- The `env.observation.add_derived_space()` method has been deprecated and will + be removed in a future release. Please use the new + `derived_observation_spaces` argument to the `CompilerEnv` constructor + ([#463](https://github.com/facebookresearch/CompilerGym/pull/463)). +- The `compiler_gym.utils.logs` module has been deprecated. Use + `compiler_gym.utils.runfiles_path` instead + ([#453](https://github.com/facebookresearch/CompilerGym/pull/453)). +- The `compiler_gym.replay_search` module has been deprecated and merged into + the `compiler_gym.random_search` + ([#453](https://github.com/facebookresearch/CompilerGym/pull/453)). + + ## Release 0.2.0 (2021-09-28) This release adds two new compiler optimization problems to CompilerGym: GCC diff --git a/CITATION.cff b/CITATION.cff index 3cbeaa34c..86152b1e1 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -31,8 +31,8 @@ authors: - family-names: "Leather" given-names: "Hugh" title: "CompilerGym" -version: 0.2.0 -date-released: 2021-09-28 +version: 0.2.1 +date-released: 2021-11-17 url: "https://github.com/facebookresearch/CompilerGym" preferred-citation: type: article diff --git a/VERSION b/VERSION index 0ea3a944b..0c62199f1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.0 +0.2.1 From 028df83aae1116f8fc6a5ec8cd5a767455310718 Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 16:08:57 +0000 Subject: [PATCH 252/254] [docs] Fix GCC URL. --- docs/source/compiler_gym/envs/gcc.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/compiler_gym/envs/gcc.rst b/docs/source/compiler_gym/envs/gcc.rst index 8b33a7485..996be3c93 100644 --- a/docs/source/compiler_gym/envs/gcc.rst +++ b/docs/source/compiler_gym/envs/gcc.rst @@ -2,7 +2,7 @@ compiler_gym.envs.gcc ====================== The :code:`compiler_gym.envs.gcc` module contains datasets and API extensions -for the :doc:`GCC Environments `. See :class:`GccEnv +for the :doc:`GCC Environments `. See :class:`GccEnv ` for the class definition. .. contents:: Document contents: From 5e94e645fd69c45bb2ae66f3cba8fbb3c7493afc Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Wed, 17 Nov 2021 16:56:07 +0000 Subject: [PATCH 253/254] [tests] Fix set size test. --- tests/llvm/observation_spaces_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/llvm/observation_spaces_test.py b/tests/llvm/observation_spaces_test.py index 555be3f4b..2d1751aaf 100644 --- a/tests/llvm/observation_spaces_test.py +++ b/tests/llvm/observation_spaces_test.py @@ -1229,8 +1229,6 @@ def test_runtime_observation_space(env: LlvmEnv): for buildtime in value: assert buildtime > 0 - assert len(set(value)) > 1 - @pytest.mark.xfail( sys.platform == "darwin", From f3e4a084044fda1633a9b6dec04798e18ed2013f Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Thu, 18 Nov 2021 03:00:43 +0000 Subject: [PATCH 254/254] [ci] Install runtime deps after test deps. --- .github/workflows/build.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b42c7a34b..c97c7bb4d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -87,11 +87,11 @@ jobs: python -m pip install compiler_gym-*-manylinux*.whl fi - - name: Install runtime dependencies - uses: ./.github/actions/install-runtime-dependencies - - name: Install test dependencies run: python -m pip install -r examples/requirements.txt -r tests/requirements.txt + - name: Install runtime dependencies + uses: ./.github/actions/install-runtime-dependencies + - name: Run the examples tests run: make examples-test